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:
@@ -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"> *</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()
|
||||
|
||||
Reference in New Issue
Block a user