From 57c6f2cd10ff47b8b29526e15221e5618debd00e Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 29 Oct 2024 12:03:16 +0100 Subject: [PATCH] feat(filters): add "not in" operator for filters Resolves https://community.vikunja.io/t/feature-requests-regarding-view-ordering-project-reference-in-kanban-and-a-notin-operator/2728 --- .../project/partials/FilterInput.vue | 2 +- .../project/partials/FilterInputDocs.vue | 1 + frontend/src/helpers/filters.test.ts | 20 ++++++++++ frontend/src/helpers/filters.ts | 13 +++--- frontend/src/i18n/lang/en.json | 3 +- pkg/models/task_collection_filter.go | 13 ++++-- pkg/models/task_collection_filter_test.go | 12 ++++++ pkg/models/task_collection_test.go | 40 +++++++++++++++++++ pkg/models/task_search.go | 4 +- pkg/models/tasks.go | 2 + 10 files changed, 98 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/project/partials/FilterInput.vue b/frontend/src/components/project/partials/FilterInput.vue index 61a0281f4..8718a2227 100644 --- a/frontend/src/components/project/partials/FilterInput.vue +++ b/frontend/src/components/project/partials/FilterInput.vue @@ -133,7 +133,7 @@ const highlightedFilterQuery = computed(() => { } let labelTitles = [value.trim()] - if (operator === 'in' || operator === '?=') { + if (operator === 'in' || operator === '?=' || operator === 'not in' || operator === '?!=') { labelTitles = value.split(',').map(v => v.trim()) } diff --git a/frontend/src/components/project/partials/FilterInputDocs.vue b/frontend/src/components/project/partials/FilterInputDocs.vue index 01d09e212..d53c75ad8 100644 --- a/frontend/src/components/project/partials/FilterInputDocs.vue +++ b/frontend/src/components/project/partials/FilterInputDocs.vue @@ -45,6 +45,7 @@ const showDocs = ref(false)
  • <=: {{ $t('filters.query.help.operators.lessThanOrEqual') }}
  • like: {{ $t('filters.query.help.operators.like') }}
  • in: {{ $t('filters.query.help.operators.in') }}
  • +
  • not in: {{ $t('filters.query.help.operators.notIn') }}
  • {{ $t('filters.query.help.logicalOperators.intro') }}