From cdcc7d1e751030cc553c352c83d5452cc624a6ae Mon Sep 17 00:00:00 2001 From: tristan Date: Fri, 19 Jun 2026 09:48:49 +0200 Subject: [PATCH] =?UTF-8?q?feat=20:=20grise=20les=20champs=20en=20consulta?= =?UTF-8?q?tion=20et=20onglets=20valid=C3=A9s=20(readonly=20=E2=86=92=20di?= =?UTF-8?q?sabled)=20(ERP-193)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ClientAddressBlock.vue | 19 ++++++- .../components/ClientContactBlock.vue | 10 +++- .../components/SupplierAddressBlock.vue | 19 ++++++- .../components/SupplierContactBlock.vue | 10 +++- .../commercial/pages/clients/[id]/edit.vue | 50 +++++++++---------- .../commercial/pages/clients/[id]/index.vue | 48 +++++++++--------- .../modules/commercial/pages/clients/new.vue | 50 +++++++++---------- .../commercial/pages/suppliers/[id]/edit.vue | 44 ++++++++-------- .../commercial/pages/suppliers/[id]/index.vue | 44 ++++++++-------- .../commercial/pages/suppliers/new.vue | 44 ++++++++-------- .../components/ProviderAddressBlock.vue | 16 +++++- .../components/ProviderContactBlock.vue | 10 +++- .../technique/pages/providers/[id]/edit.vue | 30 +++++------ .../technique/pages/providers/[id]/index.vue | 30 +++++------ .../modules/technique/pages/providers/new.vue | 30 +++++------ .../components/CarrierAddressBlock.vue | 11 +++- .../components/CarrierContactBlock.vue | 10 +++- .../components/CarrierPriceBlock.vue | 24 ++++++--- .../transport/pages/carriers/[id]/edit.vue | 4 +- .../transport/pages/carriers/[id]/index.vue | 22 ++++---- .../modules/transport/pages/carriers/new.vue | 24 ++++----- 21 files changed, 321 insertions(+), 228 deletions(-) diff --git a/frontend/modules/commercial/components/ClientAddressBlock.vue b/frontend/modules/commercial/components/ClientAddressBlock.vue index db956fe..c1b6b0b 100644 --- a/frontend/modules/commercial/components/ClientAddressBlock.vue +++ b/frontend/modules/commercial/components/ClientAddressBlock.vue @@ -2,7 +2,7 @@
@@ -57,6 +60,7 @@ :label="t('commercial.clients.form.address.billingEmail')" :required="true" :readonly="readonly" + :disabled="disabled" :lowercase="true" :error="errors?.billingEmail" :addable="!model.hasSecondaryBillingEmail && !readonly" @@ -71,6 +75,7 @@ :model-value="model.billingEmailSecondary" :label="t('commercial.clients.form.address.billingEmailSecondary')" :readonly="readonly" + :disabled="disabled" :lowercase="true" :error="errors?.billingEmailSecondary" @update:model-value="(v: string) => update('billingEmailSecondary', v)" @@ -82,6 +87,7 @@ :label="t('commercial.clients.form.address.categories')" :display-tag="true" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.categories" @update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))" @@ -92,6 +98,7 @@ :options="countryOptions" :label="t('commercial.clients.form.address.country')" :readonly="readonly" + :disabled="disabled" :required="true" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" /> @@ -101,6 +108,7 @@ :label="t('commercial.clients.form.address.postalCode')" :mask="POSTAL_CODE_MASK" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.postalCode" @update:model-value="onPostalCodeChange" @@ -115,6 +123,7 @@ :options="cityOptions" :label="t('commercial.clients.form.address.city')" :readonly="readonly" + :disabled="disabled" empty-option-label="" :required="true" :error="errors?.city" @@ -125,6 +134,7 @@ :model-value="model.city" :label="t('commercial.clients.form.address.city')" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.city" @update:model-value="(v: string) => update('city', v)" @@ -142,13 +152,14 @@ blur/Entree (saisie manuelle) — sinon il serait efface. La ville reste pilotee par le code postal ; choisir une suggestion remplit rue+ville+CP. --> @@ -210,6 +223,8 @@ const props = defineProps<{ countryOptions: RefOption[] removable?: boolean readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/commercial/components/ClientContactBlock.vue b/frontend/modules/commercial/components/ClientContactBlock.vue index 0ecfd86..13c0915 100644 --- a/frontend/modules/commercial/components/ClientContactBlock.vue +++ b/frontend/modules/commercial/components/ClientContactBlock.vue @@ -4,7 +4,7 @@ non supprimable (1er bloc obligatoire RG-1.14) ou en lecture seule. ariaLabel via v-bind objet (prop camelCase ; aria-* serait un attribut HTML). --> @@ -23,6 +24,7 @@ :model-value="model.firstName" :label="t('commercial.clients.form.contact.firstName')" :readonly="readonly" + :disabled="disabled" :error="errors?.firstName" @update:model-value="(v: string) => update('firstName', v)" /> @@ -34,6 +36,7 @@ :model-value="model.jobTitle" :label="t('commercial.clients.form.contact.jobTitle')" :readonly="readonly" + :disabled="disabled" :error="errors?.jobTitle" @update:model-value="(v: string) => update('jobTitle', v)" /> @@ -42,6 +45,7 @@ :model-value="model.email" :label="t('commercial.clients.form.contact.email')" :readonly="readonly" + :disabled="disabled" :lowercase="true" :error="errors?.email" @update:model-value="(v: string) => update('email', v)" @@ -51,6 +55,7 @@ :label="t('commercial.clients.form.contact.phonePrimary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phonePrimary" :addable="!model.hasSecondaryPhone && !readonly" :add-button-label="t('commercial.clients.form.contact.addPhone')" @@ -63,6 +68,7 @@ :label="t('commercial.clients.form.contact.phoneSecondary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phoneSecondary" @update:model-value="(v: string) => update('phoneSecondary', v)" /> @@ -86,6 +92,8 @@ const props = defineProps<{ removable?: boolean /** Bloc en lecture seule (onglet valide). */ readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/commercial/components/SupplierAddressBlock.vue b/frontend/modules/commercial/components/SupplierAddressBlock.vue index 9aec0da..2bdf72a 100644 --- a/frontend/modules/commercial/components/SupplierAddressBlock.vue +++ b/frontend/modules/commercial/components/SupplierAddressBlock.vue @@ -2,7 +2,7 @@
@@ -57,6 +60,7 @@ :label="t('commercial.suppliers.form.address.categories')" :display-tag="true" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.categories" @update:model-value="(v: (string | number)[]) => update('categoryIris', v.map(String))" @@ -67,6 +71,7 @@ :options="countryOptions" :label="t('commercial.suppliers.form.address.country')" :readonly="readonly" + :disabled="disabled" :required="true" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" /> @@ -76,6 +81,7 @@ :label="t('commercial.suppliers.form.address.postalCode')" :mask="POSTAL_CODE_MASK" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.postalCode" @update:model-value="onPostalCodeChange" @@ -88,6 +94,7 @@ :options="cityOptions" :label="t('commercial.suppliers.form.address.city')" :readonly="readonly" + :disabled="disabled" empty-option-label="" :required="true" :error="errors?.city" @@ -98,6 +105,7 @@ :model-value="model.city" :label="t('commercial.suppliers.form.address.city')" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.city" @update:model-value="(v: string) => update('city', v)" @@ -107,13 +115,14 @@ texte saisi est conserve si la BAN ne propose rien (saisie manuelle). -->
@@ -149,6 +160,7 @@ :label="t('commercial.suppliers.form.address.bennes')" :min="0" :readonly="readonly" + :disabled="disabled" :error="errors?.bennes" @update:model-value="(v: string) => update('bennes', v)" /> @@ -160,6 +172,7 @@ :model-value="model.triageProvider" group-class="self-center" :readonly="readonly" + :disabled="disabled" @update:model-value="(v: boolean) => update('triageProvider', v)" />
@@ -188,6 +201,8 @@ const props = defineProps<{ countryOptions: RefOption[] removable?: boolean readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/commercial/components/SupplierContactBlock.vue b/frontend/modules/commercial/components/SupplierContactBlock.vue index f7930f8..22633e0 100644 --- a/frontend/modules/commercial/components/SupplierContactBlock.vue +++ b/frontend/modules/commercial/components/SupplierContactBlock.vue @@ -3,7 +3,7 @@ @@ -22,6 +23,7 @@ :model-value="model.firstName" :label="t('commercial.suppliers.form.contact.firstName')" :readonly="readonly" + :disabled="disabled" :error="errors?.firstName" @update:model-value="(v: string) => update('firstName', v)" /> @@ -33,6 +35,7 @@ :model-value="model.jobTitle" :label="t('commercial.suppliers.form.contact.jobTitle')" :readonly="readonly" + :disabled="disabled" :error="errors?.jobTitle" @update:model-value="(v: string) => update('jobTitle', v)" /> @@ -41,6 +44,7 @@ :model-value="model.email" :label="t('commercial.suppliers.form.contact.email')" :readonly="readonly" + :disabled="disabled" :lowercase="true" :error="errors?.email" @update:model-value="(v: string) => update('email', v)" @@ -50,6 +54,7 @@ :label="t('commercial.suppliers.form.contact.phonePrimary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phonePrimary" :addable="!model.hasSecondaryPhone && !readonly" :add-button-label="t('commercial.suppliers.form.contact.addPhone')" @@ -62,6 +67,7 @@ :label="t('commercial.suppliers.form.contact.phoneSecondary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phoneSecondary" @update:model-value="(v: string) => update('phoneSecondary', v)" /> @@ -84,6 +90,8 @@ const props = defineProps<{ removable?: boolean /** Bloc en lecture seule (onglet valide). */ readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/commercial/pages/clients/[id]/edit.vue b/frontend/modules/commercial/pages/clients/[id]/edit.vue index e82acaa..77475e3 100644 --- a/frontend/modules/commercial/pages/clients/[id]/edit.vue +++ b/frontend/modules/commercial/pages/clients/[id]/edit.vue @@ -28,7 +28,7 @@ @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" :label="t('commercial.clients.form.main.companyName')" :required="true" - :readonly="businessReadonly" + :disabled="businessReadonly" :error="mainErrors.errors.companyName" />
@@ -102,14 +102,14 @@ resize="none" group-class="row-span-2 pt-1 pb-1" text-input="h-full text-lg" - :readonly="businessReadonly" + :disabled="businessReadonly" :error="informationErrors.errors.description" /> @@ -73,13 +73,13 @@ v-if="relation.type" :model-value="relation.name" :label="relation.type === 'distributeur' ? t('commercial.clients.form.main.distributorName') : t('commercial.clients.form.main.brokerName')" - readonly + disabled />
@@ -99,37 +99,37 @@ resize="none" group-class="row-span-2 pt-1 pb-1" text-input="h-full text-lg" - readonly + disabled /> @@ -142,7 +142,7 @@ :key="contact.id ?? index" :model-value="contact" :title="t('commercial.clients.form.contact.title', { n: index + 1 })" - readonly + disabled /> @@ -159,7 +159,7 @@ :site-options="allSiteOptions" :contact-options="contactOptions" :country-options="countryOptions" - readonly + disabled /> @@ -173,38 +173,38 @@ :model-value="accounting.siren" :label="t('commercial.clients.form.accounting.siren')" :mask="SIREN_MASK" - readonly + disabled /> @@ -227,17 +227,17 @@ diff --git a/frontend/modules/commercial/pages/clients/new.vue b/frontend/modules/commercial/pages/clients/new.vue index 1872de7..a5ac0aa 100644 --- a/frontend/modules/commercial/pages/clients/new.vue +++ b/frontend/modules/commercial/pages/clients/new.vue @@ -22,7 +22,7 @@ @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" :label="t('commercial.clients.form.main.companyName')" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.companyName" /> @@ -97,14 +97,14 @@ resize="none" group-class="row-span-2 pt-1 pb-1" text-input="h-full text-lg" - :readonly="isValidated('information')" + :disabled="isValidated('information')" :error="informationErrors.errors.description" /> @@ -119,7 +119,7 @@ v-model="information.volumeForecast" :label="t('commercial.suppliers.form.information.volumeForecast')" :mask="VOLUME_FORECAST_MASK" - :readonly="businessReadonly" + :disabled="businessReadonly" :error="informationErrors.errors.volumeForecast" /> @@ -146,7 +146,7 @@ :model-value="contact" :title="t('commercial.suppliers.form.contact.title', { n: index + 1 })" :removable="isRowRemovable(contacts, index)" - :readonly="businessReadonly" + :disabled="businessReadonly" :errors="contactErrors[index]" @update:model-value="(v) => contacts[index] = v" @remove="askRemoveContact(index)" @@ -183,7 +183,7 @@ :contact-options="contactOptions" :country-options="countryOptions" :removable="isRowRemovable(addresses, index)" - :readonly="businessReadonly" + :disabled="businessReadonly" :errors="addressErrors[index]" @update:model-value="(v) => addresses[index] = v" @remove="askRemoveAddress(index)" @@ -218,14 +218,14 @@ v-model="accounting.siren" :label="t('commercial.suppliers.form.accounting.siren')" :mask="SIREN_MASK" - :readonly="accountingReadonly" + :disabled="accountingReadonly" :required="true" :error="accountingErrors.errors.siren" /> @@ -74,43 +74,43 @@ resize="none" group-class="row-span-2 pt-1 pb-1" text-input="h-full text-lg" - readonly + disabled /> @@ -123,7 +123,7 @@ :key="contact.id ?? index" :model-value="contact" :title="t('commercial.suppliers.form.contact.title', { n: index + 1 })" - readonly + disabled /> @@ -140,7 +140,7 @@ :site-options="allSiteOptions" :contact-options="contactOptions" :country-options="countryOptions" - readonly + disabled /> @@ -154,38 +154,38 @@ :model-value="accounting.siren" :label="t('commercial.suppliers.form.accounting.siren')" :mask="SIREN_MASK" - readonly + disabled /> @@ -208,17 +208,17 @@ diff --git a/frontend/modules/commercial/pages/suppliers/new.vue b/frontend/modules/commercial/pages/suppliers/new.vue index 58f0fd1..1ec109d 100644 --- a/frontend/modules/commercial/pages/suppliers/new.vue +++ b/frontend/modules/commercial/pages/suppliers/new.vue @@ -21,7 +21,7 @@ :model-value="main.companyName" :label="t('commercial.suppliers.form.main.companyName')" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.companyName" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" /> @@ -30,7 +30,7 @@ :options="referentials.categories.value" :label="t('commercial.suppliers.form.main.categories')" :display-tag="true" - :readonly="mainLocked" + :disabled="mainLocked" :required="true" :error="mainErrors.errors.categories" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @@ -57,13 +57,13 @@ resize="none" group-class="row-span-2 pt-1 pb-1" text-input="h-full text-lg" - :readonly="isValidated('information')" + :disabled="isValidated('information')" :error="informationErrors.errors.description" /> @@ -72,7 +72,7 @@ @@ -49,6 +52,7 @@ :options="countryOptions" :label="t('technique.providers.form.address.country')" :readonly="readonly" + :disabled="disabled" :required="true" @update:model-value="(v: string | number | null) => update('country', String(v ?? 'France'))" /> @@ -58,6 +62,7 @@ :label="t('technique.providers.form.address.postalCode')" :mask="POSTAL_CODE_MASK" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.postalCode" @update:model-value="onPostalCodeChange" @@ -70,6 +75,7 @@ :options="cityOptions" :label="t('technique.providers.form.address.city')" :readonly="readonly" + :disabled="disabled" empty-option-label="" :required="true" :error="errors?.city" @@ -80,6 +86,7 @@ :model-value="model.city" :label="t('technique.providers.form.address.city')" :readonly="readonly" + :disabled="disabled" :required="true" :error="errors?.city" @update:model-value="(v: string) => update('city', v)" @@ -89,13 +96,14 @@ texte saisi est conserve si la BAN ne propose rien (saisie manuelle). -->
@@ -149,6 +159,8 @@ const props = defineProps<{ countryOptions: RefOption[] removable?: boolean readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/technique/components/ProviderContactBlock.vue b/frontend/modules/technique/components/ProviderContactBlock.vue index d961b7e..6fc23fb 100644 --- a/frontend/modules/technique/components/ProviderContactBlock.vue +++ b/frontend/modules/technique/components/ProviderContactBlock.vue @@ -3,7 +3,7 @@ @@ -22,6 +23,7 @@ :model-value="model.firstName" :label="t('technique.providers.form.contact.firstName')" :readonly="readonly" + :disabled="disabled" :error="errors?.firstName" @update:model-value="(v: string) => update('firstName', v)" /> @@ -33,6 +35,7 @@ :model-value="model.jobTitle" :label="t('technique.providers.form.contact.jobTitle')" :readonly="readonly" + :disabled="disabled" :error="errors?.jobTitle" @update:model-value="(v: string) => update('jobTitle', v)" /> @@ -41,6 +44,7 @@ :model-value="model.email" :label="t('technique.providers.form.contact.email')" :readonly="readonly" + :disabled="disabled" :lowercase="true" :error="errors?.email" @update:model-value="(v: string) => update('email', v)" @@ -50,6 +54,7 @@ :label="t('technique.providers.form.contact.phonePrimary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phonePrimary" :addable="!model.hasSecondaryPhone && !readonly" :add-button-label="t('technique.providers.form.contact.addPhone')" @@ -63,6 +68,7 @@ :label="t('technique.providers.form.contact.phoneSecondary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phoneSecondary" @update:model-value="(v: string) => update('phoneSecondary', v)" /> @@ -83,6 +89,8 @@ const props = defineProps<{ removable?: boolean /** Bloc en lecture seule (onglet valide). */ readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/technique/pages/providers/[id]/edit.vue b/frontend/modules/technique/pages/providers/[id]/edit.vue index a14c6bf..2602371 100644 --- a/frontend/modules/technique/pages/providers/[id]/edit.vue +++ b/frontend/modules/technique/pages/providers/[id]/edit.vue @@ -23,7 +23,7 @@ :model-value="main.companyName" :label="t('technique.providers.form.main.companyName')" :required="true" - :readonly="businessReadonly" + :disabled="businessReadonly" :error="mainErrors.errors.companyName" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" /> @@ -32,7 +32,7 @@ :options="referentials.categories.value" :label="t('technique.providers.form.main.categories')" :display-tag="true" - :readonly="businessReadonly" + :disabled="businessReadonly" :required="true" :error="mainErrors.errors.categories" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @@ -42,7 +42,7 @@ :options="referentials.sites.value" :label="t('technique.providers.form.main.sites')" :display-tag="true" - :readonly="businessReadonly" + :disabled="businessReadonly" :required="true" :error="mainErrors.errors.sites" @update:model-value="(v: (string | number)[]) => main.siteIris = v.map(String)" @@ -72,7 +72,7 @@ :key="index" :model-value="contact" :removable="isRowRemovable(contacts, index)" - :readonly="businessReadonly" + :disabled="businessReadonly" :errors="contactErrors[index]" @update:model-value="(v) => contacts[index] = v" @remove="askRemoveContact(index)" @@ -108,7 +108,7 @@ :contact-options="contactOptions" :country-options="countryOptions" :removable="isRowRemovable(addresses, index)" - :readonly="businessReadonly" + :disabled="businessReadonly" :errors="addressErrors[index]" @update:model-value="(v) => addresses[index] = v" @remove="askRemoveAddress(index)" @@ -142,14 +142,14 @@ v-model="accounting.siren" :label="t('technique.providers.form.accounting.siren')" :mask="SIREN_MASK" - :readonly="accountingReadonly" + :disabled="accountingReadonly" :required="true" :error="accountingErrors.errors.siren" />
@@ -77,7 +77,7 @@ v-for="(contact, index) in contacts" :key="index" :model-value="contact" - readonly + disabled /> @@ -93,7 +93,7 @@ :site-options="view.siteOptions" :contact-options="contactOptions" :country-options="countryOptionsFor(view.draft.country)" - readonly + disabled /> @@ -105,13 +105,13 @@
- - - - - - - + + + + + + +
@@ -122,9 +122,9 @@ class="bg-white py-4 pl-[28px] pr-[60px] shadow-[0_4px_4px_0_rgba(0,0,0,0.25)]" >
- - - + + +
diff --git a/frontend/modules/technique/pages/providers/new.vue b/frontend/modules/technique/pages/providers/new.vue index 13fbef1..69ad7ee 100644 --- a/frontend/modules/technique/pages/providers/new.vue +++ b/frontend/modules/technique/pages/providers/new.vue @@ -22,7 +22,7 @@ :model-value="main.companyName" :label="t('technique.providers.form.main.companyName')" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.companyName" @update:model-value="(v: string) => main.companyName = sanitizeFreeText(v)" /> @@ -31,7 +31,7 @@ :options="referentials.categories.value" :label="t('technique.providers.form.main.categories')" :display-tag="true" - :readonly="mainLocked" + :disabled="mainLocked" :required="true" :error="mainErrors.errors.categories" @update:model-value="(v: (string | number)[]) => main.categoryIris = v.map(String)" @@ -41,7 +41,7 @@ :options="referentials.sites.value" :label="t('technique.providers.form.main.sites')" :display-tag="true" - :readonly="mainLocked" + :disabled="mainLocked" :required="true" :error="mainErrors.errors.sites" @update:model-value="(v: (string | number)[]) => main.siteIris = v.map(String)" @@ -73,7 +73,7 @@ :key="index" :model-value="contact" :removable="isRowRemovable(contacts, index)" - :readonly="isValidated('contact')" + :disabled="isValidated('contact')" :errors="contactErrors[index]" @update:model-value="(v) => contacts[index] = v" @remove="askRemoveContact(index)" @@ -108,7 +108,7 @@ :contact-options="contactOptions" :country-options="countryOptions" :removable="isRowRemovable(addresses, index)" - :readonly="isValidated('address')" + :disabled="isValidated('address')" :errors="addressErrors[index]" @update:model-value="(v) => addresses[index] = v" @remove="askRemoveAddress(index)" @@ -141,14 +141,14 @@ v-model="accounting.siren" :label="t('technique.providers.form.accounting.siren')" :mask="SIREN_MASK" - :readonly="accountingReadonly" + :disabled="accountingReadonly" :required="true" :error="accountingErrors.errors.siren" />
@@ -107,6 +114,8 @@ const props = defineProps<{ /** Pays disponibles (France par defaut). */ countryOptions: RefOption[] readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexees par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/transport/components/CarrierContactBlock.vue b/frontend/modules/transport/components/CarrierContactBlock.vue index 73c3fd9..cf6f189 100644 --- a/frontend/modules/transport/components/CarrierContactBlock.vue +++ b/frontend/modules/transport/components/CarrierContactBlock.vue @@ -3,7 +3,7 @@ @@ -22,6 +23,7 @@ :model-value="model.firstName" :label="t('transport.carriers.form.contact.firstName')" :readonly="readonly" + :disabled="disabled" :error="errors?.firstName" @update:model-value="(v: string) => update('firstName', v)" /> @@ -32,6 +34,7 @@ :model-value="model.jobTitle" :label="t('transport.carriers.form.contact.jobTitle')" :readonly="readonly" + :disabled="disabled" :error="errors?.jobTitle" @update:model-value="(v: string) => update('jobTitle', v)" /> @@ -40,6 +43,7 @@ :model-value="model.email" :label="t('transport.carriers.form.contact.email')" :readonly="readonly" + :disabled="disabled" :lowercase="true" :error="errors?.email" @update:model-value="(v: string) => update('email', v)" @@ -50,6 +54,7 @@ :label="t('transport.carriers.form.contact.phonePrimary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phonePrimary" :addable="!model.hasSecondaryPhone && !readonly" :add-button-label="t('transport.carriers.form.contact.addPhone')" @@ -63,6 +68,7 @@ :label="t('transport.carriers.form.contact.phoneSecondary')" :mask="PHONE_MASK" :readonly="readonly" + :disabled="disabled" :error="errors?.phoneSecondary" @update:model-value="(v: string) => update('phoneSecondary', v)" /> @@ -83,6 +89,8 @@ const props = defineProps<{ removable?: boolean /** Bloc en lecture seule (onglet validé). */ readonly?: boolean + /** Bloc desactive (champs grises, consultation — distinct de readonly). */ + disabled?: boolean /** Erreurs serveur 422 de cette ligne, indexées par champ (ERP-101). */ errors?: Record }>() diff --git a/frontend/modules/transport/components/CarrierPriceBlock.vue b/frontend/modules/transport/components/CarrierPriceBlock.vue index 4c5f68e..2dd8878 100644 --- a/frontend/modules/transport/components/CarrierPriceBlock.vue +++ b/frontend/modules/transport/components/CarrierPriceBlock.vue @@ -2,7 +2,7 @@
@@ -29,7 +29,7 @@ :name="`price-direction-${uid}`" value="FOURNISSEUR" :label="t('transport.carriers.form.price.directionSupplier')" - :disabled="readonly" + :disabled="readonly || disabled" group-class="mt-0" @update:model-value="onDirectionChange" /> @@ -46,6 +46,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.client" @update:model-value="onClientChange" /> @@ -56,6 +57,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.clientDeliveryAddress" @update:model-value="(v: string | number | null) => update('clientDeliveryAddressIri', v === null ? null : String(v))" /> @@ -66,6 +68,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.departureSite" @update:model-value="(v: string | number | null) => update('departureSiteIri', v === null ? null : String(v))" /> @@ -80,6 +83,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.supplier" @update:model-value="onSupplierChange" /> @@ -90,6 +94,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.supplierSupplyAddress" @update:model-value="(v: string | number | null) => update('supplierSupplyAddressIri', v === null ? null : String(v))" /> @@ -100,6 +105,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.deliverySite" @update:model-value="(v: string | number | null) => update('deliverySiteIri', v === null ? null : String(v))" /> @@ -115,7 +121,7 @@ :name="`price-container-${uid}`" value="BENNE" :label="t('transport.carriers.containerType.BENNE')" - :disabled="readonly" + :disabled="readonly || disabled" group-class="mt-0" @update:model-value="(v: string | number | boolean | null) => update('containerType', v === null ? null : String(v))" /> @@ -124,7 +130,7 @@ :name="`price-container-${uid}`" value="FOND_MOUVANT" :label="t('transport.carriers.containerType.FOND_MOUVANT')" - :disabled="readonly" + :disabled="readonly || disabled" group-class="mt-0" @update:model-value="(v: string | number | boolean | null) => update('containerType', v === null ? null : String(v))" /> @@ -140,7 +146,7 @@ :name="`price-unit-${uid}`" value="FORFAIT" :label="t('transport.carriers.form.price.pricingForfait')" - :disabled="readonly" + :disabled="readonly || disabled" group-class="mt-0" @update:model-value="(v: string | number | boolean | null) => update('pricingUnit', v === null ? null : String(v))" /> @@ -149,7 +155,7 @@ :name="`price-unit-${uid}`" value="TONNE" :label="t('transport.carriers.form.price.pricingTonne')" - :disabled="readonly" + :disabled="readonly || disabled" group-class="mt-0" @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')" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.price" @update:model-value="(v: string) => update('price', v)" /> @@ -173,6 +180,7 @@ empty-option-label="" :required="true" :readonly="readonly" + :disabled="disabled" :error="errors?.priceState" @update:model-value="(v: string | number | null) => update('priceState', v === null ? null : String(v))" /> @@ -200,6 +208,8 @@ const props = defineProps<{ siteOptions: SelectOption[] removable?: 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). */ errors?: Record }>() diff --git a/frontend/modules/transport/pages/carriers/[id]/edit.vue b/frontend/modules/transport/pages/carriers/[id]/edit.vue index 81bb13a..00f61e3 100644 --- a/frontend/modules/transport/pages/carriers/[id]/edit.vue +++ b/frontend/modules/transport/pages/carriers/[id]/edit.vue @@ -40,7 +40,7 @@ :label="t('transport.carriers.form.main.certificationType')" empty-option-label="" :required="true" - :readonly="certificationReadonly" + :disabled="certificationReadonly" :error="mainErrors.errors.certificationType" @update:model-value="(v: string | number | null) => setCertification(v === null ? null : String(v))" /> @@ -50,7 +50,7 @@ :label="t('transport.carriers.form.main.discharge')" accept="application/pdf,image/*" :required="true" - :readonly="dischargeUploading" + :disabled="dischargeUploading" :clearable="true" :error="mainErrors.errors.dischargeDocument" @update:model-value="(v: string) => dischargeFileName = v" diff --git a/frontend/modules/transport/pages/carriers/[id]/index.vue b/frontend/modules/transport/pages/carriers/[id]/index.vue index 8de9f2e..55e9c52 100644 --- a/frontend/modules/transport/pages/carriers/[id]/index.vue +++ b/frontend/modules/transport/pages/carriers/[id]/index.vue @@ -45,14 +45,14 @@
@@ -121,7 +121,7 @@
@@ -132,7 +132,7 @@ v-for="(contact, index) in contacts" :key="index" :model-value="contact" - readonly + disabled /> diff --git a/frontend/modules/transport/pages/carriers/new.vue b/frontend/modules/transport/pages/carriers/new.vue index 73a7815..f477ea8 100644 --- a/frontend/modules/transport/pages/carriers/new.vue +++ b/frontend/modules/transport/pages/carriers/new.vue @@ -23,7 +23,7 @@ @update:model-value="(v: string) => main.name = sanitizeFreeText(v)" :label="t('transport.carriers.form.main.name')" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.name" /> @@ -34,7 +34,7 @@ :label="t('transport.carriers.form.main.liotPlates')" :hint="t('transport.carriers.form.main.liotPlatesHint')" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.liotPlates" /> @@ -46,7 +46,7 @@ :label="t('transport.carriers.form.main.certificationType')" empty-option-label="" :required="true" - :readonly="certificationReadonly" + :disabled="certificationReadonly" :error="mainErrors.errors.certificationType" @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')" accept="application/pdf,image/*" :required="true" - :readonly="mainLocked || dischargeUploading" + :disabled="mainLocked || dischargeUploading" :clearable="true" :error="mainErrors.errors.dischargeDocument" @update:model-value="(v: string) => dischargeFileName = v" @@ -79,7 +79,7 @@ id="carrier-is-chartered" :label="t('transport.carriers.form.main.isChartered')" :model-value="main.isChartered" - :readonly="mainLocked" + :disabled="mainLocked" :reserve-message-space="false" @update:model-value="(val: boolean) => main.isChartered = val" /> @@ -99,7 +99,7 @@ icon-name="mdi:percent" icon-position="right" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.indexationRate" @update:model-value="onIndexationInput" /> @@ -113,7 +113,7 @@ name="carrier-main-container" value="BENNE" :label="t('transport.carriers.containerType.BENNE')" - :readonly="mainLocked" + :disabled="mainLocked" group-class="mt-0" @update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)" /> @@ -122,7 +122,7 @@ name="carrier-main-container" value="FOND_MOUVANT" :label="t('transport.carriers.containerType.FOND_MOUVANT')" - :readonly="mainLocked" + :disabled="mainLocked" group-class="mt-0" @update:model-value="(v: string | number | boolean | null) => main.containerType = v === null ? null : String(v)" /> @@ -135,7 +135,7 @@ :model-value="main.volumeM3" :label="t('transport.carriers.form.main.volumeM3')" :required="true" - :readonly="mainLocked" + :disabled="mainLocked" :error="mainErrors.errors.volumeM3" @update:model-value="(v: string) => main.volumeM3 = sanitizeDecimal(v)" /> @@ -175,7 +175,7 @@