Aktueller Stand
This commit is contained in:
@@ -545,10 +545,20 @@ export default function AdminPanel() {
|
|||||||
<h3 className="text-lg font-semibold">Kategorie bearbeiten</h3>
|
<h3 className="text-lg font-semibold">Kategorie bearbeiten</h3>
|
||||||
<button
|
<button
|
||||||
type="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}
|
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>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<form onSubmit={updateCategory} className="mt-4 space-y-3">
|
<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>
|
<h3 className="text-lg font-semibold">Termin bearbeiten</h3>
|
||||||
<button
|
<button
|
||||||
type="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={() => {
|
onClick={() => {
|
||||||
setEditEvent(null);
|
setEditEvent(null);
|
||||||
setEditError(null);
|
setEditError(null);
|
||||||
setEditStatus(null);
|
setEditStatus(null);
|
||||||
setIsEditOpen(false);
|
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>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<form onSubmit={updateEvent} className="mt-4 space-y-3">
|
<form onSubmit={updateEvent} className="mt-4 space-y-3">
|
||||||
|
|||||||
@@ -1067,12 +1067,16 @@ export default function CalendarBoard() {
|
|||||||
onDragEnter={() => onDragEnter("calendar")}
|
onDragEnter={() => onDragEnter("calendar")}
|
||||||
onDrop={(event) => onDrop(event, "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>
|
<h3 className="text-sm font-semibold text-slate-700">Kalender</h3>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<button
|
<button
|
||||||
type="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")}
|
onClick={() => toggleCollapse("calendar")}
|
||||||
aria-label={collapsed.calendar ? "Kalender aufklappen" : "Kalender zuklappen"}
|
aria-label={collapsed.calendar ? "Kalender aufklappen" : "Kalender zuklappen"}
|
||||||
title={collapsed.calendar ? "Aufklappen" : "Zuklappen"}
|
title={collapsed.calendar ? "Aufklappen" : "Zuklappen"}
|
||||||
@@ -1126,7 +1130,7 @@ export default function CalendarBoard() {
|
|||||||
{data?.user && (
|
{data?.user && (
|
||||||
<button
|
<button
|
||||||
type="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`}
|
aria-label={`Termin am ${arg.date.toLocaleDateString("de-DE")} anlegen`}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -1134,7 +1138,7 @@ export default function CalendarBoard() {
|
|||||||
openFormForDate(arg.date);
|
openFormForDate(arg.date);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
+
|
+Termin
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -1227,12 +1231,16 @@ export default function CalendarBoard() {
|
|||||||
onDragEnter={() => onDragEnter("map")}
|
onDragEnter={() => onDragEnter("map")}
|
||||||
onDrop={(event) => onDrop(event, "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>
|
<h3 className="text-sm font-semibold text-slate-700">Karte</h3>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<button
|
<button
|
||||||
type="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")}
|
onClick={() => toggleCollapse("map")}
|
||||||
aria-label={collapsed.map ? "Karte aufklappen" : "Karte zuklappen"}
|
aria-label={collapsed.map ? "Karte aufklappen" : "Karte zuklappen"}
|
||||||
title={collapsed.map ? "Aufklappen" : "Zuklappen"}
|
title={collapsed.map ? "Aufklappen" : "Zuklappen"}
|
||||||
@@ -1241,10 +1249,23 @@ export default function CalendarBoard() {
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="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)}
|
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>
|
</button>
|
||||||
<div
|
<div
|
||||||
className="drag-handle"
|
className="drag-handle"
|
||||||
@@ -1448,7 +1469,7 @@ export default function CalendarBoard() {
|
|||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<button
|
<button
|
||||||
type="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")}
|
onClick={() => toggleCollapse("list")}
|
||||||
aria-label={collapsed.list ? "Termine aufklappen" : "Termine zuklappen"}
|
aria-label={collapsed.list ? "Termine aufklappen" : "Termine zuklappen"}
|
||||||
title={collapsed.list ? "Aufklappen" : "Zuklappen"}
|
title={collapsed.list ? "Aufklappen" : "Zuklappen"}
|
||||||
@@ -1523,30 +1544,25 @@ export default function CalendarBoard() {
|
|||||||
</div>
|
</div>
|
||||||
{isAdmin && (
|
{isAdmin && (
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<button
|
{bulkSelection.size > 0 && (
|
||||||
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
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="rounded-full border border-slate-200 px-3 py-1 text-xs text-slate-700"
|
className="rounded-full border border-slate-200 px-3 py-1 text-xs text-slate-700"
|
||||||
onClick={() => toggleSelectAllVisible(false)}
|
onClick={() => toggleSelectAllVisible(false)}
|
||||||
disabled={bulkSelection.size === 0}
|
|
||||||
>
|
>
|
||||||
Auswahl löschen
|
Auswahl löschen
|
||||||
</button>
|
</button>
|
||||||
|
)}
|
||||||
|
{bulkSelection.size > 0 && (
|
||||||
<span className="text-xs text-slate-500">
|
<span className="text-xs text-slate-500">
|
||||||
{bulkSelection.size} ausgewählt
|
{bulkSelection.size} ausgewählt
|
||||||
</span>
|
</span>
|
||||||
|
)}
|
||||||
|
{bulkSelection.size > 0 && (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="rounded-full border border-red-200 p-2 text-red-600"
|
className="rounded-full border border-red-200 p-2 text-red-600"
|
||||||
onClick={deleteSelectedEvents}
|
onClick={deleteSelectedEvents}
|
||||||
disabled={bulkSelection.size === 0}
|
|
||||||
aria-label="Ausgewählte löschen"
|
aria-label="Ausgewählte löschen"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
@@ -1562,6 +1578,7 @@ export default function CalendarBoard() {
|
|||||||
<path d="M10 11v6M14 11v6" strokeLinecap="round" />
|
<path d="M10 11v6M14 11v6" strokeLinecap="round" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -1847,10 +1864,12 @@ export default function CalendarBoard() {
|
|||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
type="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)}
|
onClick={() => setDetailsEvent(null)}
|
||||||
|
aria-label="Schließen"
|
||||||
|
title="Schließen"
|
||||||
>
|
>
|
||||||
Schließen
|
<IconClose />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1968,13 +1987,15 @@ export default function CalendarBoard() {
|
|||||||
<h3 className="text-lg font-semibold">Termin bearbeiten</h3>
|
<h3 className="text-lg font-semibold">Termin bearbeiten</h3>
|
||||||
<button
|
<button
|
||||||
type="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={() => {
|
onClick={() => {
|
||||||
setIsEditOpen(false);
|
setIsEditOpen(false);
|
||||||
setEditEvent(null);
|
setEditEvent(null);
|
||||||
}}
|
}}
|
||||||
|
aria-label="Schließen"
|
||||||
|
title="Schließen"
|
||||||
>
|
>
|
||||||
Schließen
|
<IconClose />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<form onSubmit={updateEvent} className="mt-4 space-y-3">
|
<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>
|
<h3 className="text-lg font-semibold">Karte</h3>
|
||||||
<button
|
<button
|
||||||
type="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)}
|
onClick={() => setMapFullscreen(false)}
|
||||||
|
aria-label="Schließen"
|
||||||
|
title="Schließen"
|
||||||
>
|
>
|
||||||
Schließen
|
<IconClose />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-3 flex flex-wrap items-center gap-2 text-xs text-slate-600">
|
<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() {
|
function IconChevronDown() {
|
||||||
return (
|
return (
|
||||||
<svg viewBox="0 0 24 24" className="h-4 w-4" fill="none" stroke="currentColor" strokeWidth="2">
|
<svg viewBox="0 0 24 24" className="h-4 w-4" fill="none" stroke="currentColor" strokeWidth="2">
|
||||||
|
|||||||
@@ -290,10 +290,20 @@ export default function EventForm({
|
|||||||
<h3 className="text-lg font-semibold">Neuen Termin anlegen</h3>
|
<h3 className="text-lg font-semibold">Neuen Termin anlegen</h3>
|
||||||
<button
|
<button
|
||||||
type="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)}
|
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>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{data?.user?.role === "USER" && (
|
{data?.user?.role === "USER" && (
|
||||||
|
|||||||
BIN
screenshots/Screenshot 2026-01-17 223049.png
Normal file
BIN
screenshots/Screenshot 2026-01-17 223049.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
Reference in New Issue
Block a user