+ {/* 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"],