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 +=
"