Prepare Kalendartool for MPM and disable invites

This commit is contained in:
Kühn
2026-10-08 15:06:22 +02:00
parent bc49c3074e
commit 556202575e
50 changed files with 905 additions and 836 deletions

View File

@@ -1,6 +1,6 @@
/**
* Admin: Kalenderverwaltung (plan.md Abschnitt 13: /admin/calendars/[id]).
* Bearbeiten, deaktivieren, Invite-Links erstellen, Benutzer einsehen.
* Bearbeiten, deaktivieren und Mitglieder verwalten.
*/
import { redirect } from 'next/navigation';
import { prisma } from '@/lib/db/client';
@@ -9,7 +9,7 @@ import { canManageCalendar } from '@/lib/permissions/permissions';
import { displayName } from '@/lib/privacy/display';
import { Card } from '@/components/ui/ui';
import { EditCalendarForm } from '@/components/admin/EditCalendarForm';
import { InviteManager } from '@/components/admin/InviteManager';
import { MemberSection } from '@/components/admin/MemberSection';
import { AppShell } from '@/components/layout/AppShell';
interface PageProps {
@@ -26,29 +26,18 @@ export default async function AdminCalendarPage({ params }: PageProps) {
redirect('/dashboard');
}
const [members, invites, reservations] = await Promise.all([
prisma.calendarMember.findMany({
where: { calendarId: id },
select: { user: { select: { email: true, username: true, createdAt: true } } },
}),
prisma.invite.findMany({
where: { calendarId: id },
orderBy: { createdAt: 'desc' },
select: { id: true, expiresAt: true, usedAt: true, createdAt: true },
}),
prisma.reservation.findMany({
where: { calendarId: id, status: 'CONFIRMED' },
orderBy: { startAt: 'desc' },
take: 50,
select: {
id: true,
title: true,
startAt: true,
endAt: true,
user: { select: { email: true, username: true } },
},
}),
]);
const reservations = await prisma.reservation.findMany({
where: { calendarId: id, status: 'CONFIRMED' },
orderBy: { startAt: 'desc' },
take: 50,
select: {
id: true,
title: true,
startAt: true,
endAt: true,
user: { select: { email: true, username: true } },
},
});
return (
<AppShell role={context.user.role} userEmail={context.user.email} username={context.user.username}>
@@ -62,28 +51,8 @@ export default async function AdminCalendarPage({ params }: PageProps) {
initialIsActive={context.calendar.isActive}
/>
<InviteManager calendarId={id} invites={invites} />
<Card>
<h2 className="mb-3 text-lg font-semibold">Mitglieder ({members.length})</h2>
{members.length === 0 ? (
<p className="text-sm text-slate-500">
Noch keine Mitglieder. Erstelle einen Invite-Link.
</p>
) : (
<ul className="space-y-1 text-sm">
{members.map((member) => (
<li key={member.user.email}>
{displayName(member.user.username, member.user.email)}
{member.user.username && (
<span className="ml-2 text-xs text-slate-500">
{member.user.email}
</span>
)}
</li>
))}
</ul>
)}
<MemberSection calendarId={id} />
</Card>
<Card>
@@ -112,4 +81,4 @@ export default async function AdminCalendarPage({ params }: PageProps) {
</Card>
</AppShell>
);
}
}