diff --git a/src/components/admin/components/FightEditPart.svelte b/src/components/admin/components/FightEditPart.svelte index 6565924..04c77b9 100644 --- a/src/components/admin/components/FightEditPart.svelte +++ b/src/components/admin/components/FightEditPart.svelte @@ -20,7 +20,7 @@ @@ -60,27 +56,7 @@ {/each} - - - - - - - - - - - No Players found :( - - {#each $players - .filter((v) => v.name.toLowerCase().includes(playerSearch.toLowerCase())) - .filter((v, i) => i < 50) - .filter((v) => !referees.some((k) => k.uuid === v.uuid)) as player (player.uuid)} - addReferee(player.uuid)} keywords={[player.uuid]}>{player.name} - {/each} - - - - - + + addReferee(player.uuid)} /> +
diff --git a/src/components/moderator/pages/logs/AuditLog.svelte b/src/components/moderator/pages/logs/AuditLog.svelte index b436f0a..73b1975 100644 --- a/src/components/moderator/pages/logs/AuditLog.svelte +++ b/src/components/moderator/pages/logs/AuditLog.svelte @@ -11,10 +11,10 @@ import { Input } from "@components/ui/input"; import { Popover, PopoverContent, PopoverTrigger } from "@components/ui/popover"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@components/ui/command"; - import { players } from "@components/stores/stores"; import { Check } from "lucide-svelte"; import { cn } from "@components/utils"; import DateTimePicker from "@components/ui/datetime-picker/DateTimePicker.svelte"; + import PlayerSelector from "@components/ui/PlayerSelector.svelte"; let debounceTimer: NodeJS.Timeout; const debounce = (value: T, func: (value: T) => void) => { @@ -27,11 +27,11 @@ let actionText = $state(""); let serverText = $state(""); let fullText = $state(""); - let actors = $state([]); + let actors = $state([]); let actionTypes = $state([]); let timeGreater = $state(now("Europe/Berlin").subtract({ months: 1 })); let timeLess = $state(now("Europe/Berlin")); - let serverOwner = $state([]); + let serverOwner = $state([]); let velocity = $state(false); let sorting = $state("DESC"); @@ -118,56 +118,12 @@ - - - - - - - - - No Players found :( - - {#each $players.filter((v) => v.name.toLowerCase().includes(playerSearch.toLowerCase())).filter((v, i) => i < 50) as player (player.uuid)} - (actors = actors.includes(player.uuid) ? actors.filter((v) => v !== player.uuid) : [...actors, player.uuid])} - keywords={[player.uuid]} - > - - {player.name} - - {/each} - - - - - - - - - - - - - - No Players found :( - - {#each $players.filter((v) => v.name.toLowerCase().includes(ownerSearch.toLowerCase())).filter((v, i) => i < 50) as player (player.uuid)} - (serverOwner = serverOwner.includes(player.uuid) ? serverOwner.filter((v) => v !== player.uuid) : [...serverOwner, player.uuid])} - keywords={[player.uuid]} - > - - {player.name} - - {/each} - - - - - +
+ +
+
+ +
diff --git a/src/components/moderator/pages/players/PermissionsDropdown.svelte b/src/components/moderator/pages/players/PermissionsDropdown.svelte index a58141d..9e6ff20 100644 --- a/src/components/moderator/pages/players/PermissionsDropdown.svelte +++ b/src/components/moderator/pages/players/PermissionsDropdown.svelte @@ -18,7 +18,7 @@ --> -{#await playersFuture} -

Loading...

-{:then players} - -{/await} \ No newline at end of file +
+
+ + debounce(e.currentTarget.value, (v) => { + search = v; + })} + oninput={(e) => + debounce(e.currentTarget.value, (v) => { + search = v; + })} + /> +
+
+
+ + {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} + + {#each headerGroup.headers as header (header.id)} + + {#if !header.isPlaceholder} + + {/if} + + {/each} + + {/each} + + + {#each table.getRowModel().rows as row (row.id)} + + {#each row.getVisibleCells() as cell (cell.id)} + + + + {/each} + + {:else} + + No players found. + + {/each} + +
+ + +
+
+ +
+ + +
+ diff --git a/src/components/moderator/pages/players/Table.svelte b/src/components/moderator/pages/players/Table.svelte deleted file mode 100644 index 1d8dc68..0000000 --- a/src/components/moderator/pages/players/Table.svelte +++ /dev/null @@ -1,174 +0,0 @@ - - - - -
-
- { - table.getColumn("name")?.setFilterValue(e.currentTarget.value); - }} - oninput={(e) => { - table.getColumn("name")?.setFilterValue(e.currentTarget.value); - }} - class="max-w-sm" - /> -
- -
-
- - - {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} - - {#each headerGroup.headers as header (header.id)} - - {#if !header.isPlaceholder} - - {/if} - - {/each} - - {/each} - - - {#each table.getRowModel().rows as row (row.id)} - - {#each row.getVisibleCells() as cell (cell.id)} - - - - {/each} - - {:else} - - - No results. - - - {/each} - -
-
- - {pagination.pageIndex + 1}/{table.getPageCount()} - -
-
\ No newline at end of file diff --git a/src/components/repo/auditlog.ts b/src/components/repo/auditlog.ts index ee2609b..2499585 100644 --- a/src/components/repo/auditlog.ts +++ b/src/components/repo/auditlog.ts @@ -7,11 +7,11 @@ export class AuditLogRepo { actionText: string | undefined, serverText: string | undefined, fullText: string | undefined, - actor: string[] | undefined, + actor: number[] | undefined, actionType: string[] | undefined, timeFrom: number | undefined, timeTo: number | undefined, - serverOwner: string[] | undefined, + serverOwner: number[] | undefined, velocity: boolean | undefined, page: number, pageSize: number, diff --git a/src/components/repo/data.ts b/src/components/repo/data.ts index b6a87db..44cf672 100644 --- a/src/components/repo/data.ts +++ b/src/components/repo/data.ts @@ -17,8 +17,8 @@ * along with this program. If not, see . */ -import type { Player, Server } from "@type/data.ts"; -import { PlayerSchema, ServerSchema } from "@type/data.ts"; +import type { Player, PlayerList, Server } from "@type/data.ts"; +import { PlayerListSchema, PlayerSchema, ServerSchema } from "@type/data.ts"; import { fetchWithToken, tokenStore } from "./repo.ts"; import { derived, get } from "svelte/store"; import { TeamSchema, type Team } from "@components/types/team.ts"; @@ -38,10 +38,28 @@ export class DataRepo { .then(PlayerSchema.parse); } - public async getPlayers(): Promise { - return await fetchWithToken(get(tokenStore), "/data/admin/users") + public async queryPlayers( + name: string | undefined, + uuid: string | undefined, + team: number[] | undefined, + limit: number | undefined, + page: number | undefined, + includePerms: boolean | undefined, + includeId: boolean | undefined + ): Promise { + let query = new URLSearchParams(); + + if (name) query.append("name", name); + if (uuid) query.append("uuid", uuid); + if (team) team.forEach((t) => query.append("team", t.toString())); + if (limit) query.append("limit", limit.toString()); + if (page) query.append("page", page.toString()); + if (includePerms !== undefined) query.append("includePerms", includePerms.toString()); + if (includeId !== undefined) query.append("includeId", includeId.toString()); + + return await fetchWithToken(this.token, "/data/admin/users?" + query.toString()) .then((value) => value.json()) - .then(PlayerSchema.array().parse); + .then(PlayerListSchema.parse); } public async getTeams(): Promise { diff --git a/src/components/stores/stores.ts b/src/components/stores/stores.ts index 0afaf52..0ca1faf 100644 --- a/src/components/stores/stores.ts +++ b/src/components/stores/stores.ts @@ -31,10 +31,6 @@ import { permsRepo } from "@repo/perms.ts"; export const schemTypes = cached([], () => fetchWithToken(get(tokenStore), "/data/admin/schematicTypes").then((res) => res.json())); -export const players = cached([], async () => { - return get(dataRepo).getPlayers(); -}); - export const teams = cached([], async () => { return get(dataRepo).getTeams(); }); diff --git a/src/components/types/data.ts b/src/components/types/data.ts index 2098b68..3eee428 100644 --- a/src/components/types/data.ts +++ b/src/components/types/data.ts @@ -29,12 +29,20 @@ export type SchematicType = z.infer; export const PlayerSchema = z.object({ name: z.string(), uuid: z.string(), - prefix: z.string(), - perms: z.array(z.string()), + prefix: z.string().nullable(), + perms: z.array(z.string()).nullable(), + id: z.number().nullable(), }); export type Player = z.infer; +export const PlayerListSchema = z.object({ + entries: z.array(PlayerSchema), + rows: z.number(), +}); + +export type PlayerList = z.infer; + export const ServerSchema = z.object({ description: z.any(), players: z.object({ diff --git a/src/components/ui/PlayerSelector.svelte b/src/components/ui/PlayerSelector.svelte new file mode 100644 index 0000000..e47db2b --- /dev/null +++ b/src/components/ui/PlayerSelector.svelte @@ -0,0 +1,122 @@ + + + + + {#snippet child({ props })} + + {/snippet} + + + + + + No players found. + + {#each players as player (player.uuid)} + handleSelect(player)}> + + {player.name} + + {/each} + + + + +