diff --git a/src/app/dashboard/events/[id]/page.tsx b/src/app/dashboard/events/[id]/page.tsx index b5fbb3c..ceddc15 100644 --- a/src/app/dashboard/events/[id]/page.tsx +++ b/src/app/dashboard/events/[id]/page.tsx @@ -18,6 +18,7 @@ import { MapPin, Paperclip, Pencil, + Phone, Ticket, UserRoundPlus, UsersRound, @@ -297,19 +298,34 @@ export default async function EventDetailPage({ l'annuaire des membres, et rappelle que la réunion est ouverte. */} {!r.userId && ( - + invité )} {/* Cliquable : celui qui consulte cette liste pour relancer quelqu'un est le plus souvent sur son - téléphone, la veille de la réunion. */} + téléphone, la veille de la réunion. + Même écriture que les inscrits d'un événement — + icône, taille et couleur : les deux écrans + montrent la même chose, ils doivent la montrer de + la même façon. */} {telephone && ( - {telephone} + )} diff --git a/src/components/slot-manager.tsx b/src/components/slot-manager.tsx index 4a73484..1044df2 100644 --- a/src/components/slot-manager.tsx +++ b/src/components/slot-manager.tsx @@ -1,5 +1,6 @@ "use client"; +import { Mail, Phone } from "lucide-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -128,14 +129,27 @@ export function SlotManager({ async function deleteSlot(id: string) { if (!confirm("Supprimer ce créneau et ses inscriptions ?")) return; - await api(`/api/slots/${id}`, { method: "DELETE" }); - router.refresh(); + setBusySlotId(id); + setError(null); + try { + await api(`/api/slots/${id}`, { method: "DELETE" }); + router.refresh(); + } catch (err) { + setError((err as Error).message); + } finally { + setBusySlotId(null); + } } async function removeSignup(id: string) { if (!confirm("Retirer cette inscription ?")) return; - await api(`/api/signups/${id}`, { method: "DELETE" }); - router.refresh(); + setError(null); + try { + await api(`/api/signups/${id}`, { method: "DELETE" }); + router.refresh(); + } catch (err) { + setError((err as Error).message); + } } return ( @@ -154,16 +168,21 @@ export function SlotManager({ )} + {/* Hors du formulaire d'ajout : il n'était rendu que si celui-ci était + ouvert, alors que la duplication, l'enregistrement, la suppression + d'un créneau et le retrait d'un inscrit alimentent le même `error`. + Une duplication qui échouait ne disait donc rien du tout. */} + {error && ( +

+ {error} +

+ )} + {canManage && showAdd && (
- {error && ( -

- {error} -

- )}
{editingId === slot.id ? "Fermer" : "Modifier"} @@ -278,14 +297,14 @@ export function SlotManager({ type="button" onClick={() => duplicateSlot(slot)} disabled={busySlotId === slot.id} - className="min-h-8 rounded px-1 text-xs font-semibold text-slate-600 transition-colors hover:text-brand-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:opacity-50" + className="min-h-11 rounded px-2 text-xs font-semibold text-slate-600 transition-colors hover:text-brand-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:opacity-50" > {busySlotId === slot.id ? "Copie…" : "Dupliquer"} @@ -400,48 +419,83 @@ export function SlotManager({ téléphone, pour joindre quelqu'un. */} {slot.signups.length > 0 && (
-

+

{slot.signups.length} personne {slot.signups.length > 1 ? "s" : ""} inscrite {slot.signups.length > 1 ? "s" : ""}

-
{canManage && (