diff --git a/backend/__tests__/api/controllers/user.spec.ts b/backend/__tests__/api/controllers/user.spec.ts index 2e75511ebf0d..2a1bfd1fbbe8 100644 --- a/backend/__tests__/api/controllers/user.spec.ts +++ b/backend/__tests__/api/controllers/user.spec.ts @@ -1917,6 +1917,7 @@ describe("user controller test", () => { tags: { none: false, }, + tagsFilterMode: "or", language: { english: true, }, @@ -1981,6 +1982,7 @@ describe("user controller test", () => { '"numbers" Required', '"date" Required', '"tags" Required', + '"tagsFilterMode" Required', '"language" Required', '"funbox" Required', ], diff --git a/frontend/src/html/pages/account.html b/frontend/src/html/pages/account.html index ef6d16b85962..fb33915fdc38 100644 --- a/frontend/src/html/pages/account.html +++ b/frontend/src/html/pages/account.html @@ -496,6 +496,16 @@
tags + + + OR +
diff --git a/frontend/src/styles/account.scss b/frontend/src/styles/account.scss index 77892551cb86..7f83052d213b 100644 --- a/frontend/src/styles/account.scss +++ b/frontend/src/styles/account.scss @@ -375,6 +375,26 @@ margin-right: 0.5em; } } + + &.tags { + .title { + align-items: baseline; + + .tagsFilterModeToggle { + margin-left: 0.5rem; + cursor: pointer; + opacity: 0.5; + transition: 0.125s; + display: flex; + align-items: center; + font-size: 0.8em; + + &:hover { + opacity: 1; + } + } + } + } } &.presetFilterButtons { diff --git a/frontend/src/ts/constants/default-result-filters.ts b/frontend/src/ts/constants/default-result-filters.ts index 63560d5de88e..78ab058e844b 100644 --- a/frontend/src/ts/constants/default-result-filters.ts +++ b/frontend/src/ts/constants/default-result-filters.ts @@ -58,6 +58,7 @@ const object: ResultFilters = { tags: { none: true, }, + tagsFilterMode: "or", language: {}, funbox: { none: true, diff --git a/frontend/src/ts/elements/account/result-filters.ts b/frontend/src/ts/elements/account/result-filters.ts index 2ec5d1b0acb7..0f12ea3b96ad 100644 --- a/frontend/src/ts/elements/account/result-filters.ts +++ b/frontend/src/ts/elements/account/result-filters.ts @@ -33,6 +33,8 @@ export function mergeWithDefaultFilters( merged[groupKey] = id; } else if (groupKey === "name") { merged[groupKey] = filters[groupKey] ?? defaultResultFilters[groupKey]; + } else if (groupKey === "tagsFilterMode") { + merged[groupKey] = filters[groupKey] ?? defaultResultFilters[groupKey]; } else { // @ts-expect-error i cant figure this out merged[groupKey] = { @@ -289,7 +291,7 @@ export function updateActive(): void { for (const group of Misc.typedKeys(getFilters())) { // id and name field do not correspond to any ui elements, no need to update - if (group === "_id" || group === "name") { + if (group === "_id" || group === "name" || group === "tagsFilterMode") { continue; } @@ -488,6 +490,19 @@ export function updateActive(): void { }, 0); } +function updateTagsFilterModeIcon(): void { + const toggleElement = $(".pageAccount .tagsFilterModeToggle"); + const modeTextElement = toggleElement.find(".mode-text"); + + if (filters.tagsFilterMode === "and") { + modeTextElement.text("AND"); + } else if (filters.tagsFilterMode === "exact") { + modeTextElement.text("EXACT"); + } else { + modeTextElement.text("OR"); + } +} + function toggle( group: G, filter: ResultFiltersGroupItem @@ -857,7 +872,7 @@ export async function appendButtons( html += "