Files
Starseed/frontend/modules/transport/utils/forms/numberInput.ts
T
tristan a98f58cb33
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
feat(transport) : immatriculations LIOT sur 3 colonnes + filtre saisie (lettres/chiffres/tiret/point-virgule) (ERP-193)
2026-06-19 11:50:05 +02:00

39 lines
1.6 KiB
TypeScript

/**
* Helpers de saisie numérique du formulaire principal transporteur (ERP-170).
* Champs texte restreints (volume m³ décimal, indexation plafonnée). Purs / testables.
*/
/**
* Restreint une saisie à un nombre décimal : chiffres + UN seul point (RG volume m³,
* « nombres avec des points » comme les autres modules). La virgule décimale FR est
* convertie en point (« 30,5 » → « 30.5 ») ; tout autre caractère est supprimé.
*/
export function sanitizeDecimal(value: string): string {
let cleaned = (value ?? '').replace(/,/g, '.').replace(/[^0-9.]/g, '')
const dot = cleaned.indexOf('.')
if (dot !== -1) {
// Conserve le 1er point, retire les suivants.
cleaned = cleaned.slice(0, dot + 1) + cleaned.slice(dot + 1).replace(/\./g, '')
}
return cleaned
}
/**
* Plafonne un pourcentage à 100 (contrainte FRONT : l'indexation n'a pas de max back).
* Renvoie « 100 » si la valeur saisie dépasse 100, sinon la valeur telle quelle.
*/
export function clampPercent(value: string): string {
const n = Number(String(value ?? '').replace(',', '.').replace(/\s/g, ''))
return (!Number.isNaN(n) && n > 100) ? '100' : value
}
/**
* Restreint la saisie des immatriculations LIOT : ne garde que lettres, chiffres,
* tiret et point-virgule (séparateur de plaques). Les espaces et tout autre
* caractère sont supprimés à la frappe / au collage. La normalisation finale
* (majuscules + « ; » espacé) reste au back (RG-4.13).
*/
export function sanitizeLiotPlates(value: string): string {
return (value ?? '').replace(/[^A-Za-z0-9;-]/g, '')
}