Compare commits

..

2 Commits

Author SHA1 Message Date
gitea-actions a25ddac466 chore: bump version to v0.1.57
Auto Tag Develop / tag (push) Successful in 6s
Build & Push Docker Image / build (push) Successful in 1m6s
2026-06-01 09:55:58 +00:00
tristan df8e44fcfa [ERP-70] feat(front) : adapter l'UI a @malio/layer-ui 1.7.3 (#33)
Auto Tag Develop / tag (push) Successful in 8s
## Summary

Mise a jour de la lib `@malio/layer-ui` de `^1.7.2` vers `^1.7.3` et adaptation des ecrans pour deux changements visuels apportes par la lib :

- Le slot message (`error || success || hint`) sous les composants Malio est desormais **toujours rendu** dans le DOM (~16px en bas), pour eviter le saut de mise en page quand un champ passe en erreur.
- Nouvelle classe utilitaire `w-m-btn-action` pour standardiser la largeur des boutons d'action (remplacement du fix `w-[150px]`).

## Details

- **Bump dependance** : `frontend/package.json` + `frontend/package-lock.json` (`@malio/layer-ui` `^1.7.2` -> `^1.7.3`)
- **Boutons d'action** : 12 occurrences `button-class=\"w-[150px]\"` migrees vers `button-class=\"w-m-btn-action\"` dans `CategoryDrawer`, `RoleDrawer`, `SiteDrawer`, `UserRbacDrawer`, `audit-log`
- **Espacements formulaires** : rabotage des `gap-*` / `space-y-*` sur les conteneurs colonne (forms drawers, listes de checkbox, grille dates du drawer filtres audit-log, accordeon permissions, login) pour absorber le slot message desormais toujours present (16px)
- **Alignements verticaux** : compensation `pb-4` sur les voisins non-Malio dans les conteneurs `items-center` — puce couleur du `SiteDrawer` (`<div class=\"shrink-0 pb-4\">` autour du span) et labels `Du` / `Au` du drawer filtres `audit-log` (`<span class=\"pb-4\">`)
- **Layout** : reduction du padding lateral xl: dans `default.vue` (`xl:px-[170px]` -> `xl:px-[44px]`)

## Test plan

- [x] `make nuxt-test` (103/103 OK localement)
- [x] `make test` (322/322 OK localement)
- [x] Validation visuelle drawer Categories (Create / Edit / Delete)
- [x] Validation visuelle drawer Roles + accordeon permissions
- [x] Validation visuelle drawer Sites (puce couleur centree avec le champ)
- [x] Validation visuelle drawer Users RBAC
- [x] Validation visuelle page Audit Log (table + drawer filtres : dates Du/Au alignees, checkboxes correctement espacees)
- [x] Validation visuelle page Login (espacements entre champs / bouton / version)

## Suite

Un fix upstream `@malio/layer-ui` sera necessaire pour corriger l'alignement du label `Lignes :` dans la pagination de `MalioDataTable` (slot vide du `MalioSelect` interne) — prompt prepare a coller dans une session sur le repo de la lib.

