feat : grise les champs en consultation et onglets validés (readonly → disabled) (ERP-193)

This commit is contained in:
2026-06-19 09:48:49 +02:00
parent 07f5a95a6b
commit cdcc7d1e75
21 changed files with 321 additions and 228 deletions
@@ -2,7 +2,7 @@
<div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]"> <div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]">
<!-- ariaLabel via v-bind objet (prop camelCase ; aria-* serait un attribut HTML). --> <!-- ariaLabel via v-bind objet (prop camelCase ; aria-* serait un attribut HTML). -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -21,6 +21,7 @@
:options="addressTypeOptions" :options="addressTypeOptions"
:label="t('commercial.clients.form.address.addressType')" :label="t('commercial.clients.form.address.addressType')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.isProspect" :error="errors?.isProspect"
@update:model-value="onAddressTypeChange" @update:model-value="onAddressTypeChange"
@@ -33,6 +34,7 @@
:label="t('commercial.clients.form.address.sites')" :label="t('commercial.clients.form.address.sites')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.sites" :error="errors?.sites"
@update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))"
@@ -44,6 +46,7 @@
:label="t('commercial.clients.form.address.contacts')" :label="t('commercial.clients.form.address.contacts')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
@update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))"
/> />
@@ -57,6 +60,7 @@
:label="t('commercial.clients.form.address.billingEmail')" :label="t('commercial.clients.form.address.billingEmail')"
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:lowercase="true" :lowercase="true"
:error="errors?.billingEmail" :error="errors?.billingEmail"
:addable="!model.hasSecondaryBillingEmail && !readonly" :addable="!model.hasSecondaryBillingEmail && !readonly"
@@ -71,6 +75,7 @@
:model-value="model.billingEmailSecondary" :model-value="model.billingEmailSecondary"
:label="t('commercial.clients.form.address.billingEmailSecondary')" :label="t('commercial.clients.form.address.billingEmailSecondary')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:lowercase="true" :lowercase="true"
:error="errors?.billingEmailSecondary" :error="errors?.billingEmailSecondary"
@update:model-value="(v: string) => update('billingEmailSecondary', v)" @update:model-value="(v: string) => update('billingEmailSecondary', v)"
@@ -82,6 +87,7 @@
:label="t('commercial.clients.form.address.categories')" :label="t('commercial.clients.form.address.categories')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.categories" :error="errors?.categories"
@update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))"
@@ -92,6 +98,7 @@
:options="countryOptions" :options="countryOptions"
:label="t('commercial.clients.form.address.country')" :label="t('commercial.clients.form.address.country')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
@update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))"
/> />
@@ -101,6 +108,7 @@
:label="t('commercial.clients.form.address.postalCode')" :label="t('commercial.clients.form.address.postalCode')"
:mask="POSTAL_CODE_MASK" :mask="POSTAL_CODE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.postalCode" :error="errors?.postalCode"
@update:model-value="onPostalCodeChange" @update:model-value="onPostalCodeChange"
@@ -115,6 +123,7 @@
:options="cityOptions" :options="cityOptions"
:label="t('commercial.clients.form.address.city')" :label="t('commercial.clients.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@@ -125,6 +134,7 @@
:model-value="model.city" :model-value="model.city"
:label="t('commercial.clients.form.address.city')" :label="t('commercial.clients.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@update:model-value="(v: string) => update('city', v)" @update:model-value="(v: string) => update('city', v)"
@@ -142,13 +152,14 @@
blur/Entree (saisie manuelle) — sinon il serait efface. La ville reste blur/Entree (saisie manuelle) — sinon il serait efface. La ville reste
pilotee par le code postal ; choisir une suggestion remplit rue+ville+CP. --> pilotee par le code postal ; choisir une suggestion remplit rue+ville+CP. -->
<MalioInputAutocomplete <MalioInputAutocomplete
v-if="!readonly" v-if="!readonly && !disabled"
:model-value="model.street" :model-value="model.street"
:options="addressOptions" :options="addressOptions"
:loading="addressLoading" :loading="addressLoading"
:min-search-length="3" :min-search-length="3"
:label="t('commercial.clients.form.address.street')" :label="t('commercial.clients.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
:allow-create="true" :allow-create="true"
@@ -162,6 +173,7 @@
:model-value="model.street" :model-value="model.street"
:label="t('commercial.clients.form.address.street')" :label="t('commercial.clients.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
@update:model-value="(v: string) => update('street', v)" @update:model-value="(v: string) => update('street', v)"
@@ -173,6 +185,7 @@
:model-value="model.streetComplement" :model-value="model.streetComplement"
:label="t('commercial.clients.form.address.streetComplement')" :label="t('commercial.clients.form.address.streetComplement')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.streetComplement" :error="errors?.streetComplement"
@update:model-value="(v: string) => update('streetComplement', v)" @update:model-value="(v: string) => update('streetComplement', v)"
/> />
@@ -210,6 +223,8 @@ const props = defineProps<{
countryOptions: RefOption[] countryOptions: RefOption[]
removable?: boolean removable?: boolean
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -4,7 +4,7 @@
non supprimable (1er bloc obligatoire RG-1.14) ou en lecture seule. non supprimable (1er bloc obligatoire RG-1.14) ou en lecture seule.
ariaLabel via v-bind objet (prop camelCase ; aria-* serait un attribut HTML). --> ariaLabel via v-bind objet (prop camelCase ; aria-* serait un attribut HTML). -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -16,6 +16,7 @@
:model-value="model.lastName" :model-value="model.lastName"
:label="t('commercial.clients.form.contact.lastName')" :label="t('commercial.clients.form.contact.lastName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.lastName" :error="errors?.lastName"
@update:model-value="(v: string) => update('lastName', v)" @update:model-value="(v: string) => update('lastName', v)"
/> />
@@ -23,6 +24,7 @@
:model-value="model.firstName" :model-value="model.firstName"
:label="t('commercial.clients.form.contact.firstName')" :label="t('commercial.clients.form.contact.firstName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.firstName" :error="errors?.firstName"
@update:model-value="(v: string) => update('firstName', v)" @update:model-value="(v: string) => update('firstName', v)"
/> />
@@ -34,6 +36,7 @@
:model-value="model.jobTitle" :model-value="model.jobTitle"
:label="t('commercial.clients.form.contact.jobTitle')" :label="t('commercial.clients.form.contact.jobTitle')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.jobTitle" :error="errors?.jobTitle"
@update:model-value="(v: string) => update('jobTitle', v)" @update:model-value="(v: string) => update('jobTitle', v)"
/> />
@@ -42,6 +45,7 @@
:model-value="model.email" :model-value="model.email"
:label="t('commercial.clients.form.contact.email')" :label="t('commercial.clients.form.contact.email')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:lowercase="true" :lowercase="true"
:error="errors?.email" :error="errors?.email"
@update:model-value="(v: string) => update('email', v)" @update:model-value="(v: string) => update('email', v)"
@@ -51,6 +55,7 @@
:label="t('commercial.clients.form.contact.phonePrimary')" :label="t('commercial.clients.form.contact.phonePrimary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phonePrimary" :error="errors?.phonePrimary"
:addable="!model.hasSecondaryPhone && !readonly" :addable="!model.hasSecondaryPhone && !readonly"
:add-button-label="t('commercial.clients.form.contact.addPhone')" :add-button-label="t('commercial.clients.form.contact.addPhone')"
@@ -63,6 +68,7 @@
:label="t('commercial.clients.form.contact.phoneSecondary')" :label="t('commercial.clients.form.contact.phoneSecondary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phoneSecondary" :error="errors?.phoneSecondary"
@update:model-value="(v: string) => update('phoneSecondary', v)" @update:model-value="(v: string) => update('phoneSecondary', v)"
/> />
@@ -86,6 +92,8 @@ const props = defineProps<{
removable?: boolean removable?: boolean
/** Bloc en lecture seule (onglet valide). */ /** Bloc en lecture seule (onglet valide). */
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -2,7 +2,7 @@
<div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]"> <div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]">
<!-- Suppression : modal de confirmation cote parent. --> <!-- Suppression : modal de confirmation cote parent. -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -18,6 +18,7 @@
:options="addressTypeOptions" :options="addressTypeOptions"
:label="t('commercial.suppliers.form.address.addressType')" :label="t('commercial.suppliers.form.address.addressType')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="errors?.addressType" :error="errors?.addressType"
@@ -31,6 +32,7 @@
:label="t('commercial.suppliers.form.address.sites')" :label="t('commercial.suppliers.form.address.sites')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.sites" :error="errors?.sites"
@update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))"
@@ -43,6 +45,7 @@
:label="t('commercial.suppliers.form.address.contacts')" :label="t('commercial.suppliers.form.address.contacts')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
@update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))"
/> />
@@ -57,6 +60,7 @@
:label="t('commercial.suppliers.form.address.categories')" :label="t('commercial.suppliers.form.address.categories')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.categories" :error="errors?.categories"
@update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))"
@@ -67,6 +71,7 @@
:options="countryOptions" :options="countryOptions"
:label="t('commercial.suppliers.form.address.country')" :label="t('commercial.suppliers.form.address.country')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
@update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))"
/> />
@@ -76,6 +81,7 @@
:label="t('commercial.suppliers.form.address.postalCode')" :label="t('commercial.suppliers.form.address.postalCode')"
:mask="POSTAL_CODE_MASK" :mask="POSTAL_CODE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.postalCode" :error="errors?.postalCode"
@update:model-value="onPostalCodeChange" @update:model-value="onPostalCodeChange"
@@ -88,6 +94,7 @@
:options="cityOptions" :options="cityOptions"
:label="t('commercial.suppliers.form.address.city')" :label="t('commercial.suppliers.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@@ -98,6 +105,7 @@
:model-value="model.city" :model-value="model.city"
:label="t('commercial.suppliers.form.address.city')" :label="t('commercial.suppliers.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@update:model-value="(v: string) => update('city', v)" @update:model-value="(v: string) => update('city', v)"
@@ -107,13 +115,14 @@
texte saisi est conserve si la BAN ne propose rien (saisie manuelle). --> texte saisi est conserve si la BAN ne propose rien (saisie manuelle). -->
<div class="col-span-2"> <div class="col-span-2">
<MalioInputAutocomplete <MalioInputAutocomplete
v-if="!readonly" v-if="!readonly && !disabled"
:model-value="model.street" :model-value="model.street"
:options="addressOptions" :options="addressOptions"
:loading="addressLoading" :loading="addressLoading"
:min-search-length="3" :min-search-length="3"
:label="t('commercial.suppliers.form.address.street')" :label="t('commercial.suppliers.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
:allow-create="true" :allow-create="true"
@@ -127,6 +136,7 @@
:model-value="model.street" :model-value="model.street"
:label="t('commercial.suppliers.form.address.street')" :label="t('commercial.suppliers.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
@update:model-value="(v: string) => update('street', v)" @update:model-value="(v: string) => update('street', v)"
@@ -138,6 +148,7 @@
:model-value="model.streetComplement" :model-value="model.streetComplement"
:label="t('commercial.suppliers.form.address.streetComplement')" :label="t('commercial.suppliers.form.address.streetComplement')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.streetComplement" :error="errors?.streetComplement"
@update:model-value="(v: string) => update('streetComplement', v)" @update:model-value="(v: string) => update('streetComplement', v)"
/> />
@@ -149,6 +160,7 @@
:label="t('commercial.suppliers.form.address.bennes')" :label="t('commercial.suppliers.form.address.bennes')"
:min="0" :min="0"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.bennes" :error="errors?.bennes"
@update:model-value="(v: string) => update('bennes', v)" @update:model-value="(v: string) => update('bennes', v)"
/> />
@@ -160,6 +172,7 @@
:model-value="model.triageProvider" :model-value="model.triageProvider"
group-class="self-center" group-class="self-center"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
@update:model-value="(v: boolean) => update('triageProvider', v)" @update:model-value="(v: boolean) => update('triageProvider', v)"
/> />
</div> </div>
@@ -188,6 +201,8 @@ const props = defineProps<{
countryOptions: RefOption[] countryOptions: RefOption[]
removable?: boolean removable?: boolean
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -3,7 +3,7 @@
<!-- Suppression : ouvre une modal de confirmation cote parent. Masquee si <!-- Suppression : ouvre une modal de confirmation cote parent. Masquee si
non supprimable (1er bloc, RG-2.13) ou en lecture seule. --> non supprimable (1er bloc, RG-2.13) ou en lecture seule. -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -15,6 +15,7 @@
:model-value="model.lastName" :model-value="model.lastName"
:label="t('commercial.suppliers.form.contact.lastName')" :label="t('commercial.suppliers.form.contact.lastName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.lastName" :error="errors?.lastName"
@update:model-value="(v: string) => update('lastName', v)" @update:model-value="(v: string) => update('lastName', v)"
/> />
@@ -22,6 +23,7 @@
:model-value="model.firstName" :model-value="model.firstName"
:label="t('commercial.suppliers.form.contact.firstName')" :label="t('commercial.suppliers.form.contact.firstName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.firstName" :error="errors?.firstName"
@update:model-value="(v: string) => update('firstName', v)" @update:model-value="(v: string) => update('firstName', v)"
/> />
@@ -33,6 +35,7 @@
:model-value="model.jobTitle" :model-value="model.jobTitle"
:label="t('commercial.suppliers.form.contact.jobTitle')" :label="t('commercial.suppliers.form.contact.jobTitle')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.jobTitle" :error="errors?.jobTitle"
@update:model-value="(v: string) => update('jobTitle', v)" @update:model-value="(v: string) => update('jobTitle', v)"
/> />
@@ -41,6 +44,7 @@
:model-value="model.email" :model-value="model.email"
:label="t('commercial.suppliers.form.contact.email')" :label="t('commercial.suppliers.form.contact.email')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:lowercase="true" :lowercase="true"
:error="errors?.email" :error="errors?.email"
@update:model-value="(v: string) => update('email', v)" @update:model-value="(v: string) => update('email', v)"
@@ -50,6 +54,7 @@
:label="t('commercial.suppliers.form.contact.phonePrimary')" :label="t('commercial.suppliers.form.contact.phonePrimary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phonePrimary" :error="errors?.phonePrimary"
:addable="!model.hasSecondaryPhone && !readonly" :addable="!model.hasSecondaryPhone && !readonly"
:add-button-label="t('commercial.suppliers.form.contact.addPhone')" :add-button-label="t('commercial.suppliers.form.contact.addPhone')"
@@ -62,6 +67,7 @@
:label="t('commercial.suppliers.form.contact.phoneSecondary')" :label="t('commercial.suppliers.form.contact.phoneSecondary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phoneSecondary" :error="errors?.phoneSecondary"
@update:model-value="(v: string) => update('phoneSecondary', v)" @update:model-value="(v: string) => update('phoneSecondary', v)"
/> />
@@ -84,6 +90,8 @@ const props = defineProps<{
removable?: boolean removable?: boolean
/** Bloc en lecture seule (onglet valide). */ /** Bloc en lecture seule (onglet valide). */
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -28,7 +28,7 @@
@update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)"
:label="t('commercial.clients.form.main.companyName')" :label="t('commercial.clients.form.main.companyName')"
:required="true" :required="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="mainErrors.errors.companyName" :error="mainErrors.errors.companyName"
/> />
<MalioSelectCheckbox <MalioSelectCheckbox
@@ -36,7 +36,7 @@
:options="mainCategoryOptions" :options="mainCategoryOptions"
:label="t('commercial.clients.form.main.categories')" :label="t('commercial.clients.form.main.categories')"
:display-tag="true" :display-tag="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:required="true" :required="true"
:error="mainErrors.errors.categories" :error="mainErrors.errors.categories"
@update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)"
@@ -47,7 +47,7 @@
:options="relationOptions" :options="relationOptions"
:label="t('commercial.clients.form.main.relation')" :label="t('commercial.clients.form.main.relation')"
:empty-option-label="t('commercial.clients.form.main.relationNone')" :empty-option-label="t('commercial.clients.form.main.relationNone')"
:readonly="businessReadonly" :disabled="businessReadonly"
@update:model-value="onRelationChange" @update:model-value="onRelationChange"
/> />
<MalioSelect <MalioSelect
@@ -55,7 +55,7 @@
:model-value="main.brokerIri" :model-value="main.brokerIri"
:options="brokerOptions" :options="brokerOptions"
:label="t('commercial.clients.form.main.brokerName')" :label="t('commercial.clients.form.main.brokerName')"
:readonly="businessReadonly" :disabled="businessReadonly"
:required="true" :required="true"
:error="mainErrors.errors.broker" :error="mainErrors.errors.broker"
@update:model-value="(v: string | number | null) => main.brokerIri = v === null ? null : String(v)" @update:model-value="(v: string | number | null) => main.brokerIri = v === null ? null : String(v)"
@@ -65,7 +65,7 @@
:model-value="main.distributorIri" :model-value="main.distributorIri"
:options="distributorOptions" :options="distributorOptions"
:label="t('commercial.clients.form.main.distributorName')" :label="t('commercial.clients.form.main.distributorName')"
:readonly="businessReadonly" :disabled="businessReadonly"
:required="true" :required="true"
:error="mainErrors.errors.distributor" :error="mainErrors.errors.distributor"
@update:model-value="(v: string | number | null) => main.distributorIri = v === null ? null : String(v)" @update:model-value="(v: string | number | null) => main.distributorIri = v === null ? null : String(v)"
@@ -75,7 +75,7 @@
v-model="main.triageService" v-model="main.triageService"
:label="t('commercial.clients.form.main.triageService')" :label="t('commercial.clients.form.main.triageService')"
group-class="self-center" group-class="self-center"
:readonly="businessReadonly" :disabled="businessReadonly"
/> />
</div> </div>
@@ -102,14 +102,14 @@
resize="none" resize="none"
group-class="row-span-2 pt-1 pb-1" group-class="row-span-2 pt-1 pb-1"
text-input="h-full text-lg" text-input="h-full text-lg"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.description" :error="informationErrors.errors.description"
/> />
<MalioInputText <MalioInputText
:model-value="information.competitors" :model-value="information.competitors"
@update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)" @update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)"
:label="t('commercial.clients.form.information.competitors')" :label="t('commercial.clients.form.information.competitors')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.competitors" :error="informationErrors.errors.competitors"
/> />
<!-- Date de creation jamais dans le futur (ERP-193) : :max plafonne <!-- Date de creation jamais dans le futur (ERP-193) : :max plafonne
@@ -117,7 +117,7 @@
<MalioDate <MalioDate
v-model="information.foundedAt" v-model="information.foundedAt"
:label="t('commercial.clients.form.information.foundedAt')" :label="t('commercial.clients.form.information.foundedAt')"
:readonly="businessReadonly" :disabled="businessReadonly"
:editable="true" :editable="true"
:max="maxFoundedAt" :max="maxFoundedAt"
:error="informationErrors.errors.foundedAt" :error="informationErrors.errors.foundedAt"
@@ -127,7 +127,7 @@
v-model="information.employeesCount" v-model="information.employeesCount"
:label="t('commercial.clients.form.information.employeesCount')" :label="t('commercial.clients.form.information.employeesCount')"
:mask="EMPLOYEES_MASK" :mask="EMPLOYEES_MASK"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.employeesCount" :error="informationErrors.errors.employeesCount"
/> />
<!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie, <!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie,
@@ -136,7 +136,7 @@
:key="revenueAmountKey" :key="revenueAmountKey"
:model-value="information.revenueAmount" :model-value="information.revenueAmount"
:label="t('commercial.clients.form.information.revenueAmount')" :label="t('commercial.clients.form.information.revenueAmount')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.revenueAmount" :error="informationErrors.errors.revenueAmount"
@update:model-value="onRevenueAmountInput" @update:model-value="onRevenueAmountInput"
/> />
@@ -144,13 +144,13 @@
:model-value="information.directorName" :model-value="information.directorName"
@update:model-value="(v: string) => information.directorName = sanitizePersonName(v)" @update:model-value="(v: string) => information.directorName = sanitizePersonName(v)"
:label="t('commercial.clients.form.information.directorName')" :label="t('commercial.clients.form.information.directorName')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.directorName" :error="informationErrors.errors.directorName"
/> />
<MalioInputAmount <MalioInputAmount
v-model="information.profitAmount" v-model="information.profitAmount"
:label="t('commercial.clients.form.information.profitAmount')" :label="t('commercial.clients.form.information.profitAmount')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.profitAmount" :error="informationErrors.errors.profitAmount"
/> />
</div> </div>
@@ -177,7 +177,7 @@
:model-value="contact" :model-value="contact"
:title="t('commercial.clients.form.contact.title', { n: index + 1 })" :title="t('commercial.clients.form.contact.title', { n: index + 1 })"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="businessReadonly" :disabled="businessReadonly"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -214,7 +214,7 @@
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
:removable="isRowRemovable(addresses, index)" :removable="isRowRemovable(addresses, index)"
:readonly="businessReadonly" :disabled="businessReadonly"
:errors="addressErrors[index]" :errors="addressErrors[index]"
@update:model-value="(v) => addresses[index] = v" @update:model-value="(v) => addresses[index] = v"
@remove="askRemoveAddress(index)" @remove="askRemoveAddress(index)"
@@ -249,7 +249,7 @@
v-model="accounting.siren" v-model="accounting.siren"
:label="t('commercial.clients.form.accounting.siren')" :label="t('commercial.clients.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.siren" :error="accountingErrors.errors.siren"
/> />
@@ -257,7 +257,7 @@
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
@update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.accountNumber')" :label="t('commercial.clients.form.accounting.accountNumber')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.accountNumber" :error="accountingErrors.errors.accountNumber"
/> />
@@ -265,7 +265,7 @@
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="tvaModeOptions" :options="tvaModeOptions"
:label="t('commercial.clients.form.accounting.tvaMode')" :label="t('commercial.clients.form.accounting.tvaMode')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.tvaMode" :error="accountingErrors.errors.tvaMode"
@@ -275,7 +275,7 @@
:model-value="accounting.nTva" :model-value="accounting.nTva"
@update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.nTva')" :label="t('commercial.clients.form.accounting.nTva')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.nTva" :error="accountingErrors.errors.nTva"
/> />
@@ -283,7 +283,7 @@
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="paymentDelayOptions" :options="paymentDelayOptions"
:label="t('commercial.clients.form.accounting.paymentDelay')" :label="t('commercial.clients.form.accounting.paymentDelay')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentDelay" :error="accountingErrors.errors.paymentDelay"
@@ -293,7 +293,7 @@
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="paymentTypeOptions" :options="paymentTypeOptions"
:label="t('commercial.clients.form.accounting.paymentType')" :label="t('commercial.clients.form.accounting.paymentType')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentType" :error="accountingErrors.errors.paymentType"
@@ -304,7 +304,7 @@
:model-value="accounting.bankIri" :model-value="accounting.bankIri"
:options="bankOptions" :options="bankOptions"
:label="t('commercial.clients.form.accounting.bank')" :label="t('commercial.clients.form.accounting.bank')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.bank" :error="accountingErrors.errors.bank"
@@ -331,7 +331,7 @@
<MalioInputText <MalioInputText
v-model="rib.label" v-model="rib.label"
:label="t('commercial.clients.form.accounting.ribLabel')" :label="t('commercial.clients.form.accounting.ribLabel')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.label" :error="ribErrors[index]?.label"
/> />
@@ -339,7 +339,7 @@
:model-value="rib.bic" :model-value="rib.bic"
@update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.ribBic')" :label="t('commercial.clients.form.accounting.ribBic')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.bic" :error="ribErrors[index]?.bic"
/> />
@@ -347,7 +347,7 @@
:model-value="rib.iban" :model-value="rib.iban"
@update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.ribIban')" :label="t('commercial.clients.form.accounting.ribIban')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.iban" :error="ribErrors[index]?.iban"
/> />
@@ -50,14 +50,14 @@
<MalioInputText <MalioInputText
:model-value="client.companyName" :model-value="client.companyName"
:label="t('commercial.clients.form.main.companyName')" :label="t('commercial.clients.form.main.companyName')"
readonly disabled
/> />
<MalioSelectCheckbox <MalioSelectCheckbox
:model-value="categoryIris" :model-value="categoryIris"
:options="mainCategoryOptions" :options="mainCategoryOptions"
:label="t('commercial.clients.form.main.categories')" :label="t('commercial.clients.form.main.categories')"
:display-tag="true" :display-tag="true"
readonly disabled
/> />
<!-- Relation toujours affichee (vide = « Aucun »), comme en edition. --> <!-- Relation toujours affichee (vide = « Aucun »), comme en edition. -->
<MalioSelect <MalioSelect
@@ -65,7 +65,7 @@
:options="relationOptions" :options="relationOptions"
:label="t('commercial.clients.form.main.relation')" :label="t('commercial.clients.form.main.relation')"
:empty-option-label="t('commercial.clients.form.main.relationNone')" :empty-option-label="t('commercial.clients.form.main.relationNone')"
readonly disabled
/> />
<!-- Nom du distributeur/courtier : conditionnel (libelle type-dependant, <!-- Nom du distributeur/courtier : conditionnel (libelle type-dependant,
aucune valeur sans relation meme comportement qu'en edition). --> aucune valeur sans relation meme comportement qu'en edition). -->
@@ -73,13 +73,13 @@
v-if="relation.type" v-if="relation.type"
:model-value="relation.name" :model-value="relation.name"
:label="relation.type === 'distributeur' ? t('commercial.clients.form.main.distributorName') : t('commercial.clients.form.main.brokerName')" :label="relation.type === 'distributeur' ? t('commercial.clients.form.main.distributorName') : t('commercial.clients.form.main.brokerName')"
readonly disabled
/> />
<MalioCheckbox <MalioCheckbox
:model-value="client.triageService === true" :model-value="client.triageService === true"
:label="t('commercial.clients.form.main.triageService')" :label="t('commercial.clients.form.main.triageService')"
group-class="self-center" group-class="self-center"
readonly disabled
/> />
</div> </div>
@@ -99,37 +99,37 @@
resize="none" resize="none"
group-class="row-span-2 pt-1 pb-1" group-class="row-span-2 pt-1 pb-1"
text-input="h-full text-lg" text-input="h-full text-lg"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="information.competitors" :model-value="information.competitors"
:label="t('commercial.clients.form.information.competitors')" :label="t('commercial.clients.form.information.competitors')"
readonly disabled
/> />
<MalioDate <MalioDate
:model-value="information.foundedAt" :model-value="information.foundedAt"
:label="t('commercial.clients.form.information.foundedAt')" :label="t('commercial.clients.form.information.foundedAt')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="information.employeesCount" :model-value="information.employeesCount"
:label="t('commercial.clients.form.information.employeesCount')" :label="t('commercial.clients.form.information.employeesCount')"
readonly disabled
/> />
<MalioInputAmount <MalioInputAmount
:model-value="information.revenueAmount" :model-value="information.revenueAmount"
:label="t('commercial.clients.form.information.revenueAmount')" :label="t('commercial.clients.form.information.revenueAmount')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="information.directorName" :model-value="information.directorName"
:label="t('commercial.clients.form.information.directorName')" :label="t('commercial.clients.form.information.directorName')"
readonly disabled
/> />
<MalioInputAmount <MalioInputAmount
:model-value="information.profitAmount" :model-value="information.profitAmount"
:label="t('commercial.clients.form.information.profitAmount')" :label="t('commercial.clients.form.information.profitAmount')"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -142,7 +142,7 @@
:key="contact.id ?? index" :key="contact.id ?? index"
:model-value="contact" :model-value="contact"
:title="t('commercial.clients.form.contact.title', { n: index + 1 })" :title="t('commercial.clients.form.contact.title', { n: index + 1 })"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -159,7 +159,7 @@
:site-options="allSiteOptions" :site-options="allSiteOptions"
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -173,38 +173,38 @@
:model-value="accounting.siren" :model-value="accounting.siren"
:label="t('commercial.clients.form.accounting.siren')" :label="t('commercial.clients.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
:label="t('commercial.clients.form.accounting.accountNumber')" :label="t('commercial.clients.form.accounting.accountNumber')"
readonly disabled
/> />
<MalioSelect <MalioSelect
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="tvaModeOptions" :options="tvaModeOptions"
:label="t('commercial.clients.form.accounting.tvaMode')" :label="t('commercial.clients.form.accounting.tvaMode')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="accounting.nTva" :model-value="accounting.nTva"
:label="t('commercial.clients.form.accounting.nTva')" :label="t('commercial.clients.form.accounting.nTva')"
readonly disabled
/> />
<MalioSelect <MalioSelect
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="paymentDelayOptions" :options="paymentDelayOptions"
:label="t('commercial.clients.form.accounting.paymentDelay')" :label="t('commercial.clients.form.accounting.paymentDelay')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
<MalioSelect <MalioSelect
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="paymentTypeOptions" :options="paymentTypeOptions"
:label="t('commercial.clients.form.accounting.paymentType')" :label="t('commercial.clients.form.accounting.paymentType')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
<MalioSelect <MalioSelect
v-if="accounting.bankIri" v-if="accounting.bankIri"
@@ -212,7 +212,7 @@
:options="bankOptions" :options="bankOptions"
:label="t('commercial.clients.form.accounting.bank')" :label="t('commercial.clients.form.accounting.bank')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
</div> </div>
</div> </div>
@@ -227,17 +227,17 @@
<MalioInputText <MalioInputText
:model-value="rib.label" :model-value="rib.label"
:label="t('commercial.clients.form.accounting.ribLabel')" :label="t('commercial.clients.form.accounting.ribLabel')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="rib.bic" :model-value="rib.bic"
:label="t('commercial.clients.form.accounting.ribBic')" :label="t('commercial.clients.form.accounting.ribBic')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="rib.iban" :model-value="rib.iban"
:label="t('commercial.clients.form.accounting.ribIban')" :label="t('commercial.clients.form.accounting.ribIban')"
readonly disabled
/> />
</div> </div>
</div> </div>
@@ -22,7 +22,7 @@
@update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)"
:label="t('commercial.clients.form.main.companyName')" :label="t('commercial.clients.form.main.companyName')"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.companyName" :error="mainErrors.errors.companyName"
/> />
<MalioSelectCheckbox <MalioSelectCheckbox
@@ -30,7 +30,7 @@
:options="referentials.categories.value" :options="referentials.categories.value"
:label="t('commercial.clients.form.main.categories')" :label="t('commercial.clients.form.main.categories')"
:display-tag="true" :display-tag="true"
:readonly="mainLocked" :disabled="mainLocked"
:required="true" :required="true"
:error="mainErrors.errors.categories" :error="mainErrors.errors.categories"
@update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)"
@@ -41,7 +41,7 @@
:options="relationOptions" :options="relationOptions"
:label="t('commercial.clients.form.main.relation')" :label="t('commercial.clients.form.main.relation')"
:empty-option-label="t('commercial.clients.form.main.relationNone')" :empty-option-label="t('commercial.clients.form.main.relationNone')"
:readonly="mainLocked" :disabled="mainLocked"
@update:model-value="onRelationChange" @update:model-value="onRelationChange"
/> />
<MalioSelect <MalioSelect
@@ -49,7 +49,7 @@
:model-value="main.brokerIri" :model-value="main.brokerIri"
:options="referentials.brokers.value" :options="referentials.brokers.value"
:label="t('commercial.clients.form.main.brokerName')" :label="t('commercial.clients.form.main.brokerName')"
:readonly="mainLocked" :disabled="mainLocked"
:required="true" :required="true"
:error="mainErrors.errors.broker" :error="mainErrors.errors.broker"
@update:model-value="(v: string | number | null) => main.brokerIri = v === null ? null : String(v)" @update:model-value="(v: string | number | null) => main.brokerIri = v === null ? null : String(v)"
@@ -59,7 +59,7 @@
:model-value="main.distributorIri" :model-value="main.distributorIri"
:options="referentials.distributors.value" :options="referentials.distributors.value"
:label="t('commercial.clients.form.main.distributorName')" :label="t('commercial.clients.form.main.distributorName')"
:readonly="mainLocked" :disabled="mainLocked"
:required="true" :required="true"
:error="mainErrors.errors.distributor" :error="mainErrors.errors.distributor"
@update:model-value="(v: string | number | null) => main.distributorIri = v === null ? null : String(v)" @update:model-value="(v: string | number | null) => main.distributorIri = v === null ? null : String(v)"
@@ -69,7 +69,7 @@
v-model="main.triageService" v-model="main.triageService"
:label="t('commercial.clients.form.main.triageService')" :label="t('commercial.clients.form.main.triageService')"
group-class="self-center" group-class="self-center"
:readonly="mainLocked" :disabled="mainLocked"
/> />
</div> </div>
@@ -97,14 +97,14 @@
resize="none" resize="none"
group-class="row-span-2 pt-1 pb-1" group-class="row-span-2 pt-1 pb-1"
text-input="h-full text-lg" text-input="h-full text-lg"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.description" :error="informationErrors.errors.description"
/> />
<MalioInputText <MalioInputText
:model-value="information.competitors" :model-value="information.competitors"
@update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)" @update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)"
:label="t('commercial.clients.form.information.competitors')" :label="t('commercial.clients.form.information.competitors')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.competitors" :error="informationErrors.errors.competitors"
/> />
<!-- Date de creation jamais dans le futur (ERP-193) : :max plafonne <!-- Date de creation jamais dans le futur (ERP-193) : :max plafonne
@@ -112,7 +112,7 @@
<MalioDate <MalioDate
v-model="information.foundedAt" v-model="information.foundedAt"
:label="t('commercial.clients.form.information.foundedAt')" :label="t('commercial.clients.form.information.foundedAt')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:editable="true" :editable="true"
:max="maxFoundedAt" :max="maxFoundedAt"
:error="informationErrors.errors.foundedAt" :error="informationErrors.errors.foundedAt"
@@ -122,7 +122,7 @@
v-model="information.employeesCount" v-model="information.employeesCount"
:label="t('commercial.clients.form.information.employeesCount')" :label="t('commercial.clients.form.information.employeesCount')"
:mask="EMPLOYEES_MASK" :mask="EMPLOYEES_MASK"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.employeesCount" :error="informationErrors.errors.employeesCount"
/> />
<!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie, <!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie,
@@ -131,7 +131,7 @@
:key="revenueAmountKey" :key="revenueAmountKey"
:model-value="information.revenueAmount" :model-value="information.revenueAmount"
:label="t('commercial.clients.form.information.revenueAmount')" :label="t('commercial.clients.form.information.revenueAmount')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.revenueAmount" :error="informationErrors.errors.revenueAmount"
@update:model-value="onRevenueAmountInput" @update:model-value="onRevenueAmountInput"
/> />
@@ -139,13 +139,13 @@
:model-value="information.directorName" :model-value="information.directorName"
@update:model-value="(v: string) => information.directorName = sanitizePersonName(v)" @update:model-value="(v: string) => information.directorName = sanitizePersonName(v)"
:label="t('commercial.clients.form.information.directorName')" :label="t('commercial.clients.form.information.directorName')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.directorName" :error="informationErrors.errors.directorName"
/> />
<MalioInputAmount <MalioInputAmount
v-model="information.profitAmount" v-model="information.profitAmount"
:label="t('commercial.clients.form.information.profitAmount')" :label="t('commercial.clients.form.information.profitAmount')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.profitAmount" :error="informationErrors.errors.profitAmount"
/> />
</div> </div>
@@ -176,7 +176,7 @@
:model-value="contact" :model-value="contact"
:title="t('commercial.clients.form.contact.title', { n: index + 1 })" :title="t('commercial.clients.form.contact.title', { n: index + 1 })"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="isValidated('contact')" :disabled="isValidated('contact')"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -213,7 +213,7 @@
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
:removable="isRowRemovable(addresses, index)" :removable="isRowRemovable(addresses, index)"
:readonly="isValidated('address')" :disabled="isValidated('address')"
:errors="addressErrors[index]" :errors="addressErrors[index]"
@update:model-value="(v) => addresses[index] = v" @update:model-value="(v) => addresses[index] = v"
@remove="askRemoveAddress(index)" @remove="askRemoveAddress(index)"
@@ -247,7 +247,7 @@
v-model="accounting.siren" v-model="accounting.siren"
:label="t('commercial.clients.form.accounting.siren')" :label="t('commercial.clients.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.siren" :error="accountingErrors.errors.siren"
/> />
@@ -255,7 +255,7 @@
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
@update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.accountNumber')" :label="t('commercial.clients.form.accounting.accountNumber')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.accountNumber" :error="accountingErrors.errors.accountNumber"
/> />
@@ -263,7 +263,7 @@
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="referentials.tvaModes.value" :options="referentials.tvaModes.value"
:label="t('commercial.clients.form.accounting.tvaMode')" :label="t('commercial.clients.form.accounting.tvaMode')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.tvaMode" :error="accountingErrors.errors.tvaMode"
@@ -273,7 +273,7 @@
:model-value="accounting.nTva" :model-value="accounting.nTva"
@update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.nTva')" :label="t('commercial.clients.form.accounting.nTva')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.nTva" :error="accountingErrors.errors.nTva"
/> />
@@ -281,7 +281,7 @@
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="referentials.paymentDelays.value" :options="referentials.paymentDelays.value"
:label="t('commercial.clients.form.accounting.paymentDelay')" :label="t('commercial.clients.form.accounting.paymentDelay')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentDelay" :error="accountingErrors.errors.paymentDelay"
@@ -291,7 +291,7 @@
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="referentials.paymentTypes.value" :options="referentials.paymentTypes.value"
:label="t('commercial.clients.form.accounting.paymentType')" :label="t('commercial.clients.form.accounting.paymentType')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentType" :error="accountingErrors.errors.paymentType"
@@ -302,7 +302,7 @@
:model-value="accounting.bankIri" :model-value="accounting.bankIri"
:options="referentials.banks.value" :options="referentials.banks.value"
:label="t('commercial.clients.form.accounting.bank')" :label="t('commercial.clients.form.accounting.bank')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.bank" :error="accountingErrors.errors.bank"
@@ -330,7 +330,7 @@
<MalioInputText <MalioInputText
v-model="rib.label" v-model="rib.label"
:label="t('commercial.clients.form.accounting.ribLabel')" :label="t('commercial.clients.form.accounting.ribLabel')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.label" :error="ribErrors[index]?.label"
/> />
@@ -338,7 +338,7 @@
:model-value="rib.bic" :model-value="rib.bic"
@update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.ribBic')" :label="t('commercial.clients.form.accounting.ribBic')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.bic" :error="ribErrors[index]?.bic"
/> />
@@ -346,7 +346,7 @@
:model-value="rib.iban" :model-value="rib.iban"
@update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)"
:label="t('commercial.clients.form.accounting.ribIban')" :label="t('commercial.clients.form.accounting.ribIban')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.iban" :error="ribErrors[index]?.iban"
/> />
@@ -26,7 +26,7 @@
:model-value="main.companyName" :model-value="main.companyName"
:label="t('commercial.suppliers.form.main.companyName')" :label="t('commercial.suppliers.form.main.companyName')"
:required="true" :required="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="mainErrors.errors.companyName" :error="mainErrors.errors.companyName"
@update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)"
/> />
@@ -35,7 +35,7 @@
:options="mainCategoryOptions" :options="mainCategoryOptions"
:label="t('commercial.suppliers.form.main.categories')" :label="t('commercial.suppliers.form.main.categories')"
:display-tag="true" :display-tag="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:required="true" :required="true"
:error="mainErrors.errors.categories" :error="mainErrors.errors.categories"
@update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)"
@@ -63,13 +63,13 @@
resize="none" resize="none"
group-class="row-span-2 pt-1 pb-1" group-class="row-span-2 pt-1 pb-1"
text-input="h-full text-lg" text-input="h-full text-lg"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.description" :error="informationErrors.errors.description"
/> />
<MalioInputText <MalioInputText
:model-value="information.competitors" :model-value="information.competitors"
:label="t('commercial.suppliers.form.information.competitors')" :label="t('commercial.suppliers.form.information.competitors')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.competitors" :error="informationErrors.errors.competitors"
@update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)" @update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)"
/> />
@@ -78,7 +78,7 @@
<MalioDate <MalioDate
v-model="information.foundedAt" v-model="information.foundedAt"
:label="t('commercial.suppliers.form.information.foundedAt')" :label="t('commercial.suppliers.form.information.foundedAt')"
:readonly="businessReadonly" :disabled="businessReadonly"
:editable="true" :editable="true"
:max="maxFoundedAt" :max="maxFoundedAt"
:error="informationErrors.errors.foundedAt" :error="informationErrors.errors.foundedAt"
@@ -88,7 +88,7 @@
v-model="information.employeesCount" v-model="information.employeesCount"
:label="t('commercial.suppliers.form.information.employeesCount')" :label="t('commercial.suppliers.form.information.employeesCount')"
:mask="EMPLOYEES_MASK" :mask="EMPLOYEES_MASK"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.employeesCount" :error="informationErrors.errors.employeesCount"
/> />
<!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie, <!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie,
@@ -97,21 +97,21 @@
:key="revenueAmountKey" :key="revenueAmountKey"
:model-value="information.revenueAmount" :model-value="information.revenueAmount"
:label="t('commercial.suppliers.form.information.revenueAmount')" :label="t('commercial.suppliers.form.information.revenueAmount')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.revenueAmount" :error="informationErrors.errors.revenueAmount"
@update:model-value="onRevenueAmountInput" @update:model-value="onRevenueAmountInput"
/> />
<MalioInputText <MalioInputText
:model-value="information.directorName" :model-value="information.directorName"
:label="t('commercial.suppliers.form.information.directorName')" :label="t('commercial.suppliers.form.information.directorName')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.directorName" :error="informationErrors.errors.directorName"
@update:model-value="(v: string) => information.directorName = sanitizePersonName(v)" @update:model-value="(v: string) => information.directorName = sanitizePersonName(v)"
/> />
<MalioInputAmount <MalioInputAmount
v-model="information.profitAmount" v-model="information.profitAmount"
:label="t('commercial.suppliers.form.information.profitAmount')" :label="t('commercial.suppliers.form.information.profitAmount')"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.profitAmount" :error="informationErrors.errors.profitAmount"
/> />
<!-- Volume previsionnel : specifique fournisseur (entier). --> <!-- Volume previsionnel : specifique fournisseur (entier). -->
@@ -119,7 +119,7 @@
v-model="information.volumeForecast" v-model="information.volumeForecast"
:label="t('commercial.suppliers.form.information.volumeForecast')" :label="t('commercial.suppliers.form.information.volumeForecast')"
:mask="VOLUME_FORECAST_MASK" :mask="VOLUME_FORECAST_MASK"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="informationErrors.errors.volumeForecast" :error="informationErrors.errors.volumeForecast"
/> />
</div> </div>
@@ -146,7 +146,7 @@
:model-value="contact" :model-value="contact"
:title="t('commercial.suppliers.form.contact.title', { n: index + 1 })" :title="t('commercial.suppliers.form.contact.title', { n: index + 1 })"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="businessReadonly" :disabled="businessReadonly"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -183,7 +183,7 @@
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
:removable="isRowRemovable(addresses, index)" :removable="isRowRemovable(addresses, index)"
:readonly="businessReadonly" :disabled="businessReadonly"
:errors="addressErrors[index]" :errors="addressErrors[index]"
@update:model-value="(v) => addresses[index] = v" @update:model-value="(v) => addresses[index] = v"
@remove="askRemoveAddress(index)" @remove="askRemoveAddress(index)"
@@ -218,14 +218,14 @@
v-model="accounting.siren" v-model="accounting.siren"
:label="t('commercial.suppliers.form.accounting.siren')" :label="t('commercial.suppliers.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.siren" :error="accountingErrors.errors.siren"
/> />
<MalioInputText <MalioInputText
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
:label="t('commercial.suppliers.form.accounting.accountNumber')" :label="t('commercial.suppliers.form.accounting.accountNumber')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.accountNumber" :error="accountingErrors.errors.accountNumber"
@update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)"
@@ -234,7 +234,7 @@
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="tvaModeOptions" :options="tvaModeOptions"
:label="t('commercial.suppliers.form.accounting.tvaMode')" :label="t('commercial.suppliers.form.accounting.tvaMode')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.tvaMode" :error="accountingErrors.errors.tvaMode"
@@ -243,7 +243,7 @@
<MalioInputText <MalioInputText
:model-value="accounting.nTva" :model-value="accounting.nTva"
:label="t('commercial.suppliers.form.accounting.nTva')" :label="t('commercial.suppliers.form.accounting.nTva')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.nTva" :error="accountingErrors.errors.nTva"
@update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)"
@@ -252,7 +252,7 @@
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="paymentDelayOptions" :options="paymentDelayOptions"
:label="t('commercial.suppliers.form.accounting.paymentDelay')" :label="t('commercial.suppliers.form.accounting.paymentDelay')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentDelay" :error="accountingErrors.errors.paymentDelay"
@@ -262,7 +262,7 @@
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="paymentTypeOptions" :options="paymentTypeOptions"
:label="t('commercial.suppliers.form.accounting.paymentType')" :label="t('commercial.suppliers.form.accounting.paymentType')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentType" :error="accountingErrors.errors.paymentType"
@@ -273,7 +273,7 @@
:model-value="accounting.bankIri" :model-value="accounting.bankIri"
:options="bankOptions" :options="bankOptions"
:label="t('commercial.suppliers.form.accounting.bank')" :label="t('commercial.suppliers.form.accounting.bank')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.bank" :error="accountingErrors.errors.bank"
@@ -300,14 +300,14 @@
<MalioInputText <MalioInputText
v-model="rib.label" v-model="rib.label"
:label="t('commercial.suppliers.form.accounting.ribLabel')" :label="t('commercial.suppliers.form.accounting.ribLabel')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.label" :error="ribErrors[index]?.label"
/> />
<MalioInputText <MalioInputText
:model-value="rib.bic" :model-value="rib.bic"
:label="t('commercial.suppliers.form.accounting.ribBic')" :label="t('commercial.suppliers.form.accounting.ribBic')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.bic" :error="ribErrors[index]?.bic"
@update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)"
@@ -315,7 +315,7 @@
<MalioInputText <MalioInputText
:model-value="rib.iban" :model-value="rib.iban"
:label="t('commercial.suppliers.form.accounting.ribIban')" :label="t('commercial.suppliers.form.accounting.ribIban')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.iban" :error="ribErrors[index]?.iban"
@update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)"
@@ -50,14 +50,14 @@
<MalioInputText <MalioInputText
:model-value="supplier.companyName" :model-value="supplier.companyName"
:label="t('commercial.suppliers.form.main.companyName')" :label="t('commercial.suppliers.form.main.companyName')"
readonly disabled
/> />
<MalioSelectCheckbox <MalioSelectCheckbox
:model-value="categoryIris" :model-value="categoryIris"
:options="mainCategoryOptions" :options="mainCategoryOptions"
:label="t('commercial.suppliers.form.main.categories')" :label="t('commercial.suppliers.form.main.categories')"
:display-tag="true" :display-tag="true"
readonly disabled
/> />
</div> </div>
@@ -74,43 +74,43 @@
resize="none" resize="none"
group-class="row-span-2 pt-1 pb-1" group-class="row-span-2 pt-1 pb-1"
text-input="h-full text-lg" text-input="h-full text-lg"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="information.competitors" :model-value="information.competitors"
:label="t('commercial.suppliers.form.information.competitors')" :label="t('commercial.suppliers.form.information.competitors')"
readonly disabled
/> />
<MalioDate <MalioDate
:model-value="information.foundedAt" :model-value="information.foundedAt"
:label="t('commercial.suppliers.form.information.foundedAt')" :label="t('commercial.suppliers.form.information.foundedAt')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="information.employeesCount" :model-value="information.employeesCount"
:label="t('commercial.suppliers.form.information.employeesCount')" :label="t('commercial.suppliers.form.information.employeesCount')"
readonly disabled
/> />
<MalioInputAmount <MalioInputAmount
:model-value="information.revenueAmount" :model-value="information.revenueAmount"
:label="t('commercial.suppliers.form.information.revenueAmount')" :label="t('commercial.suppliers.form.information.revenueAmount')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="information.directorName" :model-value="information.directorName"
:label="t('commercial.suppliers.form.information.directorName')" :label="t('commercial.suppliers.form.information.directorName')"
readonly disabled
/> />
<MalioInputAmount <MalioInputAmount
:model-value="information.profitAmount" :model-value="information.profitAmount"
:label="t('commercial.suppliers.form.information.profitAmount')" :label="t('commercial.suppliers.form.information.profitAmount')"
readonly disabled
/> />
<!-- Volume previsionnel : specifique fournisseur (entier). --> <!-- Volume previsionnel : specifique fournisseur (entier). -->
<MalioInputText <MalioInputText
:model-value="information.volumeForecast" :model-value="information.volumeForecast"
:label="t('commercial.suppliers.form.information.volumeForecast')" :label="t('commercial.suppliers.form.information.volumeForecast')"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -123,7 +123,7 @@
:key="contact.id ?? index" :key="contact.id ?? index"
:model-value="contact" :model-value="contact"
:title="t('commercial.suppliers.form.contact.title', { n: index + 1 })" :title="t('commercial.suppliers.form.contact.title', { n: index + 1 })"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -140,7 +140,7 @@
:site-options="allSiteOptions" :site-options="allSiteOptions"
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -154,38 +154,38 @@
:model-value="accounting.siren" :model-value="accounting.siren"
:label="t('commercial.suppliers.form.accounting.siren')" :label="t('commercial.suppliers.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
:label="t('commercial.suppliers.form.accounting.accountNumber')" :label="t('commercial.suppliers.form.accounting.accountNumber')"
readonly disabled
/> />
<MalioSelect <MalioSelect
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="tvaModeOptions" :options="tvaModeOptions"
:label="t('commercial.suppliers.form.accounting.tvaMode')" :label="t('commercial.suppliers.form.accounting.tvaMode')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="accounting.nTva" :model-value="accounting.nTva"
:label="t('commercial.suppliers.form.accounting.nTva')" :label="t('commercial.suppliers.form.accounting.nTva')"
readonly disabled
/> />
<MalioSelect <MalioSelect
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="paymentDelayOptions" :options="paymentDelayOptions"
:label="t('commercial.suppliers.form.accounting.paymentDelay')" :label="t('commercial.suppliers.form.accounting.paymentDelay')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
<MalioSelect <MalioSelect
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="paymentTypeOptions" :options="paymentTypeOptions"
:label="t('commercial.suppliers.form.accounting.paymentType')" :label="t('commercial.suppliers.form.accounting.paymentType')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
<MalioSelect <MalioSelect
v-if="accounting.bankIri" v-if="accounting.bankIri"
@@ -193,7 +193,7 @@
:options="bankOptions" :options="bankOptions"
:label="t('commercial.suppliers.form.accounting.bank')" :label="t('commercial.suppliers.form.accounting.bank')"
empty-option-label="" empty-option-label=""
readonly disabled
/> />
</div> </div>
</div> </div>
@@ -208,17 +208,17 @@
<MalioInputText <MalioInputText
:model-value="rib.label" :model-value="rib.label"
:label="t('commercial.suppliers.form.accounting.ribLabel')" :label="t('commercial.suppliers.form.accounting.ribLabel')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="rib.bic" :model-value="rib.bic"
:label="t('commercial.suppliers.form.accounting.ribBic')" :label="t('commercial.suppliers.form.accounting.ribBic')"
readonly disabled
/> />
<MalioInputText <MalioInputText
:model-value="rib.iban" :model-value="rib.iban"
:label="t('commercial.suppliers.form.accounting.ribIban')" :label="t('commercial.suppliers.form.accounting.ribIban')"
readonly disabled
/> />
</div> </div>
</div> </div>
@@ -21,7 +21,7 @@
:model-value="main.companyName" :model-value="main.companyName"
:label="t('commercial.suppliers.form.main.companyName')" :label="t('commercial.suppliers.form.main.companyName')"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.companyName" :error="mainErrors.errors.companyName"
@update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)"
/> />
@@ -30,7 +30,7 @@
:options="referentials.categories.value" :options="referentials.categories.value"
:label="t('commercial.suppliers.form.main.categories')" :label="t('commercial.suppliers.form.main.categories')"
:display-tag="true" :display-tag="true"
:readonly="mainLocked" :disabled="mainLocked"
:required="true" :required="true"
:error="mainErrors.errors.categories" :error="mainErrors.errors.categories"
@update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)"
@@ -57,13 +57,13 @@
resize="none" resize="none"
group-class="row-span-2 pt-1 pb-1" group-class="row-span-2 pt-1 pb-1"
text-input="h-full text-lg" text-input="h-full text-lg"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.description" :error="informationErrors.errors.description"
/> />
<MalioInputText <MalioInputText
:model-value="information.competitors" :model-value="information.competitors"
:label="t('commercial.suppliers.form.information.competitors')" :label="t('commercial.suppliers.form.information.competitors')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.competitors" :error="informationErrors.errors.competitors"
@update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)" @update:model-value="(v: string) => information.competitors = sanitizeFreeText(v)"
/> />
@@ -72,7 +72,7 @@
<MalioDate <MalioDate
v-model="information.foundedAt" v-model="information.foundedAt"
:label="t('commercial.suppliers.form.information.foundedAt')" :label="t('commercial.suppliers.form.information.foundedAt')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:editable="true" :editable="true"
:max="maxFoundedAt" :max="maxFoundedAt"
:error="informationErrors.errors.foundedAt" :error="informationErrors.errors.foundedAt"
@@ -82,7 +82,7 @@
v-model="information.employeesCount" v-model="information.employeesCount"
:label="t('commercial.suppliers.form.information.employeesCount')" :label="t('commercial.suppliers.form.information.employeesCount')"
:mask="EMPLOYEES_MASK" :mask="EMPLOYEES_MASK"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.employeesCount" :error="informationErrors.errors.employeesCount"
/> />
<!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie, <!-- CA plafonne a 999 999 999 999,99 (ERP-193) : clamp a la saisie,
@@ -91,21 +91,21 @@
:key="revenueAmountKey" :key="revenueAmountKey"
:model-value="information.revenueAmount" :model-value="information.revenueAmount"
:label="t('commercial.suppliers.form.information.revenueAmount')" :label="t('commercial.suppliers.form.information.revenueAmount')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.revenueAmount" :error="informationErrors.errors.revenueAmount"
@update:model-value="onRevenueAmountInput" @update:model-value="onRevenueAmountInput"
/> />
<MalioInputText <MalioInputText
:model-value="information.directorName" :model-value="information.directorName"
:label="t('commercial.suppliers.form.information.directorName')" :label="t('commercial.suppliers.form.information.directorName')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.directorName" :error="informationErrors.errors.directorName"
@update:model-value="(v: string) => information.directorName = sanitizePersonName(v)" @update:model-value="(v: string) => information.directorName = sanitizePersonName(v)"
/> />
<MalioInputAmount <MalioInputAmount
v-model="information.profitAmount" v-model="information.profitAmount"
:label="t('commercial.suppliers.form.information.profitAmount')" :label="t('commercial.suppliers.form.information.profitAmount')"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.profitAmount" :error="informationErrors.errors.profitAmount"
/> />
<!-- Volume previsionnel : specifique fournisseur. Champ texte <!-- Volume previsionnel : specifique fournisseur. Champ texte
@@ -114,7 +114,7 @@
v-model="information.volumeForecast" v-model="information.volumeForecast"
:label="t('commercial.suppliers.form.information.volumeForecast')" :label="t('commercial.suppliers.form.information.volumeForecast')"
:mask="VOLUME_FORECAST_MASK" :mask="VOLUME_FORECAST_MASK"
:readonly="isValidated('information')" :disabled="isValidated('information')"
:error="informationErrors.errors.volumeForecast" :error="informationErrors.errors.volumeForecast"
/> />
</div> </div>
@@ -141,7 +141,7 @@
:model-value="contact" :model-value="contact"
:title="t('commercial.suppliers.form.contact.title', { n: index + 1 })" :title="t('commercial.suppliers.form.contact.title', { n: index + 1 })"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="isValidated('contacts')" :disabled="isValidated('contacts')"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -178,7 +178,7 @@
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
:removable="isRowRemovable(addresses, index)" :removable="isRowRemovable(addresses, index)"
:readonly="isValidated('addresses')" :disabled="isValidated('addresses')"
:errors="addressErrors[index]" :errors="addressErrors[index]"
@update:model-value="(v) => addresses[index] = v" @update:model-value="(v) => addresses[index] = v"
@remove="askRemoveAddress(index)" @remove="askRemoveAddress(index)"
@@ -212,14 +212,14 @@
v-model="accounting.siren" v-model="accounting.siren"
:label="t('commercial.suppliers.form.accounting.siren')" :label="t('commercial.suppliers.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.siren" :error="accountingErrors.errors.siren"
/> />
<MalioInputText <MalioInputText
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
:label="t('commercial.suppliers.form.accounting.accountNumber')" :label="t('commercial.suppliers.form.accounting.accountNumber')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.accountNumber" :error="accountingErrors.errors.accountNumber"
@update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)"
@@ -228,7 +228,7 @@
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="referentials.tvaModes.value" :options="referentials.tvaModes.value"
:label="t('commercial.suppliers.form.accounting.tvaMode')" :label="t('commercial.suppliers.form.accounting.tvaMode')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.tvaMode" :error="accountingErrors.errors.tvaMode"
@@ -237,7 +237,7 @@
<MalioInputText <MalioInputText
:model-value="accounting.nTva" :model-value="accounting.nTva"
:label="t('commercial.suppliers.form.accounting.nTva')" :label="t('commercial.suppliers.form.accounting.nTva')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.nTva" :error="accountingErrors.errors.nTva"
@update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)"
@@ -246,7 +246,7 @@
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="referentials.paymentDelays.value" :options="referentials.paymentDelays.value"
:label="t('commercial.suppliers.form.accounting.paymentDelay')" :label="t('commercial.suppliers.form.accounting.paymentDelay')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentDelay" :error="accountingErrors.errors.paymentDelay"
@@ -256,7 +256,7 @@
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="referentials.paymentTypes.value" :options="referentials.paymentTypes.value"
:label="t('commercial.suppliers.form.accounting.paymentType')" :label="t('commercial.suppliers.form.accounting.paymentType')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentType" :error="accountingErrors.errors.paymentType"
@@ -267,7 +267,7 @@
:model-value="accounting.bankIri" :model-value="accounting.bankIri"
:options="referentials.banks.value" :options="referentials.banks.value"
:label="t('commercial.suppliers.form.accounting.bank')" :label="t('commercial.suppliers.form.accounting.bank')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.bank" :error="accountingErrors.errors.bank"
@@ -294,14 +294,14 @@
<MalioInputText <MalioInputText
v-model="rib.label" v-model="rib.label"
:label="t('commercial.suppliers.form.accounting.ribLabel')" :label="t('commercial.suppliers.form.accounting.ribLabel')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.label" :error="ribErrors[index]?.label"
/> />
<MalioInputText <MalioInputText
:model-value="rib.bic" :model-value="rib.bic"
:label="t('commercial.suppliers.form.accounting.ribBic')" :label="t('commercial.suppliers.form.accounting.ribBic')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.bic" :error="ribErrors[index]?.bic"
@update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)"
@@ -309,7 +309,7 @@
<MalioInputText <MalioInputText
:model-value="rib.iban" :model-value="rib.iban"
:label="t('commercial.suppliers.form.accounting.ribIban')" :label="t('commercial.suppliers.form.accounting.ribIban')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="isRibRequired" :required="isRibRequired"
:error="ribErrors[index]?.iban" :error="ribErrors[index]?.iban"
@update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)"
@@ -2,7 +2,7 @@
<div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]"> <div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]">
<!-- Suppression : modal de confirmation cote parent. --> <!-- Suppression : modal de confirmation cote parent. -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -17,6 +17,7 @@
:label="t('technique.providers.form.address.sites')" :label="t('technique.providers.form.address.sites')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.sites" :error="errors?.sites"
@update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('siteIris', v.map(String))"
@@ -29,6 +30,7 @@
:label="t('technique.providers.form.address.categories')" :label="t('technique.providers.form.address.categories')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.categories" :error="errors?.categories"
@update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))"
@@ -41,6 +43,7 @@
:label="t('technique.providers.form.address.contacts')" :label="t('technique.providers.form.address.contacts')"
:display-tag="true" :display-tag="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
@update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))" @update:model-value="(v: (string | number)[]) => update('contactIris', v.map(String))"
/> />
@@ -49,6 +52,7 @@
:options="countryOptions" :options="countryOptions"
:label="t('technique.providers.form.address.country')" :label="t('technique.providers.form.address.country')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
@update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))"
/> />
@@ -58,6 +62,7 @@
:label="t('technique.providers.form.address.postalCode')" :label="t('technique.providers.form.address.postalCode')"
:mask="POSTAL_CODE_MASK" :mask="POSTAL_CODE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.postalCode" :error="errors?.postalCode"
@update:model-value="onPostalCodeChange" @update:model-value="onPostalCodeChange"
@@ -70,6 +75,7 @@
:options="cityOptions" :options="cityOptions"
:label="t('technique.providers.form.address.city')" :label="t('technique.providers.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@@ -80,6 +86,7 @@
:model-value="model.city" :model-value="model.city"
:label="t('technique.providers.form.address.city')" :label="t('technique.providers.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@update:model-value="(v: string) => update('city', v)" @update:model-value="(v: string) => update('city', v)"
@@ -89,13 +96,14 @@
texte saisi est conserve si la BAN ne propose rien (saisie manuelle). --> texte saisi est conserve si la BAN ne propose rien (saisie manuelle). -->
<div class="col-span-2"> <div class="col-span-2">
<MalioInputAutocomplete <MalioInputAutocomplete
v-if="!readonly" v-if="!readonly && !disabled"
:model-value="model.street" :model-value="model.street"
:options="addressOptions" :options="addressOptions"
:loading="addressLoading" :loading="addressLoading"
:min-search-length="3" :min-search-length="3"
:label="t('technique.providers.form.address.street')" :label="t('technique.providers.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
:allow-create="true" :allow-create="true"
@@ -109,6 +117,7 @@
:model-value="model.street" :model-value="model.street"
:label="t('technique.providers.form.address.street')" :label="t('technique.providers.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
@update:model-value="(v: string) => update('street', v)" @update:model-value="(v: string) => update('street', v)"
@@ -120,6 +129,7 @@
:model-value="model.streetComplement" :model-value="model.streetComplement"
:label="t('technique.providers.form.address.streetComplement')" :label="t('technique.providers.form.address.streetComplement')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.streetComplement" :error="errors?.streetComplement"
@update:model-value="(v: string) => update('streetComplement', v)" @update:model-value="(v: string) => update('streetComplement', v)"
/> />
@@ -149,6 +159,8 @@ const props = defineProps<{
countryOptions: RefOption[] countryOptions: RefOption[]
removable?: boolean removable?: boolean
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -3,7 +3,7 @@
<!-- Suppression : ouvre une modal de confirmation cote parent. Masquee si <!-- Suppression : ouvre une modal de confirmation cote parent. Masquee si
non supprimable (1er bloc) ou en lecture seule. --> non supprimable (1er bloc) ou en lecture seule. -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -15,6 +15,7 @@
:model-value="model.lastName" :model-value="model.lastName"
:label="t('technique.providers.form.contact.lastName')" :label="t('technique.providers.form.contact.lastName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.lastName" :error="errors?.lastName"
@update:model-value="(v: string) => update('lastName', v)" @update:model-value="(v: string) => update('lastName', v)"
/> />
@@ -22,6 +23,7 @@
:model-value="model.firstName" :model-value="model.firstName"
:label="t('technique.providers.form.contact.firstName')" :label="t('technique.providers.form.contact.firstName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.firstName" :error="errors?.firstName"
@update:model-value="(v: string) => update('firstName', v)" @update:model-value="(v: string) => update('firstName', v)"
/> />
@@ -33,6 +35,7 @@
:model-value="model.jobTitle" :model-value="model.jobTitle"
:label="t('technique.providers.form.contact.jobTitle')" :label="t('technique.providers.form.contact.jobTitle')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.jobTitle" :error="errors?.jobTitle"
@update:model-value="(v: string) => update('jobTitle', v)" @update:model-value="(v: string) => update('jobTitle', v)"
/> />
@@ -41,6 +44,7 @@
:model-value="model.email" :model-value="model.email"
:label="t('technique.providers.form.contact.email')" :label="t('technique.providers.form.contact.email')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:lowercase="true" :lowercase="true"
:error="errors?.email" :error="errors?.email"
@update:model-value="(v: string) => update('email', v)" @update:model-value="(v: string) => update('email', v)"
@@ -50,6 +54,7 @@
:label="t('technique.providers.form.contact.phonePrimary')" :label="t('technique.providers.form.contact.phonePrimary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phonePrimary" :error="errors?.phonePrimary"
:addable="!model.hasSecondaryPhone && !readonly" :addable="!model.hasSecondaryPhone && !readonly"
:add-button-label="t('technique.providers.form.contact.addPhone')" :add-button-label="t('technique.providers.form.contact.addPhone')"
@@ -63,6 +68,7 @@
:label="t('technique.providers.form.contact.phoneSecondary')" :label="t('technique.providers.form.contact.phoneSecondary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phoneSecondary" :error="errors?.phoneSecondary"
@update:model-value="(v: string) => update('phoneSecondary', v)" @update:model-value="(v: string) => update('phoneSecondary', v)"
/> />
@@ -83,6 +89,8 @@ const props = defineProps<{
removable?: boolean removable?: boolean
/** Bloc en lecture seule (onglet valide). */ /** Bloc en lecture seule (onglet valide). */
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -23,7 +23,7 @@
:model-value="main.companyName" :model-value="main.companyName"
:label="t('technique.providers.form.main.companyName')" :label="t('technique.providers.form.main.companyName')"
:required="true" :required="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:error="mainErrors.errors.companyName" :error="mainErrors.errors.companyName"
@update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)"
/> />
@@ -32,7 +32,7 @@
:options="referentials.categories.value" :options="referentials.categories.value"
:label="t('technique.providers.form.main.categories')" :label="t('technique.providers.form.main.categories')"
:display-tag="true" :display-tag="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:required="true" :required="true"
:error="mainErrors.errors.categories" :error="mainErrors.errors.categories"
@update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)"
@@ -42,7 +42,7 @@
:options="referentials.sites.value" :options="referentials.sites.value"
:label="t('technique.providers.form.main.sites')" :label="t('technique.providers.form.main.sites')"
:display-tag="true" :display-tag="true"
:readonly="businessReadonly" :disabled="businessReadonly"
:required="true" :required="true"
:error="mainErrors.errors.sites" :error="mainErrors.errors.sites"
@update:model-value="(v: (string | number)[]) => main.siteIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.siteIris = v.map(String)"
@@ -72,7 +72,7 @@
:key="index" :key="index"
:model-value="contact" :model-value="contact"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="businessReadonly" :disabled="businessReadonly"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -108,7 +108,7 @@
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
:removable="isRowRemovable(addresses, index)" :removable="isRowRemovable(addresses, index)"
:readonly="businessReadonly" :disabled="businessReadonly"
:errors="addressErrors[index]" :errors="addressErrors[index]"
@update:model-value="(v) => addresses[index] = v" @update:model-value="(v) => addresses[index] = v"
@remove="askRemoveAddress(index)" @remove="askRemoveAddress(index)"
@@ -142,14 +142,14 @@
v-model="accounting.siren" v-model="accounting.siren"
:label="t('technique.providers.form.accounting.siren')" :label="t('technique.providers.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.siren" :error="accountingErrors.errors.siren"
/> />
<MalioInputText <MalioInputText
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
:label="t('technique.providers.form.accounting.accountNumber')" :label="t('technique.providers.form.accounting.accountNumber')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.accountNumber" :error="accountingErrors.errors.accountNumber"
@update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)"
@@ -158,7 +158,7 @@
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="referentials.tvaModes.value" :options="referentials.tvaModes.value"
:label="t('technique.providers.form.accounting.tvaMode')" :label="t('technique.providers.form.accounting.tvaMode')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.tvaMode" :error="accountingErrors.errors.tvaMode"
@@ -167,7 +167,7 @@
<MalioInputText <MalioInputText
:model-value="accounting.nTva" :model-value="accounting.nTva"
:label="t('technique.providers.form.accounting.nTva')" :label="t('technique.providers.form.accounting.nTva')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.nTva" :error="accountingErrors.errors.nTva"
@update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)"
@@ -176,7 +176,7 @@
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="referentials.paymentDelays.value" :options="referentials.paymentDelays.value"
:label="t('technique.providers.form.accounting.paymentDelay')" :label="t('technique.providers.form.accounting.paymentDelay')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentDelay" :error="accountingErrors.errors.paymentDelay"
@@ -186,7 +186,7 @@
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="referentials.paymentTypes.value" :options="referentials.paymentTypes.value"
:label="t('technique.providers.form.accounting.paymentType')" :label="t('technique.providers.form.accounting.paymentType')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentType" :error="accountingErrors.errors.paymentType"
@@ -197,7 +197,7 @@
:model-value="accounting.bankIri" :model-value="accounting.bankIri"
:options="referentials.banks.value" :options="referentials.banks.value"
:label="t('technique.providers.form.accounting.bank')" :label="t('technique.providers.form.accounting.bank')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.bank" :error="accountingErrors.errors.bank"
@@ -224,14 +224,14 @@
<MalioInputText <MalioInputText
v-model="rib.label" v-model="rib.label"
:label="t('technique.providers.form.accounting.ribLabel')" :label="t('technique.providers.form.accounting.ribLabel')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="ribErrors[index]?.label" :error="ribErrors[index]?.label"
/> />
<MalioInputText <MalioInputText
:model-value="rib.bic" :model-value="rib.bic"
:label="t('technique.providers.form.accounting.ribBic')" :label="t('technique.providers.form.accounting.ribBic')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="ribErrors[index]?.bic" :error="ribErrors[index]?.bic"
@update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)"
@@ -239,7 +239,7 @@
<MalioInputText <MalioInputText
:model-value="rib.iban" :model-value="rib.iban"
:label="t('technique.providers.form.accounting.ribIban')" :label="t('technique.providers.form.accounting.ribIban')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="ribErrors[index]?.iban" :error="ribErrors[index]?.iban"
@update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)"
@@ -49,21 +49,21 @@
<MalioInputText <MalioInputText
:model-value="provider.companyName" :model-value="provider.companyName"
:label="t('technique.providers.form.main.companyName')" :label="t('technique.providers.form.main.companyName')"
readonly disabled
/> />
<MalioSelectCheckbox <MalioSelectCheckbox
:model-value="mainCategoryIris" :model-value="mainCategoryIris"
:options="mainCategoryOptions" :options="mainCategoryOptions"
:label="t('technique.providers.form.main.categories')" :label="t('technique.providers.form.main.categories')"
:display-tag="true" :display-tag="true"
readonly disabled
/> />
<MalioSelectCheckbox <MalioSelectCheckbox
:model-value="mainSiteIris" :model-value="mainSiteIris"
:options="mainSiteOptions" :options="mainSiteOptions"
:label="t('technique.providers.form.main.sites')" :label="t('technique.providers.form.main.sites')"
:display-tag="true" :display-tag="true"
readonly disabled
/> />
</div> </div>
@@ -77,7 +77,7 @@
v-for="(contact, index) in contacts" v-for="(contact, index) in contacts"
:key="index" :key="index"
:model-value="contact" :model-value="contact"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -93,7 +93,7 @@
:site-options="view.siteOptions" :site-options="view.siteOptions"
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptionsFor(view.draft.country)" :country-options="countryOptionsFor(view.draft.country)"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -105,13 +105,13 @@
<div class="mt-12 flex flex-col gap-6"> <div class="mt-12 flex flex-col gap-6">
<div class="bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]"> <div class="bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]">
<div class="grid grid-cols-4 gap-x-[44px] gap-y-4"> <div class="grid grid-cols-4 gap-x-[44px] gap-y-4">
<MalioInputText :model-value="accounting.siren" :label="t('technique.providers.form.accounting.siren')" readonly /> <MalioInputText :model-value="accounting.siren" :label="t('technique.providers.form.accounting.siren')" disabled />
<MalioInputText :model-value="accounting.accountNumber" :label="t('technique.providers.form.accounting.accountNumber')" readonly /> <MalioInputText :model-value="accounting.accountNumber" :label="t('technique.providers.form.accounting.accountNumber')" disabled />
<MalioSelect :model-value="accounting.tvaModeIri" :options="tvaModeOptions" :label="t('technique.providers.form.accounting.tvaMode')" readonly empty-option-label="" /> <MalioSelect :model-value="accounting.tvaModeIri" :options="tvaModeOptions" :label="t('technique.providers.form.accounting.tvaMode')" disabled empty-option-label="" />
<MalioInputText :model-value="accounting.nTva" :label="t('technique.providers.form.accounting.nTva')" readonly /> <MalioInputText :model-value="accounting.nTva" :label="t('technique.providers.form.accounting.nTva')" disabled />
<MalioSelect :model-value="accounting.paymentDelayIri" :options="paymentDelayOptions" :label="t('technique.providers.form.accounting.paymentDelay')" readonly empty-option-label="" /> <MalioSelect :model-value="accounting.paymentDelayIri" :options="paymentDelayOptions" :label="t('technique.providers.form.accounting.paymentDelay')" disabled empty-option-label="" />
<MalioSelect :model-value="accounting.paymentTypeIri" :options="paymentTypeOptions" :label="t('technique.providers.form.accounting.paymentType')" readonly empty-option-label="" /> <MalioSelect :model-value="accounting.paymentTypeIri" :options="paymentTypeOptions" :label="t('technique.providers.form.accounting.paymentType')" disabled empty-option-label="" />
<MalioSelect v-if="isBankRequired" :model-value="accounting.bankIri" :options="bankOptions" :label="t('technique.providers.form.accounting.bank')" readonly empty-option-label="" /> <MalioSelect v-if="isBankRequired" :model-value="accounting.bankIri" :options="bankOptions" :label="t('technique.providers.form.accounting.bank')" disabled empty-option-label="" />
</div> </div>
</div> </div>
@@ -122,9 +122,9 @@
class="bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]" class="bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]"
> >
<div class="grid grid-cols-4 gap-x-[44px] gap-y-4"> <div class="grid grid-cols-4 gap-x-[44px] gap-y-4">
<MalioInputText :model-value="rib.label" :label="t('technique.providers.form.accounting.ribLabel')" readonly /> <MalioInputText :model-value="rib.label" :label="t('technique.providers.form.accounting.ribLabel')" disabled />
<MalioInputText :model-value="rib.bic" :label="t('technique.providers.form.accounting.ribBic')" readonly /> <MalioInputText :model-value="rib.bic" :label="t('technique.providers.form.accounting.ribBic')" disabled />
<MalioInputText :model-value="rib.iban" :label="t('technique.providers.form.accounting.ribIban')" readonly /> <MalioInputText :model-value="rib.iban" :label="t('technique.providers.form.accounting.ribIban')" disabled />
</div> </div>
</div> </div>
</div> </div>
@@ -22,7 +22,7 @@
:model-value="main.companyName" :model-value="main.companyName"
:label="t('technique.providers.form.main.companyName')" :label="t('technique.providers.form.main.companyName')"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.companyName" :error="mainErrors.errors.companyName"
@update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)"
/> />
@@ -31,7 +31,7 @@
:options="referentials.categories.value" :options="referentials.categories.value"
:label="t('technique.providers.form.main.categories')" :label="t('technique.providers.form.main.categories')"
:display-tag="true" :display-tag="true"
:readonly="mainLocked" :disabled="mainLocked"
:required="true" :required="true"
:error="mainErrors.errors.categories" :error="mainErrors.errors.categories"
@update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)"
@@ -41,7 +41,7 @@
:options="referentials.sites.value" :options="referentials.sites.value"
:label="t('technique.providers.form.main.sites')" :label="t('technique.providers.form.main.sites')"
:display-tag="true" :display-tag="true"
:readonly="mainLocked" :disabled="mainLocked"
:required="true" :required="true"
:error="mainErrors.errors.sites" :error="mainErrors.errors.sites"
@update:model-value="(v: (string | number)[]) => main.siteIris = v.map(String)" @update:model-value="(v: (string | number)[]) => main.siteIris = v.map(String)"
@@ -73,7 +73,7 @@
:key="index" :key="index"
:model-value="contact" :model-value="contact"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="isValidated('contact')" :disabled="isValidated('contact')"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -108,7 +108,7 @@
:contact-options="contactOptions" :contact-options="contactOptions"
:country-options="countryOptions" :country-options="countryOptions"
:removable="isRowRemovable(addresses, index)" :removable="isRowRemovable(addresses, index)"
:readonly="isValidated('address')" :disabled="isValidated('address')"
:errors="addressErrors[index]" :errors="addressErrors[index]"
@update:model-value="(v) => addresses[index] = v" @update:model-value="(v) => addresses[index] = v"
@remove="askRemoveAddress(index)" @remove="askRemoveAddress(index)"
@@ -141,14 +141,14 @@
v-model="accounting.siren" v-model="accounting.siren"
:label="t('technique.providers.form.accounting.siren')" :label="t('technique.providers.form.accounting.siren')"
:mask="SIREN_MASK" :mask="SIREN_MASK"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.siren" :error="accountingErrors.errors.siren"
/> />
<MalioInputText <MalioInputText
:model-value="accounting.accountNumber" :model-value="accounting.accountNumber"
:label="t('technique.providers.form.accounting.accountNumber')" :label="t('technique.providers.form.accounting.accountNumber')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.accountNumber" :error="accountingErrors.errors.accountNumber"
@update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.accountNumber = sanitizeCodeAlnum(v)"
@@ -157,7 +157,7 @@
:model-value="accounting.tvaModeIri" :model-value="accounting.tvaModeIri"
:options="referentials.tvaModes.value" :options="referentials.tvaModes.value"
:label="t('technique.providers.form.accounting.tvaMode')" :label="t('technique.providers.form.accounting.tvaMode')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.tvaMode" :error="accountingErrors.errors.tvaMode"
@@ -166,7 +166,7 @@
<MalioInputText <MalioInputText
:model-value="accounting.nTva" :model-value="accounting.nTva"
:label="t('technique.providers.form.accounting.nTva')" :label="t('technique.providers.form.accounting.nTva')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="accountingErrors.errors.nTva" :error="accountingErrors.errors.nTva"
@update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => accounting.nTva = sanitizeCodeAlnum(v)"
@@ -175,7 +175,7 @@
:model-value="accounting.paymentDelayIri" :model-value="accounting.paymentDelayIri"
:options="referentials.paymentDelays.value" :options="referentials.paymentDelays.value"
:label="t('technique.providers.form.accounting.paymentDelay')" :label="t('technique.providers.form.accounting.paymentDelay')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentDelay" :error="accountingErrors.errors.paymentDelay"
@@ -185,7 +185,7 @@
:model-value="accounting.paymentTypeIri" :model-value="accounting.paymentTypeIri"
:options="referentials.paymentTypes.value" :options="referentials.paymentTypes.value"
:label="t('technique.providers.form.accounting.paymentType')" :label="t('technique.providers.form.accounting.paymentType')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.paymentType" :error="accountingErrors.errors.paymentType"
@@ -197,7 +197,7 @@
:model-value="accounting.bankIri" :model-value="accounting.bankIri"
:options="referentials.banks.value" :options="referentials.banks.value"
:label="t('technique.providers.form.accounting.bank')" :label="t('technique.providers.form.accounting.bank')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="accountingErrors.errors.bank" :error="accountingErrors.errors.bank"
@@ -224,14 +224,14 @@
<MalioInputText <MalioInputText
v-model="rib.label" v-model="rib.label"
:label="t('technique.providers.form.accounting.ribLabel')" :label="t('technique.providers.form.accounting.ribLabel')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="ribErrors[index]?.label" :error="ribErrors[index]?.label"
/> />
<MalioInputText <MalioInputText
:model-value="rib.bic" :model-value="rib.bic"
:label="t('technique.providers.form.accounting.ribBic')" :label="t('technique.providers.form.accounting.ribBic')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="ribErrors[index]?.bic" :error="ribErrors[index]?.bic"
@update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.bic = sanitizeCodeAlnum(v)"
@@ -239,7 +239,7 @@
<MalioInputText <MalioInputText
:model-value="rib.iban" :model-value="rib.iban"
:label="t('technique.providers.form.accounting.ribIban')" :label="t('technique.providers.form.accounting.ribIban')"
:readonly="accountingReadonly" :disabled="accountingReadonly"
:required="true" :required="true"
:error="ribErrors[index]?.iban" :error="ribErrors[index]?.iban"
@update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)" @update:model-value="(v: string) => rib.iban = sanitizeCodeAlnum(v)"
@@ -7,6 +7,7 @@
:options="countryOptions" :options="countryOptions"
:label="t('transport.carriers.form.address.country')" :label="t('transport.carriers.form.address.country')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.country" :error="errors?.country"
@update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))"
@@ -18,6 +19,7 @@
:label="t('transport.carriers.form.address.postalCode')" :label="t('transport.carriers.form.address.postalCode')"
:mask="POSTAL_CODE_MASK" :mask="POSTAL_CODE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.postalCode" :error="errors?.postalCode"
@update:model-value="onPostalCodeChange" @update:model-value="onPostalCodeChange"
@@ -30,6 +32,7 @@
:options="cityOptions" :options="cityOptions"
:label="t('transport.carriers.form.address.city')" :label="t('transport.carriers.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@@ -40,6 +43,7 @@
:model-value="model.city" :model-value="model.city"
:label="t('transport.carriers.form.address.city')" :label="t('transport.carriers.form.address.city')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.city" :error="errors?.city"
@update:model-value="(v: string) => update('city', v)" @update:model-value="(v: string) => update('city', v)"
@@ -52,13 +56,14 @@
texte saisi est conserve si la BAN ne propose rien (saisie manuelle). --> texte saisi est conserve si la BAN ne propose rien (saisie manuelle). -->
<div class="col-span-2"> <div class="col-span-2">
<MalioInputAutocomplete <MalioInputAutocomplete
v-if="!readonly" v-if="!readonly && !disabled"
:model-value="model.street" :model-value="model.street"
:options="addressOptions" :options="addressOptions"
:loading="addressLoading" :loading="addressLoading"
:min-search-length="3" :min-search-length="3"
:label="t('transport.carriers.form.address.street')" :label="t('transport.carriers.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
:allow-create="true" :allow-create="true"
@@ -72,6 +77,7 @@
:model-value="model.street" :model-value="model.street"
:label="t('transport.carriers.form.address.street')" :label="t('transport.carriers.form.address.street')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:required="true" :required="true"
:error="errors?.street" :error="errors?.street"
@update:model-value="(v: string) => update('street', v)" @update:model-value="(v: string) => update('street', v)"
@@ -82,6 +88,7 @@
:model-value="model.streetComplement" :model-value="model.streetComplement"
:label="t('transport.carriers.form.address.streetComplement')" :label="t('transport.carriers.form.address.streetComplement')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.streetComplement" :error="errors?.streetComplement"
@update:model-value="(v: string) => update('streetComplement', v)" @update:model-value="(v: string) => update('streetComplement', v)"
/> />
@@ -107,6 +114,8 @@ const props = defineProps<{
/** Pays disponibles (France par defaut). */ /** Pays disponibles (France par defaut). */
countryOptions: RefOption[] countryOptions: RefOption[]
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -3,7 +3,7 @@
<!-- Suppression : ouvre une modal de confirmation côté parent. Masquée si <!-- Suppression : ouvre une modal de confirmation côté parent. Masquée si
non supprimable (1er bloc) ou en lecture seule. --> non supprimable (1er bloc) ou en lecture seule. -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -15,6 +15,7 @@
:model-value="model.lastName" :model-value="model.lastName"
:label="t('transport.carriers.form.contact.lastName')" :label="t('transport.carriers.form.contact.lastName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.lastName" :error="errors?.lastName"
@update:model-value="(v: string) => update('lastName', v)" @update:model-value="(v: string) => update('lastName', v)"
/> />
@@ -22,6 +23,7 @@
:model-value="model.firstName" :model-value="model.firstName"
:label="t('transport.carriers.form.contact.firstName')" :label="t('transport.carriers.form.contact.firstName')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.firstName" :error="errors?.firstName"
@update:model-value="(v: string) => update('firstName', v)" @update:model-value="(v: string) => update('firstName', v)"
/> />
@@ -32,6 +34,7 @@
:model-value="model.jobTitle" :model-value="model.jobTitle"
:label="t('transport.carriers.form.contact.jobTitle')" :label="t('transport.carriers.form.contact.jobTitle')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.jobTitle" :error="errors?.jobTitle"
@update:model-value="(v: string) => update('jobTitle', v)" @update:model-value="(v: string) => update('jobTitle', v)"
/> />
@@ -40,6 +43,7 @@
:model-value="model.email" :model-value="model.email"
:label="t('transport.carriers.form.contact.email')" :label="t('transport.carriers.form.contact.email')"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:lowercase="true" :lowercase="true"
:error="errors?.email" :error="errors?.email"
@update:model-value="(v: string) => update('email', v)" @update:model-value="(v: string) => update('email', v)"
@@ -50,6 +54,7 @@
:label="t('transport.carriers.form.contact.phonePrimary')" :label="t('transport.carriers.form.contact.phonePrimary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phonePrimary" :error="errors?.phonePrimary"
:addable="!model.hasSecondaryPhone && !readonly" :addable="!model.hasSecondaryPhone && !readonly"
:add-button-label="t('transport.carriers.form.contact.addPhone')" :add-button-label="t('transport.carriers.form.contact.addPhone')"
@@ -63,6 +68,7 @@
:label="t('transport.carriers.form.contact.phoneSecondary')" :label="t('transport.carriers.form.contact.phoneSecondary')"
:mask="PHONE_MASK" :mask="PHONE_MASK"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.phoneSecondary" :error="errors?.phoneSecondary"
@update:model-value="(v: string) => update('phoneSecondary', v)" @update:model-value="(v: string) => update('phoneSecondary', v)"
/> />
@@ -83,6 +89,8 @@ const props = defineProps<{
removable?: boolean removable?: boolean
/** Bloc en lecture seule (onglet validé). */ /** Bloc en lecture seule (onglet validé). */
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexées par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexées par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -2,7 +2,7 @@
<div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]"> <div class="relative grid grid-cols-4 gap-x-[44px] gap-y-4 bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]">
<!-- Suppression : modal de confirmation côté parent. --> <!-- Suppression : modal de confirmation côté parent. -->
<MalioButtonIcon <MalioButtonIcon
v-if="removable && !readonly" v-if="removable && !readonly && !disabled"
icon="mdi:delete-outline" icon="mdi:delete-outline"
variant="ghost" variant="ghost"
button-class="absolute top-3 right-3" button-class="absolute top-3 right-3"
@@ -20,7 +20,7 @@
:name="`price-direction-${uid}`" :name="`price-direction-${uid}`"
value="CLIENT" value="CLIENT"
:label="t('transport.carriers.form.price.directionClient')" :label="t('transport.carriers.form.price.directionClient')"
:disabled="readonly" :disabled="readonly || disabled"
group-class="mt-0" group-class="mt-0"
@update:model-value="onDirectionChange" @update:model-value="onDirectionChange"
/> />
@@ -29,7 +29,7 @@
:name="`price-direction-${uid}`" :name="`price-direction-${uid}`"
value="FOURNISSEUR" value="FOURNISSEUR"
:label="t('transport.carriers.form.price.directionSupplier')" :label="t('transport.carriers.form.price.directionSupplier')"
:disabled="readonly" :disabled="readonly || disabled"
group-class="mt-0" group-class="mt-0"
@update:model-value="onDirectionChange" @update:model-value="onDirectionChange"
/> />
@@ -46,6 +46,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.client" :error="errors?.client"
@update:model-value="onClientChange" @update:model-value="onClientChange"
/> />
@@ -56,6 +57,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.clientDeliveryAddress" :error="errors?.clientDeliveryAddress"
@update:model-value="(v: string | number | null) => update('clientDeliveryAddressIri', v === null ? null : String(v))" @update:model-value="(v: string | number | null) => update('clientDeliveryAddressIri', v === null ? null : String(v))"
/> />
@@ -66,6 +68,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.departureSite" :error="errors?.departureSite"
@update:model-value="(v: string | number | null) => update('departureSiteIri', v === null ? null : String(v))" @update:model-value="(v: string | number | null) => update('departureSiteIri', v === null ? null : String(v))"
/> />
@@ -80,6 +83,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.supplier" :error="errors?.supplier"
@update:model-value="onSupplierChange" @update:model-value="onSupplierChange"
/> />
@@ -90,6 +94,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.supplierSupplyAddress" :error="errors?.supplierSupplyAddress"
@update:model-value="(v: string | number | null) => update('supplierSupplyAddressIri', v === null ? null : String(v))" @update:model-value="(v: string | number | null) => update('supplierSupplyAddressIri', v === null ? null : String(v))"
/> />
@@ -100,6 +105,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.deliverySite" :error="errors?.deliverySite"
@update:model-value="(v: string | number | null) => update('deliverySiteIri', v === null ? null : String(v))" @update:model-value="(v: string | number | null) => update('deliverySiteIri', v === null ? null : String(v))"
/> />
@@ -115,7 +121,7 @@
:name="`price-container-${uid}`" :name="`price-container-${uid}`"
value="BENNE" value="BENNE"
:label="t('transport.carriers.containerType.BENNE')" :label="t('transport.carriers.containerType.BENNE')"
:disabled="readonly" :disabled="readonly || disabled"
group-class="mt-0" group-class="mt-0"
@update:model-value="(v: string | number | boolean | null) => update('containerType', v === null ? null : String(v))" @update:model-value="(v: string | number | boolean | null) => update('containerType', v === null ? null : String(v))"
/> />
@@ -124,7 +130,7 @@
:name="`price-container-${uid}`" :name="`price-container-${uid}`"
value="FOND_MOUVANT" value="FOND_MOUVANT"
:label="t('transport.carriers.containerType.FOND_MOUVANT')" :label="t('transport.carriers.containerType.FOND_MOUVANT')"
:disabled="readonly" :disabled="readonly || disabled"
group-class="mt-0" group-class="mt-0"
@update:model-value="(v: string | number | boolean | null) => update('containerType', v === null ? null : String(v))" @update:model-value="(v: string | number | boolean | null) => update('containerType', v === null ? null : String(v))"
/> />
@@ -140,7 +146,7 @@
:name="`price-unit-${uid}`" :name="`price-unit-${uid}`"
value="FORFAIT" value="FORFAIT"
:label="t('transport.carriers.form.price.pricingForfait')" :label="t('transport.carriers.form.price.pricingForfait')"
:disabled="readonly" :disabled="readonly || disabled"
group-class="mt-0" group-class="mt-0"
@update:model-value="(v: string | number | boolean | null) => update('pricingUnit', v === null ? null : String(v))" @update:model-value="(v: string | number | boolean | null) => update('pricingUnit', v === null ? null : String(v))"
/> />
@@ -149,7 +155,7 @@
:name="`price-unit-${uid}`" :name="`price-unit-${uid}`"
value="TONNE" value="TONNE"
:label="t('transport.carriers.form.price.pricingTonne')" :label="t('transport.carriers.form.price.pricingTonne')"
:disabled="readonly" :disabled="readonly || disabled"
group-class="mt-0" group-class="mt-0"
@update:model-value="(v: string | number | boolean | null) => update('pricingUnit', v === null ? null : String(v))" @update:model-value="(v: string | number | boolean | null) => update('pricingUnit', v === null ? null : String(v))"
/> />
@@ -162,6 +168,7 @@
:label="t('transport.carriers.form.price.price')" :label="t('transport.carriers.form.price.price')"
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.price" :error="errors?.price"
@update:model-value="(v: string) => update('price', v)" @update:model-value="(v: string) => update('price', v)"
/> />
@@ -173,6 +180,7 @@
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="readonly" :readonly="readonly"
:disabled="disabled"
:error="errors?.priceState" :error="errors?.priceState"
@update:model-value="(v: string | number | null) => update('priceState', v === null ? null : String(v))" @update:model-value="(v: string | number | null) => update('priceState', v === null ? null : String(v))"
/> />
@@ -200,6 +208,8 @@ const props = defineProps<{
siteOptions: SelectOption[] siteOptions: SelectOption[]
removable?: boolean removable?: boolean
readonly?: boolean readonly?: boolean
/** Bloc desactive (champs grises, consultation — distinct de readonly). */
disabled?: boolean
/** Erreurs serveur 422 de cette ligne, indexées par champ (ERP-101). */ /** Erreurs serveur 422 de cette ligne, indexées par champ (ERP-101). */
errors?: Record<string, string> errors?: Record<string, string>
}>() }>()
@@ -40,7 +40,7 @@
:label="t('transport.carriers.form.main.certificationType')" :label="t('transport.carriers.form.main.certificationType')"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="certificationReadonly" :disabled="certificationReadonly"
:error="mainErrors.errors.certificationType" :error="mainErrors.errors.certificationType"
@update:model-value="(v: string | number | null) => setCertification(v === null ? null : String(v))" @update:model-value="(v: string | number | null) => setCertification(v === null ? null : String(v))"
/> />
@@ -50,7 +50,7 @@
:label="t('transport.carriers.form.main.discharge')" :label="t('transport.carriers.form.main.discharge')"
accept="application/pdf,image/*" accept="application/pdf,image/*"
:required="true" :required="true"
:readonly="dischargeUploading" :disabled="dischargeUploading"
:clearable="true" :clearable="true"
:error="mainErrors.errors.dischargeDocument" :error="mainErrors.errors.dischargeDocument"
@update:model-value="(v: string) => dischargeFileName = v" @update:model-value="(v: string) => dischargeFileName = v"
@@ -45,14 +45,14 @@
<template v-else-if="carrier"> <template v-else-if="carrier">
<!-- Bloc principal (lecture seule) même disposition que l'ajout --> <!-- Bloc principal (lecture seule) même disposition que l'ajout -->
<div class="mt-[48px] grid grid-cols-3 xl:grid-cols-4 gap-x-[44px] gap-y-4"> <div class="mt-[48px] grid grid-cols-3 xl:grid-cols-4 gap-x-[44px] gap-y-4">
<MalioInputText :model-value="main.name" :label="t('transport.carriers.form.main.name')" readonly /> <MalioInputText :model-value="main.name" :label="t('transport.carriers.form.main.name')" disabled />
<!-- Cas LIOT : seul le champ immatriculations. --> <!-- Cas LIOT : seul le champ immatriculations. -->
<MalioInputText <MalioInputText
v-if="isLiot" v-if="isLiot"
:model-value="main.liotPlates" :model-value="main.liotPlates"
:label="t('transport.carriers.form.main.liotPlates')" :label="t('transport.carriers.form.main.liotPlates')"
readonly disabled
/> />
<!-- Cas standard : certification + décharge (col 3 réservée) + affrètement (col 4). --> <!-- Cas standard : certification + décharge (col 3 réservée) + affrètement (col 4). -->
@@ -60,7 +60,7 @@
<MalioInputText <MalioInputText
:model-value="certificationLabel" :model-value="certificationLabel"
:label="t('transport.carriers.form.main.certificationType')" :label="t('transport.carriers.form.main.certificationType')"
readonly disabled
/> />
<!-- Colonne 3 réservée à la décharge (si AUTRE), sinon vide (xl). --> <!-- Colonne 3 réservée à la décharge (si AUTRE), sinon vide (xl). -->
@@ -68,7 +68,7 @@
v-if="main.certificationType === 'AUTRE'" v-if="main.certificationType === 'AUTRE'"
:model-value="dischargeLabel" :model-value="dischargeLabel"
:label="t('transport.carriers.form.main.discharge')" :label="t('transport.carriers.form.main.discharge')"
readonly disabled
/> />
<div v-else class="hidden xl:block"></div> <div v-else class="hidden xl:block"></div>
@@ -78,14 +78,14 @@
id="carrier-view-chartered" id="carrier-view-chartered"
:label="t('transport.carriers.form.main.isChartered')" :label="t('transport.carriers.form.main.isChartered')"
:model-value="main.isChartered" :model-value="main.isChartered"
readonly disabled
:reserve-message-space="false" :reserve-message-space="false"
/> />
</div> </div>
<!-- Champs d'affrètement (ligne 2) si affrété. --> <!-- Champs d'affrètement (ligne 2) si affrété. -->
<template v-if="main.isChartered"> <template v-if="main.isChartered">
<MalioInputText :model-value="indexationDisplay" :label="t('transport.carriers.form.main.indexationRate')" readonly /> <MalioInputText :model-value="indexationDisplay" :label="t('transport.carriers.form.main.indexationRate')" disabled />
<!-- Contenant : radios désactivés (lecture seule), aligné sur l'ajout / la modif. --> <!-- Contenant : radios désactivés (lecture seule), aligné sur l'ajout / la modif. -->
<div> <div>
<div class="flex h-12 items-center gap-4"> <div class="flex h-12 items-center gap-4">
@@ -94,7 +94,7 @@
name="carrier-view-container" name="carrier-view-container"
value="BENNE" value="BENNE"
:label="t('transport.carriers.containerType.BENNE')" :label="t('transport.carriers.containerType.BENNE')"
readonly disabled
group-class="mt-0" group-class="mt-0"
/> />
<MalioRadioButton <MalioRadioButton
@@ -102,12 +102,12 @@
name="carrier-view-container" name="carrier-view-container"
value="FOND_MOUVANT" value="FOND_MOUVANT"
:label="t('transport.carriers.containerType.FOND_MOUVANT')" :label="t('transport.carriers.containerType.FOND_MOUVANT')"
readonly disabled
group-class="mt-0" group-class="mt-0"
/> />
</div> </div>
</div> </div>
<MalioInputText :model-value="main.volumeM3" :label="t('transport.carriers.form.main.volumeM3')" readonly /> <MalioInputText :model-value="main.volumeM3" :label="t('transport.carriers.form.main.volumeM3')" disabled />
</template> </template>
</template> </template>
</div> </div>
@@ -121,7 +121,7 @@
<CarrierAddressBlock <CarrierAddressBlock
:model-value="address" :model-value="address"
:country-options="countryOptionsFor(address.country)" :country-options="countryOptionsFor(address.country)"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -132,7 +132,7 @@
v-for="(contact, index) in contacts" v-for="(contact, index) in contacts"
:key="index" :key="index"
:model-value="contact" :model-value="contact"
readonly disabled
/> />
</div> </div>
</template> </template>
@@ -23,7 +23,7 @@
@update:model-value="(v: string) => main.name = sanitizeFreeText(v)" @update:model-value="(v: string) => main.name = sanitizeFreeText(v)"
:label="t('transport.carriers.form.main.name')" :label="t('transport.carriers.form.main.name')"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.name" :error="mainErrors.errors.name"
/> />
@@ -34,7 +34,7 @@
:label="t('transport.carriers.form.main.liotPlates')" :label="t('transport.carriers.form.main.liotPlates')"
:hint="t('transport.carriers.form.main.liotPlatesHint')" :hint="t('transport.carriers.form.main.liotPlatesHint')"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.liotPlates" :error="mainErrors.errors.liotPlates"
/> />
@@ -46,7 +46,7 @@
:label="t('transport.carriers.form.main.certificationType')" :label="t('transport.carriers.form.main.certificationType')"
empty-option-label="" empty-option-label=""
:required="true" :required="true"
:readonly="certificationReadonly" :disabled="certificationReadonly"
:error="mainErrors.errors.certificationType" :error="mainErrors.errors.certificationType"
@update:model-value="(v: string | number | null) => main.certificationType = v === null ? null : String(v)" @update:model-value="(v: string | number | null) => main.certificationType = v === null ? null : String(v)"
/> />
@@ -62,7 +62,7 @@
:label="t('transport.carriers.form.main.discharge')" :label="t('transport.carriers.form.main.discharge')"
accept="application/pdf,image/*" accept="application/pdf,image/*"
:required="true" :required="true"
:readonly="mainLocked || dischargeUploading" :disabled="mainLocked || dischargeUploading"
:clearable="true" :clearable="true"
:error="mainErrors.errors.dischargeDocument" :error="mainErrors.errors.dischargeDocument"
@update:model-value="(v: string) => dischargeFileName = v" @update:model-value="(v: string) => dischargeFileName = v"
@@ -79,7 +79,7 @@
id="carrier-is-chartered" id="carrier-is-chartered"
:label="t('transport.carriers.form.main.isChartered')" :label="t('transport.carriers.form.main.isChartered')"
:model-value="main.isChartered" :model-value="main.isChartered"
:readonly="mainLocked" :disabled="mainLocked"
:reserve-message-space="false" :reserve-message-space="false"
@update:model-value="(val: boolean) => main.isChartered = val" @update:model-value="(val: boolean) => main.isChartered = val"
/> />
@@ -99,7 +99,7 @@
icon-name="mdi:percent" icon-name="mdi:percent"
icon-position="right" icon-position="right"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.indexationRate" :error="mainErrors.errors.indexationRate"
@update:model-value="onIndexationInput" @update:model-value="onIndexationInput"
/> />
@@ -113,7 +113,7 @@
name="carrier-main-container" name="carrier-main-container"
value="BENNE" value="BENNE"
:label="t('transport.carriers.containerType.BENNE')" :label="t('transport.carriers.containerType.BENNE')"
:readonly="mainLocked" :disabled="mainLocked"
group-class="mt-0" group-class="mt-0"
@update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)" @update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)"
/> />
@@ -122,7 +122,7 @@
name="carrier-main-container" name="carrier-main-container"
value="FOND_MOUVANT" value="FOND_MOUVANT"
:label="t('transport.carriers.containerType.FOND_MOUVANT')" :label="t('transport.carriers.containerType.FOND_MOUVANT')"
:readonly="mainLocked" :disabled="mainLocked"
group-class="mt-0" group-class="mt-0"
@update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)" @update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)"
/> />
@@ -135,7 +135,7 @@
:model-value="main.volumeM3" :model-value="main.volumeM3"
:label="t('transport.carriers.form.main.volumeM3')" :label="t('transport.carriers.form.main.volumeM3')"
:required="true" :required="true"
:readonly="mainLocked" :disabled="mainLocked"
:error="mainErrors.errors.volumeM3" :error="mainErrors.errors.volumeM3"
@update:model-value="(v: string) => main.volumeM3 = sanitizeDecimal(v)" @update:model-value="(v: string) => main.volumeM3 = sanitizeDecimal(v)"
/> />
@@ -175,7 +175,7 @@
<CarrierAddressBlock <CarrierAddressBlock
:model-value="address" :model-value="address"
:country-options="countryOptions" :country-options="countryOptions"
:readonly="isQualimat || isValidated('addresses')" :disabled="isQualimat || isValidated('addresses')"
:errors="addressErrors" :errors="addressErrors"
@update:model-value="(v) => address = v" @update:model-value="(v) => address = v"
@degraded="onAddressDegraded" @degraded="onAddressDegraded"
@@ -202,7 +202,7 @@
:key="index" :key="index"
:model-value="contact" :model-value="contact"
:removable="isRowRemovable(contacts, index)" :removable="isRowRemovable(contacts, index)"
:readonly="isValidated('contacts')" :disabled="isValidated('contacts')"
:errors="contactErrors[index]" :errors="contactErrors[index]"
@update:model-value="(v) => contacts[index] = v" @update:model-value="(v) => contacts[index] = v"
@remove="askRemoveContact(index)" @remove="askRemoveContact(index)"
@@ -238,7 +238,7 @@
:supplier-options="supplierOptions" :supplier-options="supplierOptions"
:site-options="siteOptions" :site-options="siteOptions"
:removable="!isValidated('prices')" :removable="!isValidated('prices')"
:readonly="isValidated('prices')" :disabled="isValidated('prices')"
:errors="priceErrors[index]" :errors="priceErrors[index]"
@update:model-value="(v) => prices[index] = v" @update:model-value="(v) => prices[index] = v"
@remove="askRemovePrice(index)" @remove="askRemovePrice(index)"