From 835f0941dc267763cd76e49fa61b2a084310db78 Mon Sep 17 00:00:00 2001 From: zias Date: Wed, 4 Mar 2026 16:25:46 +0100 Subject: [PATCH] fix:improved admin dashboard on mobile --- apps/web/src/routes/admin/drinkkaart.tsx | 8 +- apps/web/src/routes/admin/index.tsx | 339 +++++++++++++++++++---- apps/web/src/routes/manage.$token.tsx | 2 +- packages/infra/alchemy.run.ts | 3 + 4 files changed, 288 insertions(+), 64 deletions(-) diff --git a/apps/web/src/routes/admin/drinkkaart.tsx b/apps/web/src/routes/admin/drinkkaart.tsx index b5ae10e..2dcc814 100644 --- a/apps/web/src/routes/admin/drinkkaart.tsx +++ b/apps/web/src/routes/admin/drinkkaart.tsx @@ -100,18 +100,18 @@ function AdminDrinkkaartPage() { return (
{/* Header */} -
-
+
+
← Admin -

+

Drinkkaart Beheer

-
+
{/* Scan / State machine */}
{scanState.step === "idle" && ( diff --git a/apps/web/src/routes/admin/index.tsx b/apps/web/src/routes/admin/index.tsx index 3bd1c37..7bb4ba9 100644 --- a/apps/web/src/routes/admin/index.tsx +++ b/apps/web/src/routes/admin/index.tsx @@ -392,20 +392,23 @@ function AdminPage() { return (
{/* Header */} -
-
-
- +
+
+
+ ← Terug naar website -

+

Admin Dashboard

-
+
Drinkkaart beheer @@ -422,30 +425,30 @@ function AdminPage() {
{/* Main Content */} -
+
{/* Pending Admin Requests */} {pendingRequests.length > 0 && ( - - - + + + Openstaande Admin Aanvragen ({pendingRequests.length}) - + Gebruikers die admin toegang hebben aangevraagd - +
{pendingRequests.map((request) => (
-
-

+

+

{request.userName}

-

+

{request.userEmail}

@@ -455,7 +458,7 @@ function AdminPage() { )}

-
+
- {/* Registrations Table */} + {/* Registrations Table / Cards */} -
+ {/* Desktop Table */} +
@@ -898,22 +976,163 @@ function AdminPage() {
+ + {/* Mobile Cards */} +
+ {registrationsQuery.isLoading ? ( +
+ Laden... +
+ ) : sortedRegistrations.length === 0 ? ( +
+ Geen registraties gevonden +
+ ) : ( +
+ {sortedRegistrations.map((reg) => { + const isPerformer = reg.registrationType === "performer"; + + const guestCount = (() => { + if (!reg.guests) return 0; + try { + const g = JSON.parse(reg.guests as string); + return Array.isArray(g) ? g.length : 0; + } catch { + return 0; + } + })(); + + const detailLabel = isPerformer + ? reg.artForm || "-" + : `€${reg.drinkCardValue ?? 5} drinkkaart`; + + const dateLabel = (() => { + try { + return new Date(reg.createdAt).toLocaleDateString( + "nl-BE", + { + day: "2-digit", + month: "2-digit", + year: "2-digit", + }, + ); + } catch { + return "-"; + } + })(); + + return ( +
+
+
+
+ + {reg.firstName} {reg.lastName} + +
+
+ {reg.email} + {reg.phone && ( + • {reg.phone} + )} +
+
+
+ + {isPerformer ? "Artiest" : "Bezoeker"} + + {reg.managementToken && ( + + )} +
+
+ +
+
+ Details:{" "} + {detailLabel} +
+ {guestCount > 0 && ( +
+ Gasten:{" "} + {guestCount} +
+ )} + {(reg.giftAmount ?? 0) > 0 && ( +
+ Gift:{" "} + {formatCents(reg.giftAmount)} +
+ )} + {!isPerformer && ( +
+ Betaling:{" "} + {reg.paymentStatus === "paid" ? ( + + + Betaald + + ) : reg.paymentStatus === + "extra_payment_pending" ? ( + + + Extra (€ + {((reg.paymentAmount ?? 0) / 100).toFixed(0)}) + + ) : ( + Open + )} +
+ )} +
{dateLabel}
+
+
+ ); + })} +
+ )} +
{/* Pagination */} {pagination && pagination.totalPages > 1 && ( -
+
- - Pagina {page} van {pagination.totalPages} + + + {page}/{pagination.totalPages} + + + Pagina {page} van {pagination.totalPages} +
)} diff --git a/apps/web/src/routes/manage.$token.tsx b/apps/web/src/routes/manage.$token.tsx index 4c98809..a41c93a 100644 --- a/apps/web/src/routes/manage.$token.tsx +++ b/apps/web/src/routes/manage.$token.tsx @@ -427,7 +427,7 @@ function EditForm({ token, initialData, onCancel, onSaved }: EditFormProps) { onChange={(e) => setFormData((p) => ({ ...p, extraQuestions: e.target.value })) } - className="w-full border border-white/10 resize-none bg-transparent p-2 text-lg text-white placeholder:text-white/40 focus:outline-none" + className="w-full resize-none border border-white/10 bg-transparent p-2 text-lg text-white placeholder:text-white/40 focus:outline-none" />
diff --git a/packages/infra/alchemy.run.ts b/packages/infra/alchemy.run.ts index e6cff22..dcf04e3 100644 --- a/packages/infra/alchemy.run.ts +++ b/packages/infra/alchemy.run.ts @@ -34,6 +34,9 @@ export const web = await TanStackStart("web", { LEMON_SQUEEZY_API_KEY: getEnvVar("LEMON_SQUEEZY_API_KEY"), LEMON_SQUEEZY_STORE_ID: getEnvVar("LEMON_SQUEEZY_STORE_ID"), LEMON_SQUEEZY_VARIANT_ID: getEnvVar("LEMON_SQUEEZY_VARIANT_ID"), + LEMON_SQUEEZY_DRINKKAART_VARIANT_ID: getEnvVar( + "LEMON_SQUEEZY_DRINKKAART_VARIANT_ID", + ), LEMON_SQUEEZY_WEBHOOK_SECRET: getEnvVar("LEMON_SQUEEZY_WEBHOOK_SECRET"), }, domains: ["kunstenkamp.be", "www.kunstenkamp.be"],