neuer demo tenant switcher + demo tenants mit eigenem artisan command. Event Admin überarbeitet, aber das ist nur ein Zwischenstand.

This commit is contained in:
Codex Agent
2025-11-25 09:47:39 +01:00
parent 8947a37261
commit fd788ef770
22 changed files with 1096 additions and 299 deletions

View File

@@ -259,7 +259,10 @@ export default function EventTasksPage() {
}
}, [event, hydrateTasks, slug, t]);
const isPhotoOnlyMode = event?.engagement_mode === 'photo_only';
const isPhotoOnlyMode = React.useMemo(() => {
const mode = event?.engagement_mode ?? (event?.settings as any)?.engagement_mode;
return mode === 'photo_only';
}, [event?.engagement_mode, event?.settings]);
async function handleModeChange(checked: boolean) {
if (!event || !slug) return;
@@ -271,10 +274,20 @@ export default function EventTasksPage() {
const nextMode = checked ? 'photo_only' : 'tasks';
const updated = await updateEvent(slug, {
settings: {
...(event.settings ?? {}),
engagement_mode: nextMode,
},
});
setEvent(updated);
setEvent((prev) => ({
...(prev ?? updated),
...(updated ?? {}),
engagement_mode: updated?.engagement_mode ?? nextMode,
settings: {
...(prev?.settings ?? {}),
...(updated?.settings ?? {}),
engagement_mode: nextMode,
},
}));
} catch (err) {
if (!isAuthError(err)) {
setError(
@@ -297,8 +310,8 @@ export default function EventTasksPage() {
return (
<AdminLayout
title={t('management.tasks.title', 'Event-Tasks')}
subtitle={t('management.tasks.subtitle', 'Verwalte Aufgaben, die diesem Event zugeordnet sind.')}
title={t('management.tasks.title', 'Aufgaben & Missionen')}
subtitle={t('management.tasks.subtitle', 'Stelle Mission Cards und Aufgaben für dieses Event zusammen.')}
actions={actions}
tabs={eventTabs}
currentTabKey="tasks"
@@ -387,6 +400,30 @@ export default function EventTasksPage() {
</div>
</div>
</CardHeader>
<CardContent className="pb-0">
<Alert variant="default" className="rounded-2xl border border-dashed border-emerald-200 bg-emerald-50/60 text-xs text-slate-700">
<AlertTitle className="text-sm font-semibold text-slate-900">
{t('management.tasks.library.hintTitle', 'Weitere Vorlagen in der Aufgaben-Bibliothek')}
</AlertTitle>
<AlertDescription className="mt-1 flex flex-wrap items-center gap-2">
<span>
{t(
'management.tasks.library.hintCopy',
'Lege eigene Aufgaben, Emotionen oder Mission Packs zentral an und nutze sie in mehreren Events.',
)}
</span>
<Button
type="button"
variant="outline"
size="sm"
className="mt-1 rounded-full border-emerald-300 text-emerald-700 hover:bg-emerald-100"
onClick={() => navigate(buildEngagementTabPath('tasks'))}
>
{t('management.tasks.library.open', 'Aufgaben-Bibliothek öffnen')}
</Button>
</AlertDescription>
</Alert>
</CardContent>
<CardContent className="grid gap-4 lg:grid-cols-2">
<section className="space-y-3">
<div className="flex flex-wrap items-center justify-between gap-2">