@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 +11 -1
- package/llms.txt +1 -0
- package/package.json +1 -1
- package/src/commun.js +7 -3
- package/src/formulaires.js +14 -12
- package/src/rendu.js +6 -6
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.
|
|
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.
|
|
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
|
-
/**
|
|
11
|
-
|
|
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
|
-
|
|
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 !== '';
|
package/src/formulaires.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
318
|
-
const
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|