import { useState, type FormEvent } from 'react'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; import { useCategories, useCreateAsset, useLocations } from '@/api/referentiel'; import { Button } from '@/components/ui/button'; import { construireArbre } from '@/lib/lieux'; interface LigneOrgane { cle: number; typeId: string; designation: string; } /** Écran 4 des maquettes R1 — le parcours de recette : identité → * rattachement (site → zone) → organes ligne à ligne. QR généré à la création. */ export default function PageNouvelAscenseur() { const navigate = useNavigate(); const [params] = useSearchParams(); const { data: locations } = useLocations(); const { data: categories } = useCategories(); const creation = useCreateAsset(); const sites = construireArbre(locations ?? []); const [siteId, setSiteId] = useState(params.get('site') ?? ''); const [organes, setOrganes] = useState([ { cle: 1, typeId: '', designation: '' }, ]); const siteChoisi = sites.find((s) => s.id === siteId); const equipements = (categories ?? []).filter((c) => c.kind === 'EQUIPMENT' && c.isActive); const typesOrganes = (categories ?? []).filter( (c) => c.kind === 'COMPONENT_TYPE' && c.isActive, ); const surEnvoi = (e: FormEvent) => { e.preventDefault(); const donnees = new FormData(e.currentTarget); const champ = (nom: string) => String(donnees.get(nom) ?? '').trim(); const dateMes = champ('commissionedAt'); creation.mutate( { reference: champ('reference'), brand: champ('brand'), model: champ('model') || undefined, serialNumber: champ('serialNumber') || undefined, commissionedAt: dateMes ? new Date(dateMes).toISOString() : undefined, loadKg: champ('loadKg') ? Number(champ('loadKg')) : undefined, floors: champ('floors') ? Number(champ('floors')) : undefined, categoryId: champ('categoryId'), locationId: champ('locationId'), components: organes .filter((o) => o.typeId) .map((o) => ({ typeId: o.typeId, designation: o.designation || undefined })), }, { onSuccess: (asset) => navigate(`/ascenseurs/${asset.id}`) }, ); }; return (
Ascenseurs / Nouvel ascenseur

Nouvel ascenseur

1 · Identité

2 · Rattachement

3 · Organes{' '} — suivis individuellement (pannes par organe, essais réglementaires)

{organes.map((organe, index) => (
setOrganes((o) => o.map((x) => x.cle === organe.cle ? { ...x, designation: e.target.value } : x, ), ) } />
))}
{creation.isError ? (

{creation.error.message}

) : null}
); }