diff --git a/src/app/admin/open-day/page.tsx b/src/app/admin/open-day/page.tsx index dfa0f06..6b86889 100644 --- a/src/app/admin/open-day/page.tsx +++ b/src/app/admin/open-day/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useMemo, useCallback } from "react"; import { - Plus, X, Loader2, Calendar, Trash2, Ban, CheckCircle2, + Plus, X, Loader2, Calendar, Trash2, Ban, CheckCircle2, RotateCcw, } from "lucide-react"; import { adminFetch } from "@/lib/csrf"; @@ -31,6 +31,7 @@ interface OpenDayClass { cancelled: boolean; sortOrder: number; bookingCount: number; + maxParticipants: number; } @@ -97,7 +98,7 @@ function EventSettings({ /> -
+
- +
+
+ +
- + onChange({ minBookings: parseInt(e.target.value) || 1 })} className="w-full rounded-lg border border-white/10 bg-neutral-800 px-4 py-2.5 text-white outline-none focus:border-gold transition-colors" /> +

Если записей меньше — занятие можно отменить

@@ -179,39 +184,41 @@ function ClassCell({ const [editing, setEditing] = useState(false); const [trainer, setTrainer] = useState(cls.trainer); const [style, setStyle] = useState(cls.style); + const [endTime, setEndTime] = useState(cls.endTime); + const [maxPart, setMaxPart] = useState(cls.maxParticipants); const atRisk = cls.bookingCount < minBookings && !cls.cancelled; function save() { if (trainer.trim() && style.trim()) { - onUpdate(cls.id, { trainer: trainer.trim(), style: style.trim() }); + onUpdate(cls.id, { trainer: trainer.trim(), style: style.trim(), endTime, maxParticipants: maxPart }); setEditing(false); } } + const selectCls = "w-full rounded-md border border-white/10 bg-neutral-800 px-2 py-1 text-xs text-white outline-none focus:border-gold [color-scheme:dark]"; + if (editing) { return (
- - setStyle(e.target.value)} className={selectCls}> - {styles.map((s) => ( - - ))} + {styles.map((s) => )} + +
+
+ + setEndTime(e.target.value)} className={selectCls} /> +
+
+ + setMaxPart(parseInt(e.target.value) || 0)} placeholder="0 = без лимита" className={selectCls} /> +
+