diff --git a/frontend/src/lib/components/controls/TagInput.svelte b/frontend/src/lib/components/controls/TagInput.svelte
index 8870e9c..19581c6 100644
--- a/frontend/src/lib/components/controls/TagInput.svelte
+++ b/frontend/src/lib/components/controls/TagInput.svelte
@@ -1,7 +1,8 @@
diff --git a/frontend/src/lib/modals/SprintCreateUpdateModal.svelte b/frontend/src/lib/modals/SprintCreateUpdateModal.svelte
index 07c8590..05f588f 100644
--- a/frontend/src/lib/modals/SprintCreateUpdateModal.svelte
+++ b/frontend/src/lib/modals/SprintCreateUpdateModal.svelte
@@ -158,7 +158,7 @@
-
+
{#if sprint.kind != SprintKind.Items}
diff --git a/ports/mysql/items.go b/ports/mysql/items.go
index eb809db..953e622 100644
--- a/ports/mysql/items.go
+++ b/ports/mysql/items.go
@@ -215,17 +215,36 @@ func (r *itemRepository) Fetch(ctx context.Context, filter models.ItemFilter) ([
}
res = genutils.RetainInPlace(res, func(item entities.Item) bool {
+ good := false
+
for _, tag := range filter.Tags {
- if item.HasTag(tag) {
- return true
- } else if item.RequirementID != nil &&
- (genutils.Contains(requirementTagMap[*item.RequirementID], tag) ||
- genutils.Contains(projectTagMap[*item.ProjectID], tag)) {
- return true
+ if strings.HasPrefix(tag, "!") {
+ tag = tag[1:]
+
+ if !item.HasTag(tag) {
+ if item.RequirementID != nil {
+ if !genutils.Contains(requirementTagMap[*item.RequirementID], tag) &&
+ !genutils.Contains(projectTagMap[*item.ProjectID], tag) {
+ return false
+ }
+ } else {
+ return false
+ }
+ }
+
+ good = true
+ } else {
+ if item.HasTag(tag) {
+ good = true
+ } else if item.RequirementID != nil &&
+ (genutils.Contains(requirementTagMap[*item.RequirementID], tag) ||
+ genutils.Contains(projectTagMap[*item.ProjectID], tag)) {
+ good = true
+ }
}
}
- return false
+ return good
})
}