Reviewed-on: #33
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-06-01 09:55:12 +00:00
11 changed files with 51 additions and 40 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
parameters: parameters:
app.version: '0.1.56' app.version: '0.1.57'
+2 -2
View File
@@ -24,10 +24,10 @@
<div class="h-full flex-1 flex flex-col min-h-0 min-w-0"> <div class="h-full flex-1 flex flex-col min-h-0 min-w-0">
<SiteSelector v-if="showSiteSelector"/> <SiteSelector v-if="showSiteSelector"/>
<main <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-[170px]"> 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">
<div <div
aria-hidden="true" aria-hidden="true"
class="pointer-events-none sticky top-0 z-30 h-[47px] flex-shrink-0 bg-white"/> class="pointer-events-none sticky top-0 z-30 h-11 flex-shrink-0 bg-white"/>
<slot/> <slot/>
</main> </main>
</div> </div>
@@ -12,7 +12,7 @@
</h2> </h2>
</template> </template>
<form class="flex flex-col gap-4 py-4" @submit.prevent="handleSave"> <form class="flex flex-col py-4 gap-2" @submit.prevent="handleSave">
<!-- Nom (RG-1.02 obligatoire / RG-1.04 longueur 2-120 apres trim). <!-- Nom (RG-1.02 obligatoire / RG-1.04 longueur 2-120 apres trim).
Erreur miroir client + erreurs server-side (422) mappees sur ce champ. --> Erreur miroir client + erreurs server-side (422) mappees sur ce champ. -->
<MalioInputText <MalioInputText
@@ -52,21 +52,21 @@
variant="danger" variant="danger"
icon-name="mdi:delete-outline" icon-name="mdi:delete-outline"
icon-position="left" icon-position="left"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="emit('delete')" @click="emit('delete')"
/> />
<MalioButton <MalioButton
v-else v-else
:label="t('common.cancel')" :label="t('common.cancel')"
variant="tertiary" variant="tertiary"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="emit('update:modelValue', false)" @click="emit('update:modelValue', false)"
/> />
<MalioButton <MalioButton
v-if="canShowSave" v-if="canShowSave"
:label="t('common.save')" :label="t('common.save')"
variant="primary" variant="primary"
button-class="w-[150px]" button-class="w-m-btn-action"
:disabled="form.submitting.value || loadingTypes" :disabled="form.submitting.value || loadingTypes"
@click="handleSave" @click="handleSave"
/> />
@@ -11,7 +11,7 @@
:title="`${group.module} (${selectedCountFor(group)}/${group.permissions.length})`" :title="`${group.module} (${selectedCountFor(group)}/${group.permissions.length})`"
header-class="capitalize" header-class="capitalize"
> >
<div class="flex flex-col gap-3"> <div class="flex flex-col">
<!-- Tout selectionner pour ce module --> <!-- Tout selectionner pour ce module -->
<MalioCheckbox <MalioCheckbox
:id="`${idPrefix}-group-${group.module}`" :id="`${idPrefix}-group-${group.module}`"
@@ -20,7 +20,7 @@
label-class="font-semibold text-sm text-neutral-700" label-class="font-semibold text-sm text-neutral-700"
@update:model-value="(val: boolean) => emit('toggle-all', group.module, val)" @update:model-value="(val: boolean) => emit('toggle-all', group.module, val)"
/> />
<div class="flex flex-col gap-2"> <div class="flex flex-col">
<MalioCheckbox <MalioCheckbox
v-for="perm in group.permissions" v-for="perm in group.permissions"
:id="`${idPrefix}-perm-${perm.id}`" :id="`${idPrefix}-perm-${perm.id}`"
@@ -11,7 +11,7 @@
{{ isEditMode ? t('admin.roles.editRole') : t('admin.roles.createRole') }} {{ isEditMode ? t('admin.roles.editRole') : t('admin.roles.createRole') }}
</h2> </h2>
</template> </template>
<form class="flex flex-col gap-4 py-4" @submit.prevent="handleSave"> <form class="flex flex-col py-4 gap-2" @submit.prevent="handleSave">
<!-- Champs du role --> <!-- Champs du role -->
<MalioInputText <MalioInputText
v-model="form.label" v-model="form.label"
@@ -71,7 +71,7 @@
variant="danger" variant="danger"
icon-name="mdi:delete-outline" icon-name="mdi:delete-outline"
icon-position="left" icon-position="left"
button-class="w-[150px]" button-class="w-m-btn-action"
:disabled="role?.isSystem" :disabled="role?.isSystem"
@click="emit('delete')" @click="emit('delete')"
/> />
@@ -79,13 +79,13 @@
v-else v-else
:label="t('common.cancel')" :label="t('common.cancel')"
variant="tertiary" variant="tertiary"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="emit('update:modelValue', false)" @click="emit('update:modelValue', false)"
/> />
<MalioButton <MalioButton
:label="t('common.save')" :label="t('common.save')"
variant="primary" variant="primary"
button-class="w-[150px]" button-class="w-m-btn-action"
:disabled="saving || permissionsLoadFailed" :disabled="saving || permissionsLoadFailed"
@click="handleSave" @click="handleSave"
/> />
@@ -11,7 +11,7 @@
{{ t('admin.users.drawer.title', { username: user?.username ?? '' }) }} {{ t('admin.users.drawer.title', { username: user?.username ?? '' }) }}
</h2> </h2>
</template> </template>
<div class="flex flex-col gap-4 py-4"> <div class="flex flex-col space-y-4 py-4">
<!-- Etat d'erreur de chargement des referentiels : bloque la <!-- Etat d'erreur de chargement des referentiels : bloque la
sauvegarde pour empecher un ecrasement silencieux des droits. --> sauvegarde pour empecher un ecrasement silencieux des droits. -->
<div <div
@@ -41,11 +41,13 @@
/> />
<!-- Section Roles --> <!-- Section Roles -->
<div> <!-- !mt-0 : la MalioCheckbox au-dessus expose son slot message (16px),
qui couvre deja l'ecart attendu pas besoin du space-y-4 ici. -->
<div class="!mt-0">
<h4 class="mb-3 text-sm font-semibold text-neutral-700"> <h4 class="mb-3 text-sm font-semibold text-neutral-700">
{{ t('admin.users.drawer.rolesSection') }} {{ t('admin.users.drawer.rolesSection') }}
</h4> </h4>
<div class="flex flex-col gap-2"> <div class="flex flex-col">
<MalioCheckbox <MalioCheckbox
v-for="role in allRoles" v-for="role in allRoles"
:key="role.id" :key="role.id"
@@ -84,7 +86,7 @@
<div v-if="allSites.length === 0" class="text-sm text-neutral-400"> <div v-if="allSites.length === 0" class="text-sm text-neutral-400">
{{ t('admin.sites.noSites') }} {{ t('admin.sites.noSites') }}
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col">
<MalioCheckbox <MalioCheckbox
v-for="site in allSites" v-for="site in allSites"
:id="`site-${site.id}`" :id="`site-${site.id}`"
@@ -113,13 +115,13 @@
<MalioButton <MalioButton
:label="t('common.cancel')" :label="t('common.cancel')"
variant="tertiary" variant="tertiary"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="emit('update:modelValue', false)" @click="emit('update:modelValue', false)"
/> />
<MalioButton <MalioButton
:label="t('common.save')" :label="t('common.save')"
variant="primary" variant="primary"
button-class="w-[150px]" button-class="w-m-btn-action"
:disabled="saving || loadFailed" :disabled="saving || loadFailed"
@click="handleSave" @click="handleSave"
/> />
@@ -66,15 +66,18 @@
<MalioAccordion> <MalioAccordion>
<!-- Dates : deux champs date+heure Du / Au (champs datetime a l'origine) --> <!-- Dates : deux champs date+heure Du / Au (champs datetime a l'origine) -->
<MalioAccordionItem :title="t('audit.filters.date_range')" value="dates"> <MalioAccordionItem :title="t('audit.filters.date_range')" value="dates">
<div class="grid grid-cols-[auto_1fr] items-center gap-x-3 gap-y-4"> <!-- pb-4 sur les labels Du/Au : simule le slot message
<span>{{ t('audit.filters.date_from') }}</span> du MalioDateTime voisin pour qu'items-center recentre
le label sur le centre visible du champ. -->
<div class="grid grid-cols-[auto_1fr] items-center gap-x-3">
<span class="pb-4">{{ t('audit.filters.date_from') }}</span>
<!-- Borne le picker "Du" par la valeur "Au" pour interdire une plage <!-- Borne le picker "Du" par la valeur "Au" pour interdire une plage
inversee a la saisie (le backend renverrait silencieusement 0 ligne). --> inversee a la saisie (le backend renverrait silencieusement 0 ligne). -->
<MalioDateTime <MalioDateTime
v-model="draftDateFrom" v-model="draftDateFrom"
:max="draftDateTo ?? undefined" :max="draftDateTo ?? undefined"
/> />
<span>{{ t('audit.filters.date_to') }}</span> <span class="pb-4">{{ t('audit.filters.date_to') }}</span>
<MalioDateTime <MalioDateTime
v-model="draftDateTo" v-model="draftDateTo"
:min="draftDateFrom ?? undefined" :min="draftDateFrom ?? undefined"
@@ -84,7 +87,7 @@
<!-- Type d'entite : cases a cocher (multi-selection) --> <!-- Type d'entite : cases a cocher (multi-selection) -->
<MalioAccordionItem :title="t('audit.filters.entity_type')" value="entity"> <MalioAccordionItem :title="t('audit.filters.entity_type')" value="entity">
<div class="flex flex-col gap-4"> <div class="flex flex-col">
<MalioCheckbox <MalioCheckbox
v-for="opt in entityTypeOptions" v-for="opt in entityTypeOptions"
:id="`filter-entity-${opt.value}`" :id="`filter-entity-${opt.value}`"
@@ -105,6 +108,7 @@
name="audit-action" name="audit-action"
:value="opt.value" :value="opt.value"
:label="opt.label" :label="opt.label"
group-class="mt-0"
/> />
</MalioAccordionItem> </MalioAccordionItem>
@@ -121,7 +125,7 @@
<MalioButton <MalioButton
variant="tertiary" variant="tertiary"
:label="t('audit.filters.reset')" :label="t('audit.filters.reset')"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="resetFilters" @click="resetFilters"
/> />
<MalioButton <MalioButton
+2 -2
View File
@@ -6,7 +6,7 @@
<img src="/LOGO_MALIO.png" alt="Logo" class="w-[150px]"/> <img src="/LOGO_MALIO.png" alt="Logo" class="w-[150px]"/>
</span> </span>
<form <form
class="mt-8 space-y-6 rounded-lg border border-neutral-200 bg-white p-6 shadow-sm" class="mt-8 rounded-lg border border-neutral-200 bg-white p-6 shadow-sm"
@submit.prevent="handleSubmit" @submit.prevent="handleSubmit"
> >
<MalioInputText <MalioInputText
@@ -30,7 +30,7 @@
type="submit" type="submit"
:disabled="isSubmitting" :disabled="isSubmitting"
/> />
<p class="font-bold">v{{ version }}</p> <p class="mt-6 font-bold">v{{ version }}</p>
</form> </form>
</div> </div>
</template> </template>
@@ -11,7 +11,7 @@
{{ isEditMode ? t('admin.sites.editSite') : t('admin.sites.createSite') }} {{ isEditMode ? t('admin.sites.editSite') : t('admin.sites.createSite') }}
</h2> </h2>
</template> </template>
<form class="flex flex-col gap-4 py-4" @submit.prevent="handleSave"> <form class="flex flex-col py-4 gap-2" @submit.prevent="handleSave">
<MalioInputText <MalioInputText
v-model="form.name" v-model="form.name"
:label="t('admin.sites.form.name')" :label="t('admin.sites.form.name')"
@@ -65,12 +65,17 @@
input-class="w-full font-mono" input-class="w-full font-mono"
required required
/> />
<!-- pb-4 sur le wrapper : simule le slot message du
MalioInputText voisin pour qu'items-center recentre
la puce sur le centre visible de l'input. -->
<div class="shrink-0 pb-4">
<span <span
:style="{ backgroundColor: isValidHex ? form.color : 'transparent' }" :style="{ backgroundColor: isValidHex ? form.color : 'transparent' }"
class="inline-block size-10 shrink-0 rounded-lg border border-neutral-200" class="inline-block size-10 rounded-lg border border-neutral-200"
:class="{ 'border-dashed': !isValidHex }" :class="{ 'border-dashed': !isValidHex }"
/> />
</div> </div>
</div>
<p v-if="form.color && !isValidHex" class="mt-1 text-xs text-red-600"> <p v-if="form.color && !isValidHex" class="mt-1 text-xs text-red-600">
{{ t('admin.sites.form.colorInvalid') }} {{ t('admin.sites.form.colorInvalid') }}
</p> </p>
@@ -87,20 +92,20 @@
variant="danger" variant="danger"
icon-name="mdi:delete-outline" icon-name="mdi:delete-outline"
icon-position="left" icon-position="left"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="emit('delete')" @click="emit('delete')"
/> />
<MalioButton <MalioButton
v-else v-else
:label="t('common.cancel')" :label="t('common.cancel')"
variant="tertiary" variant="tertiary"
button-class="w-[150px]" button-class="w-m-btn-action"
@click="emit('update:modelValue', false)" @click="emit('update:modelValue', false)"
/> />
<MalioButton <MalioButton
:label="t('common.save')" :label="t('common.save')"
variant="primary" variant="primary"
button-class="w-[150px]" button-class="w-m-btn-action"
:disabled="saving || !isValidHex" :disabled="saving || !isValidHex"
@click="handleSave" @click="handleSave"
/> />
+4 -4
View File
@@ -7,7 +7,7 @@
"name": "starseed-frontend", "name": "starseed-frontend",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@malio/layer-ui": "^1.7.1", "@malio/layer-ui": "^1.7.3",
"@nuxt/icon": "^2.2.1", "@nuxt/icon": "^2.2.1",
"@nuxtjs/i18n": "^10.2.3", "@nuxtjs/i18n": "^10.2.3",
"@nuxtjs/tailwindcss": "^6.14.0", "@nuxtjs/tailwindcss": "^6.14.0",
@@ -1866,9 +1866,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@malio/layer-ui": { "node_modules/@malio/layer-ui": {
"version": "1.7.1", "version": "1.7.3",
"resolved": "https://gitea.malio.fr/api/packages/MALIO-DEV/npm/%40malio%2Flayer-ui/-/1.7.1/layer-ui-1.7.1.tgz", "resolved": "https://gitea.malio.fr/api/packages/MALIO-DEV/npm/%40malio%2Flayer-ui/-/1.7.3/layer-ui-1.7.3.tgz",
"integrity": "sha512-RYMMappWt/fgjD+BM7//h2O6kxD6WH9Fui8hoC29xtKySRQsqD61XKTdR7BRRkpktbxKmV39q/hblyAFBqV5yw==", "integrity": "sha512-jw3ka0Az6Jf0F9ifsooknkwXph8TNgoe6H3CjF8tbBxl8oND8HLHjlZ04ooUCoOUEIlsQ1Mm2hFFlQRCB04qdA==",
"dependencies": { "dependencies": {
"@nuxt/icon": "^2.2.1", "@nuxt/icon": "^2.2.1",
"@nuxtjs/tailwindcss": "^6.14.0", "@nuxtjs/tailwindcss": "^6.14.0",
+1 -1
View File
@@ -17,7 +17,7 @@
"test:e2e:ui": "playwright test --ui" "test:e2e:ui": "playwright test --ui"
}, },
"dependencies": { "dependencies": {
"@malio/layer-ui": "^1.7.1", "@malio/layer-ui": "^1.7.3",
"@nuxt/icon": "^2.2.1", "@nuxt/icon": "^2.2.1",
"@nuxtjs/i18n": "^10.2.3", "@nuxtjs/i18n": "^10.2.3",
"@nuxtjs/tailwindcss": "^6.14.0", "@nuxtjs/tailwindcss": "^6.14.0",