import { useState, type FormEvent } from 'react'; import { useNavigate } from 'react-router-dom'; import { useCreateLocation, useLocations } from '@/api/referentiel'; import { usePermissions } from '@/auth/use-permissions'; import { CarteGeo } from '@/components/carte-geo'; import { Button } from '@/components/ui/button'; import { Modale } from '@/components/ui/modale'; import { construireArbre } from '@/lib/lieux'; /** Écran 1 des maquettes R1 : liste dense + carte OSM (positions PostGIS). */ export default function PageSites() { const navigate = useNavigate(); const { data: locations } = useLocations(); const { can } = usePermissions(); const [modale, setModale] = useState(false); const sites = construireArbre(locations ?? []); const totalAppareils = sites.reduce((n, s) => n + s.assetCount, 0); return ( <>

Sites

{sites.length} sites · {totalAppareils} ascenseurs
{can('LOCATIONS', 'create') ? ( ) : null}
{sites.map((site) => ( navigate(`/sites/${site.id}`)} style={{ cursor: 'pointer' }} > ))}
Site Ascenseurs Gardien Zones
{site.name} {[site.address, site.city].filter(Boolean).join(', ') || '—'} {site.assetCount} {site.guardianName ?? '—'} {site.zones.length}
s.latitude != null && s.longitude != null) .map((s) => ({ id: s.id, latitude: s.latitude!, longitude: s.longitude!, libelle: `${s.name} · ${s.assetCount}`, onClick: () => navigate(`/sites/${s.id}`), }))} />
); } function NouveauSite({ ouverte, surFermeture, }: { ouverte: boolean; surFermeture: (o: boolean) => void; }) { const creation = useCreateLocation(); const navigate = useNavigate(); const [position, setPosition] = useState<{ lat: number; lng: number } | null>(null); const surEnvoi = (e: FormEvent) => { e.preventDefault(); const donnees = new FormData(e.currentTarget); creation.mutate( { name: String(donnees.get('name')), address: String(donnees.get('address')) || undefined, city: String(donnees.get('city')) || undefined, guardianName: String(donnees.get('guardianName')) || undefined, guardianPhone: String(donnees.get('guardianPhone')) || undefined, latitude: position?.lat, longitude: position?.lng, }, { onSuccess: (site) => { surFermeture(false); navigate(`/sites/${site.id}`); }, }, ); }; return (
setPosition({ lat, lng })} pins={ position ? [{ id: 'nouveau', latitude: position.lat, longitude: position.lng, libelle: 'Nouveau site' }] : [] } />

{position ? `${position.lat} N · ${position.lng} E` : 'Aucune position posée'}

{creation.isError ? (

{creation.error.message}

) : null}
); }