From a6b48b1dd12295b46aa6d191f22370843a7403cc Mon Sep 17 00:00:00 2001 From: tristan Date: Wed, 24 Jun 2026 16:04:52 +0000 Subject: [PATCH] =?UTF-8?q?feat=20:=20ERP-196=20=E2=80=94=20refonte=20des?= =?UTF-8?q?=20blocs=20de=20formulaire=20(contact,=20adresse,=20compta)=20(?= =?UTF-8?q?#145)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## ERP-196 — Refonte des blocs de formulaire Refonte visuelle des blocs répétables des formulaires (clients, fournisseurs, prestataires, transporteurs), alignée sur les blocs « ticket de pesée » : à plat (sans box-shadow), titre de bloc en noir, séparation par filet noir 1px. ### ✅ Blocs Contact - Box-shadow / fond blanc / padding latéral retirés - En-tête `flex justify-between` : titre noir (« Contact 1 »…) à gauche, poubelle `button-class="p-0"` à droite - 4 colonnes, filet `border-b border-black` entre blocs (pas sous le dernier, prop `last`) - i18n `contact.title` ajouté pour transporteurs / prestataires - 9 pages câblées (new / edit / consultation des 4 répertoires) ### ✅ Blocs Adresse - Même traitement (à plat, titre noir, filet sauf dernier) - i18n `address.title` pour transporteurs / prestataires - Transporteur : adresse unique → titre « Adresse » (sans numéro) - 12 pages câblées ### ✅ Bloc Comptabilité - Bloc **infos** : titre « Informations » + filet bas (uniquement si des RIB suivent) - Blocs **RIB** : titre « RIB 1 / RIB 2… » + poubelle `p-0`, filet sauf le dernier - i18n `accounting.infoTitle` (3 modules) + `accounting.ribTitle` (fournisseurs / prestataires) - 9 pages câblées (clients / fournisseurs / prestataires) ### Vérifications - Vitest : 44/44 (specs contact + adresse) - Eslint : clean sur l'ensemble des composants et pages modifiés ### Commits - `feat : refonte des blocs contact (ERP-196)` - `feat : refonte des blocs adresse (ERP-196)` - `feat : refonte du bloc comptabilité (ERP-196)` Reviewed-on: https://gitea.malio.fr/MALIO-DEV/Starseed/pulls/145 Co-authored-by: tristan Co-committed-by: tristan --- frontend/i18n/locales/fr.json | 9 + .../components/ClientAddressBlock.vue | 384 +++++++++--------- .../components/ClientContactBlock.vue | 167 ++++---- .../components/SupplierAddressBlock.vue | 345 ++++++++-------- .../components/SupplierContactBlock.vue | 165 ++++---- .../commercial/pages/clients/[id]/edit.vue | 36 +- .../commercial/pages/clients/[id]/index.vue | 17 +- .../modules/commercial/pages/clients/new.vue | 38 +- .../commercial/pages/suppliers/[id]/edit.vue | 36 +- .../commercial/pages/suppliers/[id]/index.vue | 17 +- .../commercial/pages/suppliers/new.vue | 36 +- .../components/ProviderAddressBlock.vue | 251 ++++++------ .../components/ProviderContactBlock.vue | 169 ++++---- .../__tests__/ProviderAddressBlock.spec.ts | 1 + .../__tests__/ProviderContactBlock.spec.ts | 1 + .../technique/pages/providers/[id]/edit.vue | 38 +- .../technique/pages/providers/[id]/index.vue | 19 +- .../modules/technique/pages/providers/new.vue | 38 +- .../components/CarrierAddressBlock.vue | 206 +++++----- .../components/CarrierContactBlock.vue | 169 ++++---- .../__tests__/CarrierAddressBlock.spec.ts | 1 + .../transport/pages/carriers/[id]/edit.vue | 4 + .../transport/pages/carriers/[id]/index.vue | 4 + .../modules/transport/pages/carriers/new.vue | 4 + 24 files changed, 1181 insertions(+), 974 deletions(-) diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index 56e766d..5b0bc25 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -183,6 +183,7 @@ "degraded": "Service d'adresse indisponible : saisie de la ville et de l'adresse en mode libre." }, "accounting": { + "infoTitle": "Informations", "siren": "SIREN", "accountNumber": "Numéro de compte", "tvaMode": "Mode de TVA", @@ -190,6 +191,7 @@ "paymentDelay": "Délai de règlement", "paymentType": "Type de règlement", "bank": "Banque", + "ribTitle": "RIB {n}", "ribLabel": "Libellé", "ribBic": "BIC", "ribIban": "IBAN", @@ -350,6 +352,7 @@ "degraded": "Service d'adresse indisponible : saisie de la ville et de l'adresse en mode libre." }, "accounting": { + "infoTitle": "Informations", "siren": "SIREN", "accountNumber": "Numéro de compte", "tvaMode": "Mode de TVA", @@ -441,6 +444,7 @@ "categoryRequired": "Sélectionnez au moins une catégorie." }, "contact": { + "title": "Contact {n}", "lastName": "Nom", "firstName": "Prénom", "jobTitle": "Fonction", @@ -452,6 +456,7 @@ "add": "Nouveau contact" }, "address": { + "title": "Adresse {n}", "sites": "Sites", "contacts": "Contact(s) rattaché(s)", "country": "Pays", @@ -465,6 +470,7 @@ "degraded": "Service d'adresse indisponible : saisie de la ville et de l'adresse en mode libre." }, "accounting": { + "infoTitle": "Informations", "siren": "SIREN", "accountNumber": "Numéro de compte", "tvaMode": "Mode de TVA", @@ -472,6 +478,7 @@ "paymentDelay": "Délai de règlement", "paymentType": "Type de règlement", "bank": "Banque", + "ribTitle": "RIB {n}", "ribLabel": "Libellé", "ribBic": "BIC", "ribIban": "IBAN", @@ -628,6 +635,7 @@ "uploadFailed": "Le téléversement de la décharge a échoué." }, "address": { + "title": "Adresse", "country": "Pays", "postalCode": "Code postal", "city": "Ville", @@ -637,6 +645,7 @@ "degraded": "Service d'adresse indisponible : saisie de la ville et de l'adresse en mode libre." }, "contact": { + "title": "Contact {n}", "lastName": "Nom", "firstName": "Prénom", "jobTitle": "Fonction", diff --git a/frontend/modules/commercial/components/ClientAddressBlock.vue b/frontend/modules/commercial/components/ClientAddressBlock.vue index 8e5886a..2642266 100644 --- a/frontend/modules/commercial/components/ClientAddressBlock.vue +++ b/frontend/modules/commercial/components/ClientAddressBlock.vue @@ -1,203 +1,211 @@ @@ -230,6 +238,8 @@ const props = defineProps<{ /** Pays disponibles (France par defaut). */ countryOptions: RefOption[] removable?: boolean + /** Dernier bloc de la liste : supprime le filet de separation bas. */ + last?: boolean readonly?: boolean /** Bloc desactive (champs grises, consultation — distinct de readonly). */ disabled?: boolean diff --git a/frontend/modules/commercial/components/ClientContactBlock.vue b/frontend/modules/commercial/components/ClientContactBlock.vue index f2e466f..a2dfa65 100644 --- a/frontend/modules/commercial/components/ClientContactBlock.vue +++ b/frontend/modules/commercial/components/ClientContactBlock.vue @@ -1,84 +1,93 @@ @@ -98,6 +107,8 @@ const props = defineProps<{ title: string /** Affiche l'icone de suppression (1er bloc non supprimable, RG-1.14). */ removable?: boolean + /** Dernier bloc de la liste : supprime le filet de separation bas. */ + last?: boolean /** Bloc en lecture seule (onglet valide). */ readonly?: boolean /** Bloc desactive (champs grises, consultation — distinct de readonly). */ diff --git a/frontend/modules/commercial/components/SupplierAddressBlock.vue b/frontend/modules/commercial/components/SupplierAddressBlock.vue index 0e0ce64..a6a2371 100644 --- a/frontend/modules/commercial/components/SupplierAddressBlock.vue +++ b/frontend/modules/commercial/components/SupplierAddressBlock.vue @@ -1,189 +1,198 @@ @@ -210,6 +219,8 @@ const props = defineProps<{ /** Pays disponibles (France par defaut). */ countryOptions: RefOption[] removable?: boolean + /** Dernier bloc de la liste : supprime le filet de separation bas. */ + last?: boolean readonly?: boolean /** Bloc desactive (champs grises, consultation — distinct de readonly). */ disabled?: boolean diff --git a/frontend/modules/commercial/components/SupplierContactBlock.vue b/frontend/modules/commercial/components/SupplierContactBlock.vue index 497e3cb..ac0d3c6 100644 --- a/frontend/modules/commercial/components/SupplierContactBlock.vue +++ b/frontend/modules/commercial/components/SupplierContactBlock.vue @@ -1,83 +1,92 @@ @@ -96,6 +105,8 @@ const props = defineProps<{ title: string /** Affiche l'icone de suppression (1er bloc non supprimable, RG-2.13). */ removable?: boolean + /** Dernier bloc de la liste : supprime le filet de separation bas. */ + last?: boolean /** Bloc en lecture seule (onglet valide). */ readonly?: boolean /** Bloc desactive (champs grises, consultation — distinct de readonly). */ diff --git a/frontend/modules/commercial/pages/clients/[id]/edit.vue b/frontend/modules/commercial/pages/clients/[id]/edit.vue index 2ce78f3..a672600 100644 --- a/frontend/modules/commercial/pages/clients/[id]/edit.vue +++ b/frontend/modules/commercial/pages/clients/[id]/edit.vue @@ -178,6 +178,7 @@ :model-value="contact" :title="t('commercial.clients.form.contact.title', { n: index + 1 })" :removable="isRowRemovable(contacts, index)" + :last="index === contacts.length - 1" :disabled="businessReadonly" :errors="contactErrors[index]" @update:model-value="(v) => contacts[index] = v" @@ -210,6 +211,7 @@ :key="address.id ?? `new-${index}`" :model-value="address" :title="t('commercial.clients.form.address.title', { n: index + 1 })" + :last="index === addresses.length - 1" :category-options="addressCategoryOptions" :site-options="siteOptions" :contact-options="contactOptions" @@ -244,8 +246,10 @@ editable uniquement si accounting.manage). -->