b8dc3cb696
Auto Tag Develop / tag (push) Successful in 7s
Lot de correctifs sur l'écran Client (M1), + un retrait de règle métier et une petite fonctionnalité. ## Formulaire client (création / édition) - Boutons « ajouter un bloc » (Adresse, RIB) désactivés tant que le dernier bloc n'est pas valide. - Onglet Information : bouton Valider désactivé si aucun champ rempli (création) ; onglet Contact accessible dès la création (Information facultatif). - Champs « Relation » (Distributeur/Courtier) et « Prestation de triage » masqués par défaut, révélés seulement si une catégorie ordinaire (≠ Distributeur/Courtier) est sélectionnée. - Bloc RIB affiché uniquement si le type de règlement est LCR (création, édition, consultation) ; plus de RIB fantôme soumis. - Alignement du bas du textarea « Description » sur les autres champs. ## Recherche d'adresse (BAN) - Une erreur de l'API ne bloque plus définitivement la recherche : chaque frappe réessaie (le mode dégradé restait verrouillé). - Garde minimum 3 caractères avant l'appel à l'API. ## Répertoire client - Titres de colonne en noir 16px, corps + tags de site en 14px. ## Navigation - L'onglet actif est conservé au passage consultation ↔ édition (via history.state, hors URL). ## Règle métier - Retrait de RG-1.04 : l'onglet Information n'est plus obligatoire pour le rôle Commerciale — facultatif pour tous (back + tests + docs). Tests : suites front (Vitest) et back (PHPUnit) vertes hormis flakes d'infra connus. Reviewed-on: #76 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
75 lines
2.5 KiB
Vue
75 lines
2.5 KiB
Vue
<!--
|
|
Valeurs en dur issues de la maquette Figma (design Starseed) :
|
|
- sidebar depliee : 232px (w-[232px], repli laisse par defaut 72px)
|
|
- marge horizontale du contenu sur desktop : 170px (xl:px-[170px])
|
|
La marge haute du contenu (44px) vit desormais DANS l'entete (PageHeader,
|
|
pt-11) et non sur le <main> : sinon, l'entete etant sticky, ce padding
|
|
laissait un trou blanc entre le SiteSelector et l'entete.
|
|
A faire evoluer uniquement avec une mise a jour de maquette.
|
|
-->
|
|
<template>
|
|
<div class="h-screen overflow-hidden">
|
|
<div class="flex h-full">
|
|
<MalioSidebar
|
|
v-model="ui.sidebarCollapsed"
|
|
:sections="translatedSections"
|
|
:sidebar-class="ui.sidebarCollapsed ? '' : 'w-[232px]'"
|
|
>
|
|
<template #logo>
|
|
<img src="/LOGO_MALIO.png" alt="Malio"/>
|
|
</template>
|
|
<template #logo-collapsed>
|
|
<img src="/LOGO_MALIO_COLLAPSED.png" alt="Malio"/>
|
|
</template>
|
|
</MalioSidebar>
|
|
|
|
<div class="h-full flex-1 flex flex-col min-h-0 min-w-0">
|
|
<SiteSelector v-if="showSiteSelector"/>
|
|
<main
|
|
class="flex flex-1 flex-col overflow-y-auto overflow-x-hidden bg-white px-4 pb-10 sm:px-6 lg:px-12 xl:px-11">
|
|
<slot/>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
const {t} = useI18n()
|
|
const ui = useUiStore()
|
|
const {sections} = useSidebar()
|
|
const {isModuleActive} = useModules()
|
|
const auth = useAuthStore()
|
|
const route = useRoute()
|
|
|
|
// Le SiteSelector est rendu si :
|
|
// - le module Sites est actif dans config/modules.php (sinon la feature
|
|
// n'a pas de sens, cf. ticket 3 spec criteres d'acceptation) ;
|
|
// - ET l'user connecte a au moins un site autorise (sinon "barre vide"
|
|
// sans tile cliquable).
|
|
// Les deux flags sont resolus par le middleware auth.global.ts avant
|
|
// que le layout ne soit rendu (plan load parallele), donc pas de flash.
|
|
const showSiteSelector = computed(() =>
|
|
isModuleActive('sites') && (auth.user?.sites?.length ?? 0) > 0,
|
|
)
|
|
|
|
const translatedSections = computed(() =>
|
|
sections.value.map(section => ({
|
|
label: t(section.label),
|
|
icon: section.icon,
|
|
items: section.items.map(item => ({
|
|
label: t(item.label),
|
|
to: item.to,
|
|
})),
|
|
}))
|
|
)
|
|
|
|
watch(() => route.path, () => {
|
|
ui.closeMobileSidebar()
|
|
})
|
|
|
|
useHead({
|
|
titleTemplate: (title) => title || 'Starseed',
|
|
})
|
|
</script>
|