reworked the result filters typing

This commit is contained in:
Miodec 2023-07-18 15:51:59 +02:00
parent e2d021bbab
commit a8939949fa
2 changed files with 42 additions and 83 deletions

View file

@ -274,7 +274,7 @@ export function getFilters(): MonkeyTypes.ResultFilters {
return filters;
}
export function getGroup<G extends MonkeyTypes.Group>(
function getGroup<G extends keyof MonkeyTypes.ResultFilters>(
group: G
): MonkeyTypes.ResultFilters[G] {
return filters[group];
@ -284,16 +284,22 @@ export function getGroup<G extends MonkeyTypes.Group>(
// filters[group][filter] = value;
// }
export function getFilter<G extends MonkeyTypes.Group>(
export function getFilter<G extends keyof MonkeyTypes.ResultFilters>(
group: G,
filter: MonkeyTypes.Filter<G>
): MonkeyTypes.ResultFilters[G][MonkeyTypes.Filter<G>] {
return filters[group][filter];
}
// export function toggleFilter(group, filter) {
// filters[group][filter] = !filters[group][filter];
// }
function setAllFilters(
group: keyof MonkeyTypes.ResultFilters,
value: boolean
): void {
Object.keys(getGroup(group)).forEach((filter) => {
filters[group][filter as keyof typeof filters[typeof group]] =
value as never;
});
}
export function loadTags(tags: MonkeyTypes.Tag[]): void {
tags.forEach((tag) => {
@ -307,12 +313,12 @@ export function reset(): void {
}
type AboveChartDisplay = Partial<
Record<MonkeyTypes.Group, { all: boolean; array?: string[] }>
Record<keyof MonkeyTypes.ResultFilters, { all: boolean; array?: string[] }>
>;
export function updateActive(): void {
const aboveChartDisplay: AboveChartDisplay = {};
(Object.keys(getFilters()) as MonkeyTypes.Group[]).forEach((group) => {
Object.typedKeys(getFilters()).forEach((group) => {
// id and name field do not correspond to any ui elements, no need to update
if (group === "_id" || group === "name") {
return;
@ -322,9 +328,8 @@ export function updateActive(): void {
all: true,
array: [],
};
(
Object.keys(getGroup(group)) as MonkeyTypes.Filter<typeof group>[]
).forEach((filter) => {
Object.typedKeys(getGroup(group)).forEach((filter) => {
const groupAboveChartDisplay = aboveChartDisplay[group];
if (groupAboveChartDisplay === undefined) return;
@ -354,7 +359,7 @@ export function updateActive(): void {
});
});
function addText(group: MonkeyTypes.Group): string {
function addText(group: keyof MonkeyTypes.ResultFilters): string {
let ret = "";
ret += "<div class='group'>";
if (group === "difficulty") {
@ -452,7 +457,7 @@ export function updateActive(): void {
}, 0);
}
export function toggle<G extends MonkeyTypes.Group>(
function toggle<G extends keyof MonkeyTypes.ResultFilters>(
group: G,
filter: MonkeyTypes.Filter<G>
): void {
@ -461,15 +466,12 @@ export function toggle<G extends MonkeyTypes.Group>(
try {
if (group === "date") {
(Object.keys(getGroup("date")) as MonkeyTypes.Filter<"date">[]).forEach(
(date) => {
filters["date"][date] = false;
}
);
setAllFilters("date", false);
}
filters[group][filter] = !filters[group][
const newValue = !filters[group][
filter
] as unknown as MonkeyTypes.ResultFilters[G][keyof MonkeyTypes.ResultFilters[G]];
] as unknown as MonkeyTypes.ResultFilters[G][MonkeyTypes.Filter<G>];
filters[group][filter] = newValue;
save();
} catch (e) {
Notifications.add(
@ -488,58 +490,35 @@ $(
).on("click", ".button", (e) => {
const group = $(e.target)
.parents(".buttons")
.attr("group") as MonkeyTypes.Group;
.attr("group") as keyof MonkeyTypes.ResultFilters;
const filter = $(e.target).attr("filter") as MonkeyTypes.Filter<typeof group>;
if ($(e.target).hasClass("allFilters")) {
(Object.keys(getFilters()) as MonkeyTypes.Group[]).forEach((group) => {
Object.typedKeys(getFilters()).forEach((group) => {
// id and name field do not correspond to any ui elements, no need to update
if (group === "_id" || group === "name") {
return;
}
(
Object.keys(getGroup(group)) as MonkeyTypes.Filter<typeof group>[]
).forEach((filter) => {
if (group === "date") {
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = false;
} else if (filters[group] !== undefined) {
// @ts-ignore
filters[group][filter] = true;
}
});
setAllFilters(group, true);
});
setAllFilters("date", false);
filters["date"]["all"] = true;
} else if ($(e.target).hasClass("noFilters")) {
(Object.keys(getFilters()) as MonkeyTypes.Group[]).forEach((group) => {
Object.typedKeys(getFilters()).forEach((group) => {
// id and name field do not correspond to any ui elements, no need to update
if (group === "_id" || group === "name") {
return;
}
if (group !== "date") {
(
Object.keys(getGroup(group)) as MonkeyTypes.Filter<typeof group>[]
).forEach((filter) => {
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = false;
});
setAllFilters(group, false);
}
});
} else if ($(e.target).hasClass("button")) {
if (e.shiftKey) {
(
Object.keys(getGroup(group)) as MonkeyTypes.Filter<typeof group>[]
).forEach((filter) => {
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = false;
});
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = true;
setAllFilters(group, false);
filters[group][filter as keyof typeof filters[typeof group]] =
true as never;
} else {
toggle(group, filter);
// filters[group][filter] = !filters[group][filter];
@ -555,26 +534,15 @@ $(".pageAccount .topFilters .button.allFilters").on("click", () => {
console.log(getFilters());
(Object.keys(getFilters()) as MonkeyTypes.Group[]).forEach((group) => {
Object.typedKeys(getFilters()).forEach((group) => {
// id and name field do not correspond to any ui elements, no need to update
if (group === "_id" || group === "name") {
return;
}
(
Object.keys(getGroup(group)) as MonkeyTypes.Filter<typeof group>[]
).forEach((filter) => {
if (group === "date") {
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = false;
} else {
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = true;
}
});
setAllFilters(group, true);
});
setAllFilters("date", false);
filters["date"]["all"] = true;
updateActive();
save();
@ -584,19 +552,13 @@ $(".pageAccount .topFilters .button.currentConfigFilter").on("click", () => {
// user is changing the filters -> current filter is no longer a filter preset
deSelectFilterPreset();
(Object.keys(getFilters()) as MonkeyTypes.Group[]).forEach((group) => {
Object.typedKeys(getFilters()).forEach((group) => {
// id and name field do not correspond to any ui elements, no need to update
if (group === "_id" || group === "name") {
return;
}
(
Object.keys(getGroup(group)) as MonkeyTypes.Filter<typeof group>[]
).forEach((filter) => {
// TODO figure out why "filter" is never
// @ts-ignore
filters[group][filter] = false;
});
setAllFilters(group, false);
});
filters["pb"]["no"] = true;

View file

@ -658,21 +658,18 @@ declare namespace MonkeyTypes {
last_3months: boolean;
all: boolean;
};
tags: {
[tagId: string]: boolean;
};
language: {
[language: string]: boolean;
};
tags: Record<string, boolean>;
language: Record<string, boolean>;
funbox: {
none?: boolean;
[funbox: string]: boolean;
};
} & Record<string, boolean>;
}
type Group = keyof ResultFilters;
type Group<G extends keyof ResultFilters> = G extends G
? ResultFilters[G]
: never;
type Filter<G extends Group> = keyof ResultFilters[G];
type Filter<G extends Group> = G extends G ? keyof ResultFilters[G] : never;
interface TimerStats {
dateNow: number;