fix(front) : poids en champ texte chiffré dans la pesée manuelle + retrait numéro/site sur la modification (ERP-189/190)

- Modale « Pesée manuelle » : champ Poids passé en MalioInputText verrouillé sur
  les chiffres (NUMERIC_MASK), comme le formulaire.
- Masques de pesée factorisés dans utils/weighingMasks (NUMERIC / PLATE / FREE_PLATE).
- Écran Modification : suppression des champs lecture seule « Numéro » et « Site »
  en tête (le numéro reste rappelé dans le titre de l'écran).
This commit is contained in:
2026-06-23 15:58:31 +02:00
parent f2c06aed43
commit 335d2ed207
6 changed files with 56 additions and 59 deletions
@@ -101,6 +101,7 @@
<script setup lang="ts">
import type { WeighingBlockState } from '~/modules/logistique/composables/useWeighingTicketForm'
import { NUMERIC_MASK, PLATE_MASK, FREE_PLATE_MASK } from '~/modules/logistique/utils/weighingMasks'
/**
* Bloc de pesée (« Poids à vide » ou « Poids à plein ») de l'écran Ticket de pesée.
@@ -108,35 +109,9 @@ import type { WeighingBlockState } from '~/modules/logistique/composables/useWei
* L'immatriculation et « Tout format » sont PARTAGÉS entre les 2 blocs (RG-5.01) :
* portés par le form parent et remontés en `update:*`. Le slot `counterparty`
* permet au parent d'injecter la contrepartie sur le seul bloc vide (RG-5.03).
* Masques de saisie factorisés dans `utils/weighingMasks`.
*/
// Masque plaque FR SIV `XX-000-XX` (maska) : 2 lettres, 3 chiffres, 2 lettres,
// majuscules forcées. Désactivé quand « Tout format » est coché (RG-5.01).
const PLATE_MASK = {
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.
const FREE_PLATE_MASK = {
mask: 'P',
tokens: { P: { pattern: /[A-Z0-9 -]/, multiple: true } },
preProcess: (value: string) => value.toUpperCase().replace(/[^A-Z0-9 -]/g, ''),
}
// Masque « chiffres uniquement » (maska, longueur libre) pour Poids et DSD :
// ces champs texte sont verrouillés sur des entiers, et de toute façon désactivés
// (remplis par la pesée).
const NUMERIC_MASK = {
mask: 'D',
tokens: { D: { pattern: /[0-9]/, multiple: true } },
}
const props = defineProps<{
/** Identifiant technique du bloc (pour les `id` de champs uniques). */
blockId: string