mirror of
				https://github.com/monkeytypegame/monkeytype.git
				synced 2025-11-01 03:39:15 +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