feat : bloque les caractères spéciaux dans les champs texte des 4 répertoires (ERP-193)
This commit is contained in:
@@ -91,6 +91,7 @@
|
||||
<script setup lang="ts">
|
||||
import { useAddressAutocomplete, type AddressSuggestion } from '~/shared/composables/useAddressAutocomplete'
|
||||
import type { CarrierAddressFormDraft } from '~/modules/transport/types/carrierForm'
|
||||
import { sanitizeAddress } from '~/shared/utils/textSanitize'
|
||||
|
||||
interface RefOption {
|
||||
value: string
|
||||
@@ -150,9 +151,21 @@ const addressLoading = ref(false)
|
||||
// Conserve les suggestions d'adresse pour retrouver ville/CP au moment du select.
|
||||
let lastAddressSuggestions: AddressSuggestion[] = []
|
||||
|
||||
/** Emet un nouveau brouillon avec le champ modifie (immutabilite). */
|
||||
// Filtres de saisie par champ (ERP-193) : voie / complement / ville = profil
|
||||
// adresse. Le code postal (masque numerique) n'est pas filtre ici.
|
||||
const FIELD_SANITIZERS: Partial<Record<keyof CarrierAddressFormDraft, (v: string) => string>> = {
|
||||
street: sanitizeAddress,
|
||||
streetComplement: sanitizeAddress,
|
||||
city: sanitizeAddress,
|
||||
}
|
||||
|
||||
/** Emet un nouveau brouillon avec le champ modifie (immutabilite), sanitise si besoin. */
|
||||
function update<K extends keyof CarrierAddressFormDraft>(field: K, value: CarrierAddressFormDraft[K]): void {
|
||||
emit('update:modelValue', { ...props.modelValue, [field]: value })
|
||||
const sanitizer = FIELD_SANITIZERS[field]
|
||||
const next = (sanitizer && typeof value === 'string')
|
||||
? (sanitizer(value) as CarrierAddressFormDraft[K])
|
||||
: value
|
||||
emit('update:modelValue', { ...props.modelValue, [field]: next })
|
||||
}
|
||||
|
||||
/** Previent le parent (toast unique) que l'autocompletion est indisponible. */
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { CarrierContactFormDraft } from '~/modules/transport/types/carrierForm'
|
||||
import { sanitizeEmail, sanitizeFreeText, sanitizePersonName } from '~/shared/utils/textSanitize'
|
||||
|
||||
// Masque téléphone FR : 5 groupes de 2 chiffres (la normalisation finale reste serveur).
|
||||
const PHONE_MASK = '## ## ## ## ##'
|
||||
@@ -96,9 +97,22 @@ const { t } = useI18n()
|
||||
// Alias local pour la lisibilité du template.
|
||||
const model = computed(() => props.modelValue)
|
||||
|
||||
/** Émet un nouveau brouillon avec le champ modifié (immutabilité). */
|
||||
// Filtres de saisie par champ (ERP-193) : on retire les caractères parasites à la
|
||||
// frappe. Noms = profil personne, fonction = texte libre, email = profil email.
|
||||
const FIELD_SANITIZERS: Partial<Record<keyof CarrierContactFormDraft, (v: string) => string>> = {
|
||||
lastName: sanitizePersonName,
|
||||
firstName: sanitizePersonName,
|
||||
jobTitle: sanitizeFreeText,
|
||||
email: sanitizeEmail,
|
||||
}
|
||||
|
||||
/** Émet un nouveau brouillon avec le champ modifié (immutabilité), sanitisé si besoin. */
|
||||
function update<K extends keyof CarrierContactFormDraft>(field: K, value: CarrierContactFormDraft[K]): void {
|
||||
emit('update:modelValue', { ...props.modelValue, [field]: value })
|
||||
const sanitizer = FIELD_SANITIZERS[field]
|
||||
const next = (sanitizer && typeof value === 'string')
|
||||
? (sanitizer(value) as CarrierContactFormDraft[K])
|
||||
: value
|
||||
emit('update:modelValue', { ...props.modelValue, [field]: next })
|
||||
}
|
||||
|
||||
/** Révèle le 2e numéro (max 1 secondaire, le « + » disparaît). */
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
<!-- ── Formulaire principal (éditable, PATCH partiel) ─────────────── -->
|
||||
<div class="mt-[48px] grid grid-cols-3 xl:grid-cols-4 gap-x-[44px] gap-y-4">
|
||||
<MalioInputText
|
||||
v-model="main.name"
|
||||
:model-value="main.name"
|
||||
@update:model-value="(v: string) => main.name = sanitizeFreeText(v)"
|
||||
:label="t('transport.carriers.form.main.name')"
|
||||
:required="true"
|
||||
:error="mainErrors.errors.name"
|
||||
@@ -214,6 +215,7 @@ import { useCarrierForm } from '~/modules/transport/composables/useCarrierForm'
|
||||
import { useCarrier } from '~/modules/transport/composables/useCarrier'
|
||||
import type { QualimatCarrierRow } from '~/modules/transport/composables/useQualimatSearch'
|
||||
import { clampPercent, sanitizeDecimal } from '~/modules/transport/utils/forms/numberInput'
|
||||
import { sanitizeFreeText } from '~/shared/utils/textSanitize'
|
||||
|
||||
interface SelectOption {
|
||||
value: string
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
seule pour un transporteur QUALIMAT (saisie assistee, onglet Qualimat). -->
|
||||
<div class="mt-[48px] grid grid-cols-3 xl:grid-cols-4 gap-x-[44px] gap-y-4">
|
||||
<MalioInputText
|
||||
v-model="main.name"
|
||||
:model-value="main.name"
|
||||
@update:model-value="(v: string) => main.name = sanitizeFreeText(v)"
|
||||
:label="t('transport.carriers.form.main.name')"
|
||||
:required="true"
|
||||
:readonly="mainLocked"
|
||||
@@ -112,7 +113,7 @@
|
||||
name="carrier-main-container"
|
||||
value="BENNE"
|
||||
:label="t('transport.carriers.containerType.BENNE')"
|
||||
:disabled="mainLocked"
|
||||
:readonly="mainLocked"
|
||||
group-class="mt-0"
|
||||
@update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)"
|
||||
/>
|
||||
@@ -121,7 +122,7 @@
|
||||
name="carrier-main-container"
|
||||
value="FOND_MOUVANT"
|
||||
:label="t('transport.carriers.containerType.FOND_MOUVANT')"
|
||||
:disabled="mainLocked"
|
||||
:readonly="mainLocked"
|
||||
group-class="mt-0"
|
||||
@update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)"
|
||||
/>
|
||||
@@ -308,6 +309,7 @@ import CarrierQualimatTab from '~/modules/transport/components/CarrierQualimatTa
|
||||
import { useCarrierForm } from '~/modules/transport/composables/useCarrierForm'
|
||||
import type { QualimatCarrierRow } from '~/modules/transport/composables/useQualimatSearch'
|
||||
import { clampPercent, sanitizeDecimal } from '~/modules/transport/utils/forms/numberInput'
|
||||
import { sanitizeFreeText } from '~/shared/utils/textSanitize'
|
||||
|
||||
interface SelectOption {
|
||||
value: string
|
||||
|
||||
Reference in New Issue
Block a user