import type { MaskInputOptions } from 'maska' /** * Masques de saisie du module « Tickets de pesée » (M5). Partagés entre le * composant de bloc (`WeighingBlock`) et les modales de pesée (écrans Ajouter / * Modifier). La validation de format reste autoritaire côté serveur (RG-5.01). */ /** * Masque « chiffres uniquement » (longueur libre) — Poids et DSD. Verrouille la * saisie sur des entiers. */ export const NUMERIC_MASK: MaskInputOptions = { mask: 'D', tokens: { D: { pattern: /[0-9]/, multiple: true } }, } /** * Masque plaque FR SIV `XX-000-XX` : 2 lettres, 3 chiffres, 2 lettres, majuscules * forcées. Utilisé quand « Tout format » n'est pas coché (RG-5.01). */ export const PLATE_MASK: MaskInputOptions = { mask: 'AA-###-AA', tokens: { A: { pattern: /[A-Za-z]/, transform: (c: string) => c.toUpperCase() } }, } /** * Masque « Tout format » (RG-5.01) : plaques anciennes / étrangères / engins. On * autorise lettres, chiffres, espace et tiret, en MAJUSCULES, longueur libre — * mais on filtre tout le reste (accents, ponctuation, symboles : « &é"'(_ç… »). * Pattern maska charset du projet (cf. shared/utils/textSanitize) : `preProcess` * retire d'abord les caractères hors charset (le token `multiple` glouton * s'arrêterait sinon au 1er invalide), puis le token laisse passer le reste. */ export const FREE_PLATE_MASK: MaskInputOptions = { mask: 'P', tokens: { P: { pattern: /[A-Z0-9 -]/, multiple: true } }, preProcess: (value: string) => value.toUpperCase().replace(/[^A-Z0-9 -]/g, ''), }