- Tenant-Admin-PWA: Neues /event-admin/welcome Onboarding mit WelcomeHero, Packages-, Order-Summary- und Event-Setup-Pages, Zustandsspeicher, Routing-Guard und Dashboard-CTA für Erstnutzer; Filament-/admin-Login via Custom-View behoben.

- Brand/Theming: Marketing-Farb- und Typographievariablen in `resources/css/app.css` eingeführt, AdminLayout, Dashboardkarten und Onboarding-Komponenten entsprechend angepasst; Dokumentation (`docs/todo/tenant-admin-onboarding-fusion.md`, `docs/changes/...`) aktualisiert.
- Checkout & Payments: Checkout-, PayPal-Controller und Tests für integrierte Stripe/PayPal-Flows sowie Paket-Billing-Abläufe überarbeitet; neue PayPal SDK-Factory und Admin-API-Helper (`resources/js/admin/api.ts`) schaffen Grundlage für Billing/Members/Tasks-Seiten.
- DX & Tests: Neue Playwright/E2E-Struktur (docs/testing/e2e.md, `tests/e2e/tenant-onboarding-flow.test.ts`, Utilities), E2E-Tenant-Seeder und zusätzliche Übersetzungen/Factories zur Unterstützung der neuen Flows.
- Marketing-Kommunikation: Automatische Kontakt-Bestätigungsmail (`ContactConfirmation` + Blade-Template) implementiert; Guest-PWA unter `/event` erreichbar.
- Nebensitzung: Blogsystem gefixt und umfassenden BlogPostSeeder für Beispielinhalte angelegt.
This commit is contained in:
Codex Agent
2025-10-10 21:31:55 +02:00
parent 52197f216d
commit d04e234ca0
84 changed files with 8397 additions and 1005 deletions

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { useNavigate, useSearchParams } from 'react-router-dom';
import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
import { ArrowLeft, Camera, Heart, Loader2, RefreshCw, Share2, Sparkles } from 'lucide-react';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
@@ -9,7 +9,13 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/com
import { AdminLayout } from '../components/AdminLayout';
import { createInviteLink, getEvent, getEventStats, TenantEvent, EventStats as TenantEventStats, toggleEvent } from '../api';
import { isAuthError } from '../auth/tokens';
import { adminPath } from '../constants';
import {
ADMIN_EVENTS_PATH,
ADMIN_EVENT_EDIT_PATH,
ADMIN_EVENT_PHOTOS_PATH,
ADMIN_EVENT_MEMBERS_PATH,
ADMIN_EVENT_TASKS_PATH,
} from '../constants';
interface State {
event: TenantEvent | null;
@@ -21,8 +27,9 @@ interface State {
}
export default function EventDetailPage() {
const params = useParams<{ slug?: string }>();
const [searchParams] = useSearchParams();
const slug = searchParams.get('slug');
const slug = params.slug ?? searchParams.get('slug') ?? null;
const navigate = useNavigate();
const [state, setState] = React.useState<State>({
@@ -106,19 +113,35 @@ export default function EventDetailPage() {
<>
<Button
variant="outline"
onClick={() => navigate(adminPath('/events'))}
onClick={() => navigate(ADMIN_EVENTS_PATH)}
className="border-pink-200 text-pink-600 hover:bg-pink-50"
>
<ArrowLeft className="h-4 w-4" /> Zurueck zur Liste
</Button>
{event && (
<Button
variant="outline"
onClick={() => navigate(adminPath(`/events/edit?slug=${encodeURIComponent(event.slug)}`))}
className="border-fuchsia-200 text-fuchsia-700 hover:bg-fuchsia-50"
>
Bearbeiten
</Button>
<>
<Button
variant="outline"
onClick={() => navigate(ADMIN_EVENT_EDIT_PATH(event.slug))}
className="border-fuchsia-200 text-fuchsia-700 hover:bg-fuchsia-50"
>
Bearbeiten
</Button>
<Button
variant="outline"
onClick={() => navigate(ADMIN_EVENT_MEMBERS_PATH(event.slug))}
className="border-sky-200 text-sky-700 hover:bg-sky-50"
>
Mitglieder
</Button>
<Button
variant="outline"
onClick={() => navigate(ADMIN_EVENT_TASKS_PATH(event.slug))}
className="border-amber-200 text-amber-600 hover:bg-amber-50"
>
Tasks
</Button>
</>
)}
</>
);
@@ -177,7 +200,7 @@ export default function EventDetailPage() {
</Button>
<Button
variant="outline"
onClick={() => navigate(adminPath(`/events/photos?slug=${encodeURIComponent(event.slug)}`))}
onClick={() => navigate(ADMIN_EVENT_PHOTOS_PATH(event.slug))}
className="border-sky-200 text-sky-700 hover:bg-sky-50"
>
<Camera className="h-4 w-4" /> Fotos moderieren