Skip to content

Commit d23a742

Browse files
committed
feat: toggle filter mode on click
1 parent aaa252f commit d23a742

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

frontend/src/ts/elements/account/result-filters.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
import * as Misc from "../../utils/misc";
2-
import * as Strings from "../../utils/strings";
3-
import * as JSONData from "../../utils/json-data";
4-
import * as DB from "../../db";
5-
import Config from "../../config";
6-
import * as Notifications from "../notifications";
7-
import Ape from "../../ape/index";
8-
import * as Loader from "../loader";
9-
import SlimSelect from "slim-select";
101
import { QuoteLength } from "@monkeytype/contracts/schemas/configs";
112
import {
123
ResultFilters,
13-
ResultFiltersSchema,
144
ResultFiltersGroup,
155
ResultFiltersGroupItem,
6+
ResultFiltersSchema,
167
} from "@monkeytype/contracts/schemas/users";
17-
import { LocalStorageWithSchema } from "../../utils/local-storage-with-schema";
18-
import defaultResultFilters from "../../constants/default-result-filters";
198
import { getAllFunboxes } from "@monkeytype/funbox";
9+
import SlimSelect from "slim-select";
10+
import Ape from "../../ape/index";
11+
import Config from "../../config";
12+
import defaultResultFilters from "../../constants/default-result-filters";
2013
import { SnapshotUserTag } from "../../constants/default-snapshot";
14+
import * as DB from "../../db";
15+
import * as JSONData from "../../utils/json-data";
16+
import { LocalStorageWithSchema } from "../../utils/local-storage-with-schema";
17+
import * as Misc from "../../utils/misc";
18+
import * as Strings from "../../utils/strings";
19+
import * as Loader from "../loader";
20+
import * as Notifications from "../notifications";
2121

2222
export function mergeWithDefaultFilters(
2323
filters: Partial<ResultFilters>
@@ -33,6 +33,8 @@ export function mergeWithDefaultFilters(
3333
merged[groupKey] = id;
3434
} else if (groupKey === "name") {
3535
merged[groupKey] = filters[groupKey] ?? defaultResultFilters[groupKey];
36+
} else if (groupKey === "tagsFilterMode") {
37+
merged[groupKey] = filters[groupKey] ?? defaultResultFilters[groupKey];
3638
} else {
3739
// @ts-expect-error i cant figure this out
3840
merged[groupKey] = {
@@ -289,7 +291,7 @@ export function updateActive(): void {
289291

290292
for (const group of Misc.typedKeys(getFilters())) {
291293
// id and name field do not correspond to any ui elements, no need to update
292-
if (group === "_id" || group === "name") {
294+
if (group === "_id" || group === "name" || group === "tagsFilterMode") {
293295
continue;
294296
}
295297

@@ -488,6 +490,19 @@ export function updateActive(): void {
488490
}, 0);
489491
}
490492

493+
function updateTagsFilterModeIcon(): void {
494+
const toggleElement = $(".pageAccount .tagsFilterModeToggle");
495+
const modeTextElement = toggleElement.find(".mode-text");
496+
497+
if (filters.tagsFilterMode === "and") {
498+
toggleElement.addClass("mode-and");
499+
modeTextElement.text("AND");
500+
} else {
501+
toggleElement.removeClass("mode-and");
502+
modeTextElement.text("OR");
503+
}
504+
}
505+
491506
function toggle<G extends ResultFiltersGroup>(
492507
group: G,
493508
filter: ResultFiltersGroupItem<G>
@@ -925,6 +940,13 @@ $(".group.presetFilterButtons .filterBtns").on(
925940
}
926941
);
927942

943+
$(document).on("click", ".pageAccount .tagsFilterModeToggle", () => {
944+
filters.tagsFilterMode = filters.tagsFilterMode === "or" ? "and" : "or";
945+
save();
946+
updateTagsFilterModeIcon();
947+
selectChangeCallbackFn();
948+
});
949+
928950
function verifyResultFiltersStructure(filterIn: ResultFilters): ResultFilters {
929951
const filter = Misc.deepClone(filterIn);
930952
Object.entries(defaultResultFilters).forEach((entry) => {

packages/contracts/src/schemas/users.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const ResultFiltersSchema = z.object({
5151
})
5252
.strict(),
5353
tags: z.record(z.string(), z.boolean()),
54-
tagsFilterMode: z.enum(["and", "or"]).default("or"),
54+
tagsFilterMode: z.enum(["and", "or"]),
5555
language: z.record(LanguageSchema, z.boolean()),
5656
funbox: z.record(z.string(), z.boolean()),
5757
});

0 commit comments

Comments
 (0)