From fcdb33a4b6a8031778cb60c9d8fb6286bb1b1895 Mon Sep 17 00:00:00 2001 From: yohlo Date: Tue, 26 Aug 2025 21:50:56 -0500 Subject: [PATCH] admin progress --- src/app/routeTree.gen.ts | 22 ++++++++++++++ .../_authed/admin/tournaments/index.tsx | 27 +++++++++++++++++ src/components/list-button.tsx | 30 +++++++++++++++++++ .../sheet/slide-panel/slide-panel-field.tsx | 2 +- src/features/admin/components/admin-page.tsx | 3 +- .../admin/components/manage-tournaments.tsx | 24 +++++++++++++++ 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/app/routes/_authed/admin/tournaments/index.tsx create mode 100644 src/components/list-button.tsx create mode 100644 src/features/admin/components/manage-tournaments.tsx diff --git a/src/app/routeTree.gen.ts b/src/app/routeTree.gen.ts index 2cf690e..c689437 100644 --- a/src/app/routeTree.gen.ts +++ b/src/app/routeTree.gen.ts @@ -23,6 +23,7 @@ import { Route as AuthedTournamentsTournamentIdRouteImport } from './routes/_aut import { Route as AuthedTeamsTeamIdRouteImport } from './routes/_authed/teams.$teamId' import { Route as AuthedProfilePlayerIdRouteImport } from './routes/_authed/profile.$playerId' import { Route as AuthedAdminPreviewRouteImport } from './routes/_authed/admin/preview' +import { Route as AuthedAdminTournamentsIndexRouteImport } from './routes/_authed/admin/tournaments/index' import { Route as AuthedAdminTournamentsIdRouteImport } from './routes/_authed/admin/tournaments/$id' import { ServerRoute as ApiTestServerRouteImport } from './routes/api/test' import { ServerRoute as ApiTournamentsUploadLogoServerRouteImport } from './routes/api/tournaments/upload-logo' @@ -92,6 +93,12 @@ const AuthedAdminPreviewRoute = AuthedAdminPreviewRouteImport.update({ path: '/preview', getParentRoute: () => AuthedAdminRoute, } as any) +const AuthedAdminTournamentsIndexRoute = + AuthedAdminTournamentsIndexRouteImport.update({ + id: '/tournaments/', + path: '/tournaments/', + getParentRoute: () => AuthedAdminRoute, + } as any) const AuthedAdminTournamentsIdRoute = AuthedAdminTournamentsIdRouteImport.update({ id: '/tournaments/$id', @@ -139,6 +146,7 @@ export interface FileRoutesByFullPath { '/admin/': typeof AuthedAdminIndexRoute '/tournaments': typeof AuthedTournamentsIndexRoute '/admin/tournaments/$id': typeof AuthedAdminTournamentsIdRoute + '/admin/tournaments': typeof AuthedAdminTournamentsIndexRoute } export interface FileRoutesByTo { '/login': typeof LoginRoute @@ -152,6 +160,7 @@ export interface FileRoutesByTo { '/admin': typeof AuthedAdminIndexRoute '/tournaments': typeof AuthedTournamentsIndexRoute '/admin/tournaments/$id': typeof AuthedAdminTournamentsIdRoute + '/admin/tournaments': typeof AuthedAdminTournamentsIndexRoute } export interface FileRoutesById { __root__: typeof rootRouteImport @@ -168,6 +177,7 @@ export interface FileRoutesById { '/_authed/admin/': typeof AuthedAdminIndexRoute '/_authed/tournaments/': typeof AuthedTournamentsIndexRoute '/_authed/admin/tournaments/$id': typeof AuthedAdminTournamentsIdRoute + '/_authed/admin/tournaments/': typeof AuthedAdminTournamentsIndexRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath @@ -184,6 +194,7 @@ export interface FileRouteTypes { | '/admin/' | '/tournaments' | '/admin/tournaments/$id' + | '/admin/tournaments' fileRoutesByTo: FileRoutesByTo to: | '/login' @@ -197,6 +208,7 @@ export interface FileRouteTypes { | '/admin' | '/tournaments' | '/admin/tournaments/$id' + | '/admin/tournaments' id: | '__root__' | '/_authed' @@ -212,6 +224,7 @@ export interface FileRouteTypes { | '/_authed/admin/' | '/_authed/tournaments/' | '/_authed/admin/tournaments/$id' + | '/_authed/admin/tournaments/' fileRoutesById: FileRoutesById } export interface RootRouteChildren { @@ -359,6 +372,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AuthedAdminPreviewRouteImport parentRoute: typeof AuthedAdminRoute } + '/_authed/admin/tournaments/': { + id: '/_authed/admin/tournaments/' + path: '/tournaments' + fullPath: '/admin/tournaments' + preLoaderRoute: typeof AuthedAdminTournamentsIndexRouteImport + parentRoute: typeof AuthedAdminRoute + } '/_authed/admin/tournaments/$id': { id: '/_authed/admin/tournaments/$id' path: '/tournaments/$id' @@ -412,12 +432,14 @@ interface AuthedAdminRouteChildren { AuthedAdminPreviewRoute: typeof AuthedAdminPreviewRoute AuthedAdminIndexRoute: typeof AuthedAdminIndexRoute AuthedAdminTournamentsIdRoute: typeof AuthedAdminTournamentsIdRoute + AuthedAdminTournamentsIndexRoute: typeof AuthedAdminTournamentsIndexRoute } const AuthedAdminRouteChildren: AuthedAdminRouteChildren = { AuthedAdminPreviewRoute: AuthedAdminPreviewRoute, AuthedAdminIndexRoute: AuthedAdminIndexRoute, AuthedAdminTournamentsIdRoute: AuthedAdminTournamentsIdRoute, + AuthedAdminTournamentsIndexRoute: AuthedAdminTournamentsIndexRoute, } const AuthedAdminRouteWithChildren = AuthedAdminRoute._addFileChildren( diff --git a/src/app/routes/_authed/admin/tournaments/index.tsx b/src/app/routes/_authed/admin/tournaments/index.tsx new file mode 100644 index 0000000..92a928a --- /dev/null +++ b/src/app/routes/_authed/admin/tournaments/index.tsx @@ -0,0 +1,27 @@ +import Page from "@/components/page"; +import ManageTournaments from "@/features/admin/components/manage-tournaments"; +import { tournamentQueries } from "@/features/tournaments/queries"; +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/_authed/admin/tournaments/")({ + beforeLoad: async ({ context }) => { + const { queryClient } = context; + await queryClient.ensureQueryData(tournamentQueries.list()); + }, + loader: () => ({ + header: { + withBackButton: true, + title: "Manage Tournaments", + }, + refresh: { + toRefresh: tournamentQueries.list().queryKey, + }, + }), + component: RouteComponent, +}); + +function RouteComponent() { + return + + +} diff --git a/src/components/list-button.tsx b/src/components/list-button.tsx new file mode 100644 index 0000000..91278c6 --- /dev/null +++ b/src/components/list-button.tsx @@ -0,0 +1,30 @@ +import { Divider, Group, Text, UnstyledButton } from "@mantine/core"; +import { CaretRightIcon, Icon } from "@phosphor-icons/react"; + +interface ListButtonProps { + label: string; + Icon: Icon; + handleClick: () => void; +} + +const ListButton = ({ label, handleClick, Icon }: ListButtonProps) => { + return ( + <> + + + + {label} + + + + + + ) +} + +export default ListButton; diff --git a/src/components/sheet/slide-panel/slide-panel-field.tsx b/src/components/sheet/slide-panel/slide-panel-field.tsx index 23bcc6b..f111f41 100644 --- a/src/components/sheet/slide-panel/slide-panel-field.tsx +++ b/src/components/sheet/slide-panel/slide-panel-field.tsx @@ -68,7 +68,7 @@ const SlidePanelField = ({ style={{ width: '100%', border: error ? '1px solid var(--mantine-color-error)' : '1px solid var(--mantine-color-dimmed)', - borderRadius: 'var(--mantine-radius-lg)', + borderRadius: 'var(--mantine-radius-md)', backgroundColor: 'var(--mantine-color-body)', textAlign: 'left', }} diff --git a/src/features/admin/components/admin-page.tsx b/src/features/admin/components/admin-page.tsx index 217dc62..b7d2897 100644 --- a/src/features/admin/components/admin-page.tsx +++ b/src/features/admin/components/admin-page.tsx @@ -1,7 +1,8 @@ import { Title, List, Divider } from "@mantine/core"; import ListLink from "@/components/list-link"; import Page from "@/components/page"; -import { TrophyIcon } from "@phosphor-icons/react"; +import { TrophyIcon, UsersFourIcon, UsersThreeIcon } from "@phosphor-icons/react"; +import ListButton from "@/components/list-button"; const AdminPage = () => { return ( diff --git a/src/features/admin/components/manage-tournaments.tsx b/src/features/admin/components/manage-tournaments.tsx new file mode 100644 index 0000000..cc46a85 --- /dev/null +++ b/src/features/admin/components/manage-tournaments.tsx @@ -0,0 +1,24 @@ +import { List } from "@mantine/core"; +import Page from "@/components/page"; +import { TrophyIcon, UsersThreeIcon } from "@phosphor-icons/react"; +import ListButton from "@/components/list-button"; +import { useQuery, useSuspenseQuery } from "@tanstack/react-query"; +import { tournamentQueries } from "@/features/tournaments/queries"; + +const ManageTournaments = () => { + const { data: tournaments } = useSuspenseQuery(tournamentQueries.list()); + return ( + + + {tournaments.map(t => ( + + ))} + + ); +}; + +export default ManageTournaments;