import { useAuth } from "@/_core/hooks/useAuth"; import { EtatBadge, HebergementBadge, FacturationBadge } from "@/components/EtatBadge"; import SonumLayout from "@/components/SonumLayout"; import { trpc } from "@/lib/trpc"; import { Building2, ChevronDown, ChevronRight, Edit3, Eye, EyeOff, Pencil, Plus, Save, Trash2, X, } from "lucide-react"; import { useState } from "react"; import { useLocation } from "wouter"; import { toast } from "sonner"; import RattacherSolutionModal from "@/components/RattacherSolutionModal"; export default function MesEtablissements() { const { user } = useAuth(); const [, navigate] = useLocation(); const [openEtab, setOpenEtab] = useState(null); const [editMode, setEditMode] = useState(null); const [rattacherEtab, setRattacherEtab] = useState<{ id: number; nom: string } | null>(null); const etablissementsQuery = trpc.etablissements.mesEtablissements.useQuery(); const utils = trpc.useUtils(); const toggleAccordion = (id: number) => { setOpenEtab(openEtab === id ? null : id); setEditMode(null); }; if (etablissementsQuery.isLoading) { return (
); } const etablissements = etablissementsQuery.data ?? []; return (
{/* En-tête */}

Mes Établissements

Gérez les logiciels de vos établissements rattachés

{etablissements.length} établissement{etablissements.length > 1 ? "s" : ""}
{etablissements.length === 0 ? (

Aucun établissement rattaché

Contactez un gestionnaire SONUM pour rattacher vos établissements.

) : (
{etablissements.map((etab) => ( toggleAccordion(etab.id)} onEditMode={() => setEditMode(editMode === etab.id ? null : etab.id)} onRattacher={() => setRattacherEtab({ id: etab.id, nom: etab.nom })} onViewFiche={() => navigate(`/etablissement/${etab.id}`)} onRefresh={() => utils.etablissements.mesEtablissements.invalidate()} /> ))}
)}
{rattacherEtab && ( setRattacherEtab(null)} onSuccess={() => { setRattacherEtab(null); utils.logiciels.byEtablissement.invalidate({ etablissementId: rattacherEtab.id }); }} /> )}
); } function EtablissementAccordion({ etab, isOpen, isEditMode, onToggle, onEditMode, onRattacher, onViewFiche, onRefresh, }: { etab: any; isOpen: boolean; isEditMode: boolean; onToggle: () => void; onEditMode: () => void; onRattacher: () => void; onViewFiche: () => void; onRefresh: () => void; }) { const logicielsQuery = trpc.logiciels.byEtablissement.useQuery( { etablissementId: etab.id }, { enabled: isOpen } ); const deleteMutation = trpc.logiciels.delete.useMutation({ onSuccess: () => { toast.success("Logiciel supprimé"); logicielsQuery.refetch(); }, }); const utils = trpc.useUtils(); return (
{/* En-tête accordéon */} {/* Contenu accordéon */} {isOpen && (
{/* Barre d'actions */}
{/* Tableau des logiciels */} {logicielsQuery.isLoading ? (
) : !logicielsQuery.data?.length ? (

Aucun logiciel renseigné pour cet établissement.

) : (
{isEditMode && ( )} {logicielsQuery.data.map((logiciel) => ( deleteMutation.mutate({ id: logiciel.id, etablissementId: etab.id })} onUpdated={() => logicielsQuery.refetch()} /> ))}
Solution Éditeur Bloc fonctionnel État HébergementActions
)}
)}
); } function LogicielRow({ logiciel, isEditMode, etablissementId, onDelete, onUpdated, }: { logiciel: any; isEditMode: boolean; etablissementId: number; onDelete: () => void; onUpdated: () => void; }) { const [editing, setEditing] = useState(false); const [etat, setEtat] = useState(logiciel.etatDeploiement); const [commentaire, setCommentaire] = useState(logiciel.commentaire ?? ""); const updateMutation = trpc.logiciels.upsert.useMutation({ onSuccess: () => { toast.success("Logiciel mis à jour"); setEditing(false); onUpdated(); }, }); if (editing && isEditMode) { return ( {logiciel.solutionNom} {logiciel.editeurNom} {logiciel.blocFonctionnelNom} setCommentaire(e.target.value)} placeholder="Commentaire..." className="text-xs border border-border rounded px-2 py-1 bg-background w-full" />
); } return ( {logiciel.solutionNom} {logiciel.editeurNom} {logiciel.blocFonctionnelNom && ( {logiciel.blocFonctionnelNom} )} {logiciel.modeHebergement ? : } {isEditMode && (
)} ); }