From 6267713f9f5d831e8a1c7bc07f6ede6f304c6fa7 Mon Sep 17 00:00:00 2001 From: Andreas Svanberg Date: Tue, 21 Jan 2025 14:32:49 +0100 Subject: [PATCH] Allow filtering issues by any assignee This is the opposite of the "No assignee" filter. It will match all issues that have at least one assignee. --- models/db/search.go | 5 +++++ models/issues/issue_search.go | 2 ++ options/locale/locale_en-US.ini | 1 + templates/repo/issue/filter_item_user_assign.tmpl | 4 ++++ templates/repo/issue/filter_list.tmpl | 1 + 5 files changed, 13 insertions(+) diff --git a/models/db/search.go b/models/db/search.go index e0a1b6bde9..fa72959fa5 100644 --- a/models/db/search.go +++ b/models/db/search.go @@ -30,6 +30,11 @@ const ( // eg: "milestone_id=-1" means "find the items without any milestone. const NoConditionID int64 = -1 +// AnyConditionID means a condition to filter the records which match any id. +// The inverse of the above NoConditionID +// eg: "assignee_id=-2" means "find the issues with an assignee" +const AnyConditionID int64 = -2 + // NonExistingID means a condition to match no result (eg: a non-existing user) // It doesn't use -1 or -2 because they are used as builtin users. const NonExistingID int64 = -1000000 diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go index f1cd125d49..566905b200 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -359,6 +359,8 @@ func applyAssigneeCondition(sess *xorm.Session, assigneeID optional.Option[int64 } if assigneeID.Value() == db.NoConditionID { sess.Where("issue.id NOT IN (SELECT issue_id FROM issue_assignees)") + } else if assigneeID.Value() == db.AnyConditionID { + sess.Where("issue.id IN (SELECT issue_id FROM issue_assignees)") } else { sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id"). And("issue_assignees.assignee_id = ?", assigneeID.Value()) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 533eb136f9..4401660b8a 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1531,6 +1531,7 @@ issues.filter_project_none = No project issues.filter_assignee = Assignee issues.filter_assginee_no_select = All assignees issues.filter_assginee_no_assignee = No assignee +issues.filter_assignee_any_assignee = Any assignee issues.filter_poster = Author issues.filter_user_placeholder = Search users issues.filter_user_no_select = All users diff --git a/templates/repo/issue/filter_item_user_assign.tmpl b/templates/repo/issue/filter_item_user_assign.tmpl index 4f1db71d57..dd5d96319a 100644 --- a/templates/repo/issue/filter_item_user_assign.tmpl +++ b/templates/repo/issue/filter_item_user_assign.tmpl @@ -6,6 +6,7 @@ * TextFilterTitle * TextZeroValue: the text for "all issues" * TextNegativeOne: the text for "issues with no assignee" +* TextNegativeTwo: the text for "issues with any assignee" */}} {{$queryLink := .QueryLink}}