mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-11-09 21:51:29 +08:00
reworked the result filters typing
This commit is contained in:
parent
e2d021bbab
commit
a8939949fa
2 changed files with 42 additions and 83 deletions
|
|
@ -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;
|
||||
|
|
|
|||
17
frontend/src/ts/types/types.d.ts
vendored
17
frontend/src/ts/types/types.d.ts
vendored
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue