1
0

fix(filter): do not match join operator

Partial fix for https://kolaente.dev/vikunja/vikunja/issues/2194
This commit is contained in:
kolaente 2024-03-12 21:28:31 +01:00
parent 0e2ad5dde6
commit e44897e0d4
No known key found for this signature in database
GPG Key ID: F40E70337AB24C9B
2 changed files with 12 additions and 9 deletions

View File

@ -10,13 +10,15 @@ import User from '@/components/misc/user.vue'
import ProjectUserService from '@/services/projectUsers' import ProjectUserService from '@/services/projectUsers'
import {useProjectStore} from '@/stores/projects' import {useProjectStore} from '@/stores/projects'
import { import {
DATE_FIELDS,
ASSIGNEE_FIELDS, ASSIGNEE_FIELDS,
AUTOCOMPLETE_FIELDS, AUTOCOMPLETE_FIELDS,
AVAILABLE_FILTER_FIELDS, AVAILABLE_FILTER_FIELDS,
DATE_FIELDS,
FILTER_JOIN_OPERATOR, FILTER_JOIN_OPERATOR,
FILTER_OPERATORS, FILTER_OPERATORS,
FILTER_OPERATORS_REGEX, LABEL_FIELDS, getFilterFieldRegexPattern, FILTER_OPERATORS_REGEX,
getFilterFieldRegexPattern,
LABEL_FIELDS,
} from '@/helpers/filters' } from '@/helpers/filters'
const { const {
@ -110,9 +112,9 @@ const highlightedFilterQuery = computed(() => {
if (typeof value === 'undefined') { if (typeof value === 'undefined') {
value = '' value = ''
} }
let labelTitles = [value] let labelTitles = [value.trim()]
if(operator === 'in' || operator === '?=') { if (operator === 'in' || operator === '?=') {
labelTitles = value.split(',').map(v => v.trim()) labelTitles = value.split(',').map(v => v.trim())
} }
@ -122,7 +124,8 @@ const highlightedFilterQuery = computed(() => {
labelsHtml.push(`<span class="filter-query__label_value" style="background-color: ${label?.hexColor}; color: ${label?.textColor}">${label?.title ?? t}</span>`) labelsHtml.push(`<span class="filter-query__label_value" style="background-color: ${label?.hexColor}; color: ${label?.textColor}">${label?.title ?? t}</span>`)
}) })
return `${f} ${operator} ${labelsHtml.join(', ')}` const endSpace = value.endsWith(' ') ? ' ' : ''
return `${f} ${operator} ${labelsHtml.join(', ')}${endSpace}`
}) })
}) })
FILTER_OPERATORS FILTER_OPERATORS
@ -195,7 +198,7 @@ function handleFieldInput() {
const [matched, prefix, operator, space, keyword] = match const [matched, prefix, operator, space, keyword] = match
if (keyword) { if (keyword) {
let search = keyword let search = keyword
if(operator === 'in' || operator === '?=') { if (operator === 'in' || operator === '?=') {
const keywords = keyword.split(',') const keywords = keyword.split(',')
search = keywords[keywords.length - 1].trim() search = keywords[keywords.length - 1].trim()
} }
@ -348,7 +351,7 @@ function autocompleteSelect(value) {
resize: none; resize: none;
text-fill-color: transparent; text-fill-color: transparent;
-webkit-text-fill-color: transparent; -webkit-text-fill-color: transparent;
&::placeholder { &::placeholder {
text-fill-color: var(--input-placeholder-color); text-fill-color: var(--input-placeholder-color);
-webkit-text-fill-color: var(--input-placeholder-color); -webkit-text-fill-color: var(--input-placeholder-color);

View File

@ -58,7 +58,7 @@ export const FILTER_JOIN_OPERATOR = [
export const FILTER_OPERATORS_REGEX = '(&lt;|&gt;|&lt;=|&gt;=|=|!=|in)' export const FILTER_OPERATORS_REGEX = '(&lt;|&gt;|&lt;=|&gt;=|=|!=|in)'
export function getFilterFieldRegexPattern(field: string): RegExp { export function getFilterFieldRegexPattern(field: string): RegExp {
return new RegExp('(' + field + '\\s*' + FILTER_OPERATORS_REGEX + '\\s*)([\'"]?)([^\'"&|()]+\\1?)?', 'ig') return new RegExp('(' + field + '\\s*' + FILTER_OPERATORS_REGEX + '\\s*)([\'"]?)([^\'"&|()<]+\\1?)?', 'ig')
} }
export function transformFilterStringForApi( export function transformFilterStringForApi(