@mostajs/flotte-ui 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,7 +3,17 @@
3
3
  Format [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) · [SemVer](https://semver.org/lang/fr/).
4
4
  Auteur : Dr Hamid MADANI <drmdh@msn.com>
5
5
 
6
- ## [0.2.0] — non publiée
6
+ ## [0.2.1] — non publiée
7
+ ### Added
8
+ - Option `pieces: false` du rendu et des lecteurs. Elle s'adresse à une application qui ne reçoit pas de fichiers :
9
+ - plus de champ fichier, et des formulaires urlencoded, non multipart ;
10
+ - les lecteurs ignorent une pièce qui n'a pas été offerte.
11
+
12
+ Elle répond à la console de Guerway, qui n'accepte que l'urlencoded. Essai T-FUI-27.
13
+ - Option de rendu `codeSite(code)` : le code de station affiché, choisi par l'application. Guerway saisit `alg-01`
14
+ et affiche `ALG-01`. Essai T-FUI-28.
15
+
16
+ ## [0.2.0] — 2026-10-24
7
17
  Les planches A à F de Guerway (`GUERWAY/docs/L0/maquette-flotte/`, exigences ECR-16.29 à 16.41). Demande
8
18
  `@mostajs/flotte` **^0.5.0** (`TRANSITIONS`, `transitionsDepuis`, pièce d'un plein).
9
19
  ### Added
package/llms.txt CHANGED
@@ -38,6 +38,7 @@ EXPORTS
38
38
  rendreFormulaireStatut(fiche, transition, opts) ; lireStatut(corps, transition) -> { donnees: { motif, confirme }, erreurs }
39
39
  FORMULAIRES { plan, intervention, cloture, plein, releve, echeance } ; rendreFormulaire(nom, { fiche, declarations?, valeurs?,
40
40
  erreurs?, refus? }, opts + action) ; lireFormulaire(nom, corps, { declarations? }) -> { donnees, erreurs }
41
+ codeSite?: (code) → code affiché (rendu, 0.2.1) ; pieces: false (rendu et lecteurs, 0.2.1) : ni champ fichier ni multipart, pour une application sans dépôt de fichiers
41
42
  erreurDeFlotte(e) -> { champ, code } le refus du moteur sous son champ (RECUL → km, DOUBLON → immatriculation…)
42
43
  rendreMonVehicule(vm, { liens: { plein, releve } }) ; rendreChoixVehicule(aptitudes, { nom?, choisi? })
43
44
  rendreRefusDepart(depart, { lien }) ; rendreDisponibles(aptitudes, { exclure })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/flotte-ui",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Écrans HTML du carnet du parc (@mostajs/flotte), sans React ni script : tableau de bord, fiche du véhicule pleine page à sept onglets (documents, entretiens, affectations, pleins et relevés, coûts, historique), formulaires d'écriture et leurs lecteurs, « Mon véhicule » du livreur, aptitude en tournée. Vue-modèle lue dans l'API de flotte, rendue avec le kit de composants de l'application (sa charte) ou un kit sobre par défaut.",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
package/src/commun.js CHANGED
@@ -7,8 +7,11 @@ import { KIT_DEFAUT } from './kit.js';
7
7
 
8
8
  export const BADGE = { en_service: ['vert', 'coche'], a_l_atelier: ['orange', 'cle'], immobilise: ['rouge', 'croix'], reforme: ['gris', 'document'] };
9
9
 
10
- /** Le contexte de rendu : kit complété, traduction, formats. opts : { kit, t, locale, liens, droits, declarations, devise } */
11
- export function contexte({ kit = {}, t, locale = 'fr-FR', liens = {}, droits = {}, declarations = {}, devise = '' } = {}) {
10
+ /**
11
+ * Le contexte de rendu : kit complété, traduction, formats. opts : { kit, t, locale, liens, droits, declarations, devise,
12
+ * codeSite? (code → code affiché : Guerway saisit alg-01 et affiche ALG-01) }
13
+ */
14
+ export function contexte({ kit = {}, t, locale = 'fr-FR', liens = {}, droits = {}, declarations = {}, devise = '', codeSite } = {}) {
12
15
  const k = { ...KIT_DEFAUT, ...kit, classes: { ...KIT_DEFAUT.classes, ...(kit.classes || {}) } };
13
16
  const nf = (x) => new Intl.NumberFormat(locale).format(x);
14
17
  const nf2 = (x) => new Intl.NumberFormat(locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(x);
@@ -32,7 +35,8 @@ export function contexte({ kit = {}, t, locale = 'fr-FR', liens = {}, droits = {
32
35
  if (Number.isFinite(v.n)) v.n = nf(v.n);
33
36
  return lib(famille, m.code, v);
34
37
  };
35
- return { k, c: k.classes, nf, nf2, argent, devise, tx, lib, jj, phrase, liens, droits, peutGerer: Boolean(droits.gerer), locale };
38
+ const site = (c) => (c === null || c === undefined || c === '' ? '—' : typeof codeSite === 'function' ? String(codeSite(c)) : String(c));
39
+ return { k, c: k.classes, nf, nf2, argent, devise, tx, lib, jj, phrase, site, liens, droits, peutGerer: Boolean(droits.gerer), locale };
36
40
  }
37
41
 
38
42
  const nonVide = ([, v]) => v !== undefined && v !== null && v !== '';
@@ -99,13 +99,14 @@ const tousAttributs = (declarations) => {
99
99
  const libelleAttribut = (x, a) => { const l = x.tx(`formulaire.attribut.${a}`); return l === `formulaire.attribut.${a}` ? a : l; };
100
100
 
101
101
  /**
102
- * Le formulaire « Nouveau véhicule » ou « Modifier » (multipart : il porte les pièces). Rend { titre, sousTitre, corps }.
102
+ * Le formulaire « Nouveau véhicule » ou « Modifier » (multipart : il porte les pièces ; `opts.pieces: false` les retire,
103
+ * pour une application qui ne reçoit pas de fichiers). Rend { titre, sousTitre, corps }.
103
104
  * vm : { mode: 'nouveau'|'modifier', vehicule? (lu par flotte.lire), declarations, sites, valeurs?, erreurs?, refus? }
104
105
  * opts : ceux du rendu, et liens.enregistrer (l'action POST), liens.base (Annuler).
105
106
  */
106
107
  export function rendreFormulaireVehicule(vm, opts = {}) {
107
108
  const x = contexte({ ...opts, declarations: vm.declarations || opts.declarations });
108
- const D = vm.declarations || {}, sites = vm.sites || {}, nouveau = vm.mode !== 'modifier', v = vm.vehicule || null;
109
+ const D = vm.declarations || {}, sites = vm.sites || {}, nouveau = vm.mode !== 'modifier', v = vm.vehicule || null, pieces = opts.pieces !== false;
109
110
  const base = nouveau ? { mode: 'propre' } : {
110
111
  immatriculation: v.immatriculation, chassis: v.chassis ?? '', miseEnService: v.miseEnService ?? '', site: v.site ?? '', mode: v.mode ?? 'propre',
111
112
  ...Object.fromEntries(Object.entries(v.attributs || {}).map(([a, n]) => [`attributs.${a}`, n])),
@@ -144,15 +145,15 @@ export function rendreFormulaireVehicule(vm, opts = {}) {
144
145
  const lignes = Object.entries(D.echeances || {}).map(([t, d]) => {
145
146
  const n = (k) => `echeance.${t}.${k}`;
146
147
  const cell = (k, forme) => champ(x, { nom: n(k), libelle: `${x.lib('echeance', t)} — ${x.tx(`formulaire.champ.${k}`)}`, forme, valeur: val[n(k)], erreur: e[n(k)], cache: true });
147
- return `<tr><th scope="row">${esc(x.lib('echeance', t))}${d.obligatoire ? ` ${x.k.badge(x.tx('documents.obligatoire'), 'rouge')}` : ''}</th><td>${cell('debut', 'date')}</td><td>${cell('fin', 'date')}</td><td>${cell('piece', 'fichier')}</td></tr>`;
148
+ return `<tr><th scope="row">${esc(x.lib('echeance', t))}${d.obligatoire ? ` ${x.k.badge(x.tx('documents.obligatoire'), 'rouge')}` : ''}</th><td>${cell('debut', 'date')}</td><td>${cell('fin', 'date')}</td>${pieces ? `<td>${cell('piece', 'fichier')}</td>` : ''}</tr>`;
148
149
  }).join('');
149
- const docs = lignes ? `<div class="fl-defile"><table class="${esc(x.c.tableau)} fl-docs-form"><thead><tr><th scope="col">${esc(x.tx('formulaire.document'))}</th><th scope="col">${esc(x.tx('formulaire.champ.debut'))}</th><th scope="col">${esc(x.tx('formulaire.champ.fin'))}</th><th scope="col">${esc(x.tx('formulaire.champ.piece'))}</th></tr></thead><tbody>${lignes}</tbody></table></div>` : '';
150
+ const docs = lignes ? `<div class="fl-defile"><table class="${esc(x.c.tableau)} fl-docs-form"><thead><tr><th scope="col">${esc(x.tx('formulaire.document'))}</th><th scope="col">${esc(x.tx('formulaire.champ.debut'))}</th><th scope="col">${esc(x.tx('formulaire.champ.fin'))}</th>${pieces ? `<th scope="col">${esc(x.tx('formulaire.champ.piece'))}</th>` : ''}</tr></thead><tbody>${lignes}</tbody></table></div>` : '';
150
151
  suite = `<div class="fl-form-bas">${groupe(3, x.tx('formulaire.compteur'), compteur)}${groupe(4, x.tx('formulaire.documents'), docs, 'fl-large-groupe')}</div>`;
151
152
  }
152
153
  const action = (x.liens.enregistrer ?? '');
153
154
  const annuler = nouveau ? x.liens.base : (x.liens.fiche ? x.liens.fiche(v.id, '') : x.liens.base);
154
155
  const corps = `<div class="fl-ecran fl-formulaire">${general ? bandeauKo(x, esc(texteRefus(x, general))) : ''}${e.attributs ? bandeauKo(x, esc(texteErreur(x, e.attributs))) : ''}`
155
- + `<form method="post" action="${esc(action)}" enctype="multipart/form-data" novalidate><div class="fl-form-haut">${groupe(1, x.tx('formulaire.identification'), ident)}${groupe(2, x.tx('formulaire.rattachement'), rattachement)}</div>`
156
+ + `<form method="post" action="${esc(action)}" ${pieces ? ' enctype="multipart/form-data"' : ''} novalidate><div class="fl-form-haut">${groupe(1, x.tx('formulaire.identification'), ident)}${groupe(2, x.tx('formulaire.rattachement'), rattachement)}</div>`
156
157
  + `${suite}${boutons(x, annuler, nouveau ? x.tx('formulaire.inscrire') : x.tx('action.enregistrer'))}</form></div>`;
157
158
  return {
158
159
  titre: nouveau ? x.tx('formulaire.nouveau') : x.tx('formulaire.modifier', { plaque: v.immatriculation }),
@@ -165,7 +166,7 @@ export function rendreFormulaireVehicule(vm, opts = {}) {
165
166
  * miseEnService, site, mode, kmDepart, echeances: [{ type, debut, fin?, piece? }] } — inscrire(donnees), puis
166
167
  * relever(kmDepart) et poserEcheance pour chaque échéance. Le code est celui saisi, sinon la plaque sans espaces.
167
168
  */
168
- export function lireFormulaireVehicule(corps = {}, { declarations = {} } = {}) {
169
+ export function lireFormulaireVehicule(corps = {}, { declarations = {}, pieces = true } = {}) {
169
170
  const erreurs = {}, d = {};
170
171
  const imm = brut(corps.immatriculation);
171
172
  if (!imm) erreurs.immatriculation = 'requis'; else d.immatriculation = String(imm).replace(/\s+/g, ' ');
@@ -193,7 +194,7 @@ export function lireFormulaireVehicule(corps = {}, { declarations = {} } = {}) {
193
194
  const n = (k) => corps[`echeance.${t}.${k}`];
194
195
  if (brut(n('debut')) === '') continue;
195
196
  const e = { type: t };
196
- for (const [k, forme] of [['debut', 'date'], ['fin', 'date'], ['piece', 'fichier']]) {
197
+ for (const [k, forme] of [['debut', 'date'], ['fin', 'date'], ...(pieces ? [['piece', 'fichier']] : [])]) {
197
198
  const [val, err] = lireChamp(forme, n(k), k === 'debut');
198
199
  if (err) erreurs[`echeance.${t}.${k}`] = err; else if (val !== undefined) e[k] = val;
199
200
  }
@@ -283,11 +284,11 @@ export const FORMULAIRES = gele({
283
284
  });
284
285
 
285
286
  /** Lit un formulaire de FORMULAIRES : { donnees, erreurs } ; un champ vide non requis est omis (le moteur prend son défaut). */
286
- export function lireFormulaire(nom, corps = {}, { declarations } = {}) {
287
+ export function lireFormulaire(nom, corps = {}, { declarations, pieces = true } = {}) {
287
288
  const champs = FORMULAIRES[nom];
288
289
  if (!champs) throw new Error(`flotte-ui : formulaire inconnu : ${nom}`);
289
290
  const donnees = {}, erreurs = {};
290
- for (const c of champs) {
291
+ for (const c of champs.filter((y) => pieces || y.forme !== 'fichier')) {
291
292
  const [val, err] = lireChamp(c.forme === 'long' || c.forme === 'choix' ? 'texte' : c.forme, corps[c.nom], c.requis);
292
293
  if (err) { erreurs[c.nom] = err; continue; }
293
294
  if (val === undefined) continue;
@@ -300,7 +301,7 @@ export function lireFormulaire(nom, corps = {}, { declarations } = {}) {
300
301
 
301
302
  /**
302
303
  * Rend un formulaire de FORMULAIRES pour la fiche `fiche` (construireFiche). Rend { titre, corps }.
303
- * vm : { fiche, declarations?, valeurs?, erreurs?, refus? } ; opts : ceux du rendu, plus { action } (POST).
304
+ * vm : { fiche, declarations?, valeurs?, erreurs?, refus? } ; opts : ceux du rendu, plus { action } (POST), pieces? (false : sans champ fichier ni multipart).
304
305
  */
305
306
  export function rendreFormulaire(nom, vm = {}, opts = {}) {
306
307
  const champs = FORMULAIRES[nom];
@@ -314,8 +315,9 @@ export function rendreFormulaire(nom, vm = {}, opts = {}) {
314
315
  plans: [['', x.tx('formulaire.champ.aucunPlan')], ...(f?.plans || []).map((p) => [p.id, p.libelle])],
315
316
  echeances: Object.keys(D.echeances || {}).map((t) => [t, x.lib('echeance', t)]),
316
317
  };
317
- const fichier = champs.some((c) => c.forme === 'fichier');
318
- const html = champs.map((c) => champ(x, {
318
+ const offerts = champs.filter((c) => opts.pieces !== false || c.forme !== 'fichier');
319
+ const fichier = offerts.some((c) => c.forme === 'fichier');
320
+ const html = offerts.map((c) => champ(x, {
319
321
  nom: c.nom, libelle: x.tx(`formulaire.champ.${c.libelle || c.nom}`), forme: c.forme, requis: Boolean(c.requis), valeur: val[c.nom], erreur: e[c.nom],
320
322
  options: c.choix ? options[c.choix] : [], suffixe: c.nom === 'km' ? 'km' : c.nom === 'litres' ? 'L' : (c.nom === 'montant' || c.nom === 'cout') && x.devise ? x.devise : undefined,
321
323
  aide: c.nom === 'km' && f && f.km !== null && f.km !== undefined ? x.tx('formulaire.dernierReleve', { km: x.nf(f.km) }) : undefined,
package/src/rendu.js CHANGED
@@ -77,7 +77,7 @@ function liste(x, vm) {
77
77
  const cap = l.capacite.kg !== null ? capacite(x, l.capacite) : '';
78
78
  return `<tr${l.id === choisi ? ' class="choisi"' : ''}><td class="fl-plaque"><span class="fl-mini">${x.k.icone('camion', 18)}</span><a href="${esc(acts[0][0])}" dir="ltr">${esc(l.plaque)}</a></td>`
79
79
  + `<td class="fl-nowrap">${esc(x.lib('type', l.type))}${cap ? `<br><small class="fl-doux">${esc(cap)}</small>` : ''}</td>`
80
- + `<td class="fl-nowrap">${esc(l.site ?? '—')}${l.region ? `<br><small class="fl-doux">(${esc(l.region)})</small>` : ''}</td>`
80
+ + `<td class="fl-nowrap">${esc(x.site(l.site))}${l.region ? `<br><small class="fl-doux">(${esc(l.region)})</small>` : ''}</td>`
81
81
  + `<td>${l.conducteur ? esc(l.conducteur.nom) : `<span class="fl-doux">${esc(x.tx('info.aucunChauffeur'))}</span>`}</td>`
82
82
  + `<td>${badgeStatut(x, l.statut)}${l.documentExpire ? `<br><span class="fl-marque">${esc(x.tx('documentExpire'))}</span>` : ''}</td>`
83
83
  + `<td>${dep(l.depart)}</td><td class="fl-nowrap">${l.km !== null ? `${x.nf(l.km)} km` : '—'}</td><td>${menu}</td></tr>`;
@@ -113,7 +113,7 @@ function parSiteHtml(x, vm) {
113
113
  const lignes = vm.parSite.map((s) => {
114
114
  const parts = STATUTS_PARC.filter((k) => s[k]).map((k) => `<i style="width:${((100 * s[k]) / max).toFixed(1)}%;background:${COULEURS.statut[k]}"></i>`).join('');
115
115
  const detail = STATUTS_PARC.map((k) => `${x.lib('statut', k)} ${x.nf(s[k])}`).join(', ');
116
- return `<div class="fl-ligne-empile"><span title="${esc(s.libelle ?? '')}">${esc(s.site ?? '—')}${s.region ? ` <small class="fl-doux">(${esc(s.region)})</small>` : ''}</span><b>${x.nf(s.total)}</b>`
116
+ return `<div class="fl-ligne-empile"><span title="${esc(s.libelle ?? '')}">${esc(x.site(s.site))}${s.region ? ` <small class="fl-doux">(${esc(s.region)})</small>` : ''}</span><b>${x.nf(s.total)}</b>`
117
117
  + `<span class="fl-piste" role="img" aria-label="${esc(detail)}">${parts}</span></div>`;
118
118
  }).join('');
119
119
  return `<div class="fl-empile">${lignes}</div>${legende(x, STATUTS_PARC.map((k) => [x.lib('statut', k), COULEURS.statut[k]]))}`;
@@ -375,7 +375,7 @@ export function rendrePageVehicule(f, opts = {}) {
375
375
  const ch = f.conducteur;
376
376
  const tete = `<div class="fl-tete-page"><span class="fl-vignette">${x.k.icone('camion', 48)}</span>`
377
377
  + `<div class="fl-ident"><div><b class="fl-grande" dir="ltr">${esc(f.plaque)}</b> ${badgeStatut(x, v.statut)}</div><div>${esc(x.lib('type', v.type))} · ${esc(capacite(x, f.capacite))}</div>`
378
- + `<div class="fl-doux">${x.k.icone('epingle', 16)} ${esc(f.site ?? '—')}${f.region ? ` · ${esc(f.region)}` : ''} · ${f.km !== null ? `${x.nf(f.km)} km` : '—'}</div></div>`
378
+ + `<div class="fl-doux">${x.k.icone('epingle', 16)} ${esc(x.site(f.site))}${f.region ? ` · ${esc(f.region)}` : ''} · ${f.km !== null ? `${x.nf(f.km)} km` : '—'}</div></div>`
379
379
  + `<div class="fl-qui">${x.k.icone('utilisateur', 20)} <div>${ch ? `${esc(ch.nom)}${ch.telephone ? `<br><span class="fl-doux" dir="ltr">${esc(ch.telephone)}</span>` : ''}` : `<span class="fl-doux">${esc(T('info.aucunChauffeur'))}</span>`}</div></div>`
380
380
  + `<div class="fl-actions">${modifier}${statut}</div></div>`;
381
381
  const msg = opts.message ? bandeauOk(x, esc(opts.message)) : '';
@@ -409,7 +409,7 @@ export function exporterCsv(vm, opts = {}) {
409
409
  const x = contexte(opts);
410
410
  const champ = (v) => { const s = String(v ?? ''); return /[;"\n\r]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; };
411
411
  const ent = ['plaque', 'type', 'capacite', 'region', 'station', 'chauffeur', 'km', 'statut', 'depart'].map((c) => x.tx(`col.${c}`));
412
- const lignes = vm.liste.lignes.map((l) => [l.plaque, x.lib('type', l.type), l.capacite.kg ?? '', l.region ?? '', l.site ?? '', l.conducteur?.nom ?? '', l.km ?? '',
412
+ const lignes = vm.liste.lignes.map((l) => [l.plaque, x.lib('type', l.type), l.capacite.kg ?? '', l.region ?? '', l.site ? x.site(l.site) : '', l.conducteur?.nom ?? '', l.km ?? '',
413
413
  x.lib('statut', l.statut) + (l.documentExpire ? ` (${x.tx('documentExpire')})` : ''), l.depart.ok ? x.tx('depart.ouiCourt') : l.depart.motifs.map((m) => x.phrase('motif', m)).join(' ; ')]);
414
414
  return `${[ent, ...lignes].map((l) => l.map(champ).join(';')).join('\n')}\n`;
415
415
  }
@@ -422,7 +422,7 @@ export function rendreMonVehicule(vm, opts = {}) {
422
422
  if (!f) return { titre: T('monVehicule.titre'), corps: `<div class="fl-ecran fl-mobile"><p class="fl-vide">${esc(T('monVehicule.aucun'))}</p></div>` };
423
423
  const ch = f.conducteur;
424
424
  const tete = `<div class="fl-carte"><div class="fl-entete-fiche"><span class="fl-vignette">${x.k.icone('camion', 40)}</span><div><b dir="ltr">${esc(f.plaque)}</b><div>${esc(x.lib('type', f.vehicule.type))}</div><div class="fl-doux">${esc(capacite(x, f.capacite))}</div></div></div>`
425
- + `${bandeau(x, f.depart)}<ul class="fl-liste-infos"><li>${x.k.icone('epingle', 18)} ${esc(f.site ?? '—')}${f.region ? ` — ${esc(f.region)}` : ''}</li>`
425
+ + `${bandeau(x, f.depart)}<ul class="fl-liste-infos"><li>${x.k.icone('epingle', 18)} ${esc(x.site(f.site))}${f.region ? ` — ${esc(f.region)}` : ''}</li>`
426
426
  + `${ch ? `<li>${x.k.icone('utilisateur', 18)} ${esc(ch.nom)}${ch.telephone ? ` <span class="fl-doux" dir="ltr">${esc(ch.telephone)}</span>` : ''}</li>` : ''}`
427
427
  + `<li>${x.k.icone('horloge', 18)} ${f.km !== null ? `${x.nf(f.km)} km` : '—'}</li>${f.consommation !== null && f.consommation !== undefined ? `<li>${x.k.icone('barres', 18)} ${x.nf(f.consommation)} L/100 km</li>` : ''}</ul></div>`;
428
428
  const boutons = `<div class="fl-boutons-pleins">${x.liens.plein ? `<a class="${bouton(x, 'fl-bloc')}" href="${esc(x.liens.plein)}">${x.k.icone('plus', 20)}${esc(T('action.plein'))}</a>` : ''}`
@@ -453,7 +453,7 @@ export function rendreChoixVehicule(aptitudes, opts = {}) {
453
453
  return `<label class="fl-option${a.depart.ok ? '' : ' ko'}"><input type="radio" name="${esc(nom)}" value="${esc(a.id)}"${a.id === opts.choisi ? ' checked' : ''}>`
454
454
  + `<span class="fl-depart ${a.depart.ok ? 'ok' : 'ko'}">${x.k.icone(a.depart.ok ? 'coche' : 'croix', 18)}</span>`
455
455
  + `<span><b dir="ltr">${esc(a.plaque)}</b><br><small class="fl-doux">${esc(x.lib('type', a.type))} (${esc(capacite(x, a.capacite))})</small></span>`
456
- + `<span>${a.km !== null ? `${x.nf(a.km)} km` : '—'}</span><span>${esc(a.site ?? '—')}</span><span>${etat}</span></label>`;
456
+ + `<span>${a.km !== null ? `${x.nf(a.km)} km` : '—'}</span><span>${esc(x.site(a.site))}</span><span>${etat}</span></label>`;
457
457
  }).join('')}</div>`;
458
458
  }
459
459