refactor(front) : volume prévisionnel en champ texte masqué + bloc adresse fournisseur aligné sur le client (radio type sans label, une colonne, required par radio) (ERP-94)

This commit is contained in:
2026-06-09 22:46:40 +02:00
parent 01a3bd6419
commit 86373f0d3c
2 changed files with 64 additions and 64 deletions
@@ -11,29 +11,64 @@
/>
<!-- Type d'adresse : radio exclusif Prospect / Depart / Rendu (RG-2.09).
Erreur portee sur `addressType` cote back (Assert\Choice + NotNull)
-> affichee sous le groupe. col-span-2 pour loger les 3 options. -->
<div class="col-span-2 flex flex-col gap-1">
<span class="text-sm font-medium">
{{ t('commercial.suppliers.form.address.addressType') }}<span class="text-red-600">&nbsp;*</span>
</span>
<div class="flex items-center gap-6">
<MalioRadioButton
v-for="opt in addressTypeOptions"
:key="opt.value"
:name="radioName"
:model-value="model.addressType"
:value="opt.value"
:label="opt.label"
:readonly="readonly"
:disabled="readonly"
group-class="mt-0"
@update:model-value="() => update('addressType', opt.value)"
/>
</div>
Une seule colonne (radios empiles), sans label de groupe ; le caractere
obligatoire est porte par chaque radio (prop `required`). L'erreur 422
(propertyPath `addressType`) s'affiche sous le groupe. -->
<div class="flex flex-col gap-2">
<MalioRadioButton
v-for="opt in addressTypeOptions"
:key="opt.value"
:name="radioName"
:model-value="model.addressType"
:value="opt.value"
:label="opt.label"
:required="true"
:readonly="readonly"
:disabled="readonly"
group-class="mt-0"
@update:model-value="() => update('addressType', opt.value)"
/>
<span v-if="errors?.addressType" class="text-sm text-red-600">{{ errors.addressType }}</span>
</div>
<!-- Sites Starseed : multiselect a tags (>= 1 obligatoire, RG-2.06). -->
<MalioSelectCheckbox
:model-value="model.siteIris"
:options="siteOptions"
:label="t('commercial.suppliers.form.address.sites')"
:display-tag="true"
:readonly="readonly"
:required="true"
:error="errors?.sites"
@update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))"
/>
<!-- Contacts rattaches (M2M, facultatif). -->
<MalioSelectCheckbox
:model-value="model.contactIris"
:options="contactOptions"
:label="t('commercial.suppliers.form.address.contacts')"
:display-tag="true"
:readonly="readonly"
@update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))"
/>
<!-- Filler : aligne le debut de ligne suivant sur la grille (le bloc client
porte ici l'email de facturation, absent cote fournisseur). -->
<div aria-hidden="true" />
<!-- Categories de type FOURNISSEUR (>= 1 obligatoire, RG-2.10). -->
<MalioSelectCheckbox
:model-value="model.categoryIris"
:options="categoryOptions"
:label="t('commercial.suppliers.form.address.categories')"
:display-tag="true"
:readonly="readonly"
:required="true"
:error="errors?.categories"
@update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))"
/>
<MalioSelect
:model-value="model.country"
:options="countryOptions"
@@ -75,8 +110,8 @@
@update:model-value="(v: string) => update('city', v)"
/>
<!-- Adresse (BAN) + Adresse complementaire. allow-create : le texte saisi
est conserve si la BAN ne propose rien (saisie manuelle). -->
<!-- Adresse (BAN) sur 2 colonnes + Adresse complementaire. allow-create : le
texte saisi est conserve si la BAN ne propose rien (saisie manuelle). -->
<div class="col-span-2">
<MalioInputAutocomplete
v-if="!readonly"
@@ -115,43 +150,6 @@
/>
</div>
<!-- Sites Starseed (>= 1 obligatoire, RG-2.06). -->
<MalioSelectCheckbox
:model-value="model.siteIris"
:options="siteOptions"
:label="t('commercial.suppliers.form.address.sites')"
:display-tag="true"
:readonly="readonly"
:required="true"
:error="errors?.sites"
@update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))"
/>
<!-- Categories de type FOURNISSEUR (>= 1 obligatoire, RG-2.10). -->
<MalioSelectCheckbox
:model-value="model.categoryIris"
:options="categoryOptions"
:label="t('commercial.suppliers.form.address.categories')"
:display-tag="true"
:readonly="readonly"
:required="true"
:error="errors?.categories"
@update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))"
/>
<!-- Contacts rattaches (M2M, facultatif). -->
<MalioSelectCheckbox
:model-value="model.contactIris"
:options="contactOptions"
:label="t('commercial.suppliers.form.address.contacts')"
:display-tag="true"
:readonly="readonly"
@update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))"
/>
<!-- Filler : pousse Bennes + Triage sur une nouvelle ligne (disposition maquette). -->
<div aria-hidden="true" />
<!-- Bennes : stepper (specifique fournisseur, defaut 0). -->
<MalioInputNumber
:model-value="model.bennes"
@@ -97,14 +97,14 @@
:readonly="isValidated('information')"
:error="informationErrors.errors.profitAmount"
/>
<!-- Volume previsionnel : specifique fournisseur (entier >= 0). -->
<MalioInputNumber
:model-value="information.volumeForecast"
<!-- Volume previsionnel : specifique fournisseur. Champ texte
masque (chiffres uniquement) ; l'entier est resolu au PATCH. -->
<MalioInputText
v-model="information.volumeForecast"
:label="t('commercial.suppliers.form.information.volumeForecast')"
:min="0"
:mask="VOLUME_FORECAST_MASK"
:readonly="isValidated('information')"
:error="informationErrors.errors.volumeForecast"
@update:model-value="(v: string) => information.volumeForecast = v"
/>
</div>
<div v-if="!isValidated('information')" class="mt-12 flex justify-center">
@@ -383,6 +383,8 @@ import { extractApiErrorMessage } from '~/shared/utils/api'
// Masques de saisie (la normalisation finale reste serveur).
const SIREN_MASK = '#########'
const EMPLOYEES_MASK = '#######'
// Volume previsionnel : champ texte borne aux chiffres (entier >= 0 cote back).
const VOLUME_FORECAST_MASK = '##########'
const { t } = useI18n()
const api = useApi()