Aktueller Stand

This commit is contained in:
2026-01-17 22:32:49 +01:00
parent 67ba95ae23
commit 68b63b8f06
4 changed files with 120 additions and 59 deletions

View File

@@ -545,10 +545,20 @@ export default function AdminPanel() {
<h3 className="text-lg font-semibold">Kategorie bearbeiten</h3>
<button
type="button"
className="text-sm text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600 hover:bg-slate-100"
onClick={closeCategoryModal}
aria-label="Schließen"
title="Schließen"
>
Schließen
<svg
viewBox="0 0 24 24"
className="h-4 w-4"
fill="none"
stroke="currentColor"
strokeWidth="2"
>
<path d="M6 6l12 12M18 6l-12 12" strokeLinecap="round" />
</svg>
</button>
</div>
<form onSubmit={updateCategory} className="mt-4 space-y-3">
@@ -655,15 +665,25 @@ export default function AdminPanel() {
<h3 className="text-lg font-semibold">Termin bearbeiten</h3>
<button
type="button"
className="text-sm text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600 hover:bg-slate-100"
onClick={() => {
setEditEvent(null);
setEditError(null);
setEditStatus(null);
setIsEditOpen(false);
}}
aria-label="Schließen"
title="Schließen"
>
Schließen
<svg
viewBox="0 0 24 24"
className="h-4 w-4"
fill="none"
stroke="currentColor"
strokeWidth="2"
>
<path d="M6 6l12 12M18 6l-12 12" strokeLinecap="round" />
</svg>
</button>
</div>
<form onSubmit={updateEvent} className="mt-4 space-y-3">

View File

@@ -1067,12 +1067,16 @@ export default function CalendarBoard() {
onDragEnter={() => onDragEnter("calendar")}
onDrop={(event) => onDrop(event, "calendar")}
>
<div className="mb-3 flex items-center justify-between">
<div
className={`flex items-center justify-between ${
collapsed.calendar ? "" : "mb-3"
}`}
>
<h3 className="text-sm font-semibold text-slate-700">Kalender</h3>
<div className="flex items-center gap-2">
<button
type="button"
className="rounded-full border border-slate-200 px-2 py-1 text-xs text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600"
onClick={() => toggleCollapse("calendar")}
aria-label={collapsed.calendar ? "Kalender aufklappen" : "Kalender zuklappen"}
title={collapsed.calendar ? "Aufklappen" : "Zuklappen"}
@@ -1126,7 +1130,7 @@ export default function CalendarBoard() {
{data?.user && (
<button
type="button"
className="rounded-full border border-slate-200 bg-white/80 px-2 py-0.5 text-xs text-slate-600 hover:bg-slate-100"
className="rounded-full border border-slate-200 bg-white/70 px-2 py-0.5 text-[11px] font-medium text-slate-500 hover:bg-slate-100"
aria-label={`Termin am ${arg.date.toLocaleDateString("de-DE")} anlegen`}
onClick={(event) => {
event.preventDefault();
@@ -1134,7 +1138,7 @@ export default function CalendarBoard() {
openFormForDate(arg.date);
}}
>
+
+Termin
</button>
)}
</div>
@@ -1227,12 +1231,16 @@ export default function CalendarBoard() {
onDragEnter={() => onDragEnter("map")}
onDrop={(event) => onDrop(event, "map")}
>
<div className="mb-3 flex items-center justify-between">
<div
className={`flex items-center justify-between ${
collapsed.map ? "" : "mb-3"
}`}
>
<h3 className="text-sm font-semibold text-slate-700">Karte</h3>
<div className="flex items-center gap-2">
<button
type="button"
className="rounded-full border border-slate-200 px-2 py-1 text-xs text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600"
onClick={() => toggleCollapse("map")}
aria-label={collapsed.map ? "Karte aufklappen" : "Karte zuklappen"}
title={collapsed.map ? "Aufklappen" : "Zuklappen"}
@@ -1241,10 +1249,23 @@ export default function CalendarBoard() {
</button>
<button
type="button"
className="rounded-full border border-slate-200 px-2 py-1 text-xs text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600"
onClick={() => setMapFullscreen(true)}
aria-label="Karte im Vollbild öffnen"
title="Vollbild"
>
Vollbild
<svg
viewBox="0 0 24 24"
className="h-4 w-4"
fill="none"
stroke="currentColor"
strokeWidth="2"
>
<path d="M4 9V4h5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M20 9V4h-5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M4 15v5h5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M20 15v5h-5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
</button>
<div
className="drag-handle"
@@ -1448,7 +1469,7 @@ export default function CalendarBoard() {
<div className="flex items-center gap-2">
<button
type="button"
className="rounded-full border border-slate-200 px-2 py-1 text-xs text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600"
onClick={() => toggleCollapse("list")}
aria-label={collapsed.list ? "Termine aufklappen" : "Termine zuklappen"}
title={collapsed.list ? "Aufklappen" : "Zuklappen"}
@@ -1523,45 +1544,41 @@ export default function CalendarBoard() {
</div>
{isAdmin && (
<div className="flex flex-wrap items-center gap-2">
<button
type="button"
className="rounded-full border border-slate-200 px-3 py-1 text-xs text-slate-700"
onClick={() => toggleSelectAllVisible(true)}
disabled={displayedEvents.length === 0}
>
Alle markieren
</button>
<button
type="button"
className="rounded-full border border-slate-200 px-3 py-1 text-xs text-slate-700"
onClick={() => toggleSelectAllVisible(false)}
disabled={bulkSelection.size === 0}
>
Auswahl löschen
</button>
<span className="text-xs text-slate-500">
{bulkSelection.size} ausgewählt
</span>
<button
type="button"
className="rounded-full border border-red-200 p-2 text-red-600"
onClick={deleteSelectedEvents}
disabled={bulkSelection.size === 0}
aria-label="Ausgewählte löschen"
>
<svg
viewBox="0 0 24 24"
className="h-4 w-4"
fill="none"
stroke="currentColor"
strokeWidth="2"
{bulkSelection.size > 0 && (
<button
type="button"
className="rounded-full border border-slate-200 px-3 py-1 text-xs text-slate-700"
onClick={() => toggleSelectAllVisible(false)}
>
<path d="M3 6h18" strokeLinecap="round" />
<path d="M8 6V4h8v2" strokeLinecap="round" />
<path d="M19 6l-1 14H6L5 6" strokeLinecap="round" />
<path d="M10 11v6M14 11v6" strokeLinecap="round" />
</svg>
</button>
Auswahl löschen
</button>
)}
{bulkSelection.size > 0 && (
<span className="text-xs text-slate-500">
{bulkSelection.size} ausgewählt
</span>
)}
{bulkSelection.size > 0 && (
<button
type="button"
className="rounded-full border border-red-200 p-2 text-red-600"
onClick={deleteSelectedEvents}
aria-label="Ausgewählte löschen"
>
<svg
viewBox="0 0 24 24"
className="h-4 w-4"
fill="none"
stroke="currentColor"
strokeWidth="2"
>
<path d="M3 6h18" strokeLinecap="round" />
<path d="M8 6V4h8v2" strokeLinecap="round" />
<path d="M19 6l-1 14H6L5 6" strokeLinecap="round" />
<path d="M10 11v6M14 11v6" strokeLinecap="round" />
</svg>
</button>
)}
</div>
)}
</div>
@@ -1847,10 +1864,12 @@ export default function CalendarBoard() {
)}
<button
type="button"
className="text-sm text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600 hover:bg-slate-100"
onClick={() => setDetailsEvent(null)}
aria-label="Schließen"
title="Schließen"
>
Schließen
<IconClose />
</button>
</div>
</div>
@@ -1968,13 +1987,15 @@ export default function CalendarBoard() {
<h3 className="text-lg font-semibold">Termin bearbeiten</h3>
<button
type="button"
className="text-sm text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600 hover:bg-slate-100"
onClick={() => {
setIsEditOpen(false);
setEditEvent(null);
}}
aria-label="Schließen"
title="Schließen"
>
Schließen
<IconClose />
</button>
</div>
<form onSubmit={updateEvent} className="mt-4 space-y-3">
@@ -2117,10 +2138,12 @@ export default function CalendarBoard() {
<h3 className="text-lg font-semibold">Karte</h3>
<button
type="button"
className="text-sm text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600 hover:bg-slate-100"
onClick={() => setMapFullscreen(false)}
aria-label="Schließen"
title="Schließen"
>
Schließen
<IconClose />
</button>
</div>
<div className="mt-3 flex flex-wrap items-center gap-2 text-xs text-slate-600">
@@ -2454,6 +2477,14 @@ function IconGrip() {
);
}
function IconClose() {
return (
<svg viewBox="0 0 24 24" className="h-4 w-4" fill="none" stroke="currentColor" strokeWidth="2">
<path d="M6 6l12 12M18 6l-12 12" strokeLinecap="round" />
</svg>
);
}
function IconChevronDown() {
return (
<svg viewBox="0 0 24 24" className="h-4 w-4" fill="none" stroke="currentColor" strokeWidth="2">

View File

@@ -290,10 +290,20 @@ export default function EventForm({
<h3 className="text-lg font-semibold">Neuen Termin anlegen</h3>
<button
type="button"
className="text-sm text-slate-600"
className="rounded-full border border-slate-200 p-2 text-slate-600 hover:bg-slate-100"
onClick={() => setModalOpen(false)}
aria-label="Schließen"
title="Schließen"
>
Schließen
<svg
viewBox="0 0 24 24"
className="h-4 w-4"
fill="none"
stroke="currentColor"
strokeWidth="2"
>
<path d="M6 6l12 12M18 6l-12 12" strokeLinecap="round" />
</svg>
</button>
</div>
{data?.user?.role === "USER" && (