48 lines
2.1 KiB
TypeScript
48 lines
2.1 KiB
TypeScript
/**
|
|
* Helpers de saisie du formulaire principal transporteur (ERP-170).
|
|
* Champs texte restreints (volume m³ décimal, indexation plafonnée, immatriculations
|
|
* LIOT via mask maska). Purs / testables.
|
|
*/
|
|
import type { MaskInputOptions } from 'maska'
|
|
|
|
/**
|
|
* 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
|
|
}
|
|
|
|
/**
|
|
* Mask maska des immatriculations LIOT : n'autorise que lettres, chiffres, tiret et
|
|
* point-virgule (séparateur de plaques), longueur libre. Filtrage NATIF (maska gère
|
|
* le focus et le curseur, contrairement à un nettoyage manuel). Espaces et tout autre
|
|
* caractère sont bloqués à la frappe / au collage. La normalisation finale (majuscules
|
|
* + « ; » espacé) reste au back (RG-4.13).
|
|
*
|
|
* `preProcess` retire d'abord tout caractère interdit (espaces, &, ², …) OÙ QU'IL
|
|
* SOIT (le masque positionnel seul s'arrêterait au 1er caractère invalide) ; le
|
|
* token `P` en `multiple: true` laisse ensuite passer le reste (longueur libre).
|
|
*/
|
|
export const LIOT_PLATES_MASK: MaskInputOptions = {
|
|
mask: 'P',
|
|
tokens: { P: { pattern: /[A-Za-z0-9;-]/, multiple: true } },
|
|
preProcess: (value: string) => value.replace(/[^A-Za-z0-9;-]/g, ''),
|
|
}
|