fix(ui) : move add buttons below last element in structure editors
Place "Ajouter" buttons after the items list instead of in the section header, so they always appear below the last added element. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,19 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="space-y-6">
|
<div class="space-y-6">
|
||||||
<section class="space-y-3">
|
<section class="space-y-3">
|
||||||
<header class="flex items-center justify-between">
|
<header>
|
||||||
<div>
|
<h3 class="text-sm font-semibold">
|
||||||
<h3 class="text-sm font-semibold">
|
Produits inclus par défaut
|
||||||
Produits inclus par défaut
|
</h3>
|
||||||
</h3>
|
<p class="text-xs text-base-content/70">
|
||||||
<p class="text-xs text-base-content/70">
|
Ces produits s'afficheront lors de la création d'une pièce basée sur cette catégorie.
|
||||||
Ces produits s'afficheront lors de la création d'une pièce basée sur cette catégorie.
|
</p>
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<button v-if="!restrictedMode" type="button" class="btn btn-outline btn-xs" @click="addProduct">
|
|
||||||
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
|
||||||
Ajouter
|
|
||||||
</button>
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<p v-if="!products.length" class="text-xs text-gray-500">
|
<p v-if="!products.length" class="text-xs text-gray-500">
|
||||||
@@ -71,18 +65,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<button v-if="!restrictedMode" type="button" class="btn btn-outline btn-xs" @click="addProduct">
|
||||||
|
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="space-y-3">
|
<section class="space-y-3">
|
||||||
<header class="flex items-center justify-between">
|
<h3 class="text-sm font-semibold">
|
||||||
<h3 class="text-sm font-semibold">
|
Champs personnalisés
|
||||||
Champs personnalisés
|
</h3>
|
||||||
</h3>
|
|
||||||
<button type="button" class="btn btn-outline btn-xs" @click="addField">
|
|
||||||
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
|
||||||
Ajouter
|
|
||||||
</button>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<p v-if="!fields.length" class="text-xs text-gray-500">
|
<p v-if="!fields.length" class="text-xs text-gray-500">
|
||||||
Aucun champ personnalisé n'a encore été défini.
|
Aucun champ personnalisé n'a encore été défini.
|
||||||
@@ -172,6 +164,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<button type="button" class="btn btn-outline btn-xs" @click="addField">
|
||||||
|
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -70,15 +70,9 @@
|
|||||||
|
|
||||||
<div class="px-4 py-4 space-y-5">
|
<div class="px-4 py-4 space-y-5">
|
||||||
<section v-if="isRoot" class="space-y-3">
|
<section v-if="isRoot" class="space-y-3">
|
||||||
<div class="flex items-center justify-between gap-2">
|
<h4 :class="headingClass">
|
||||||
<h4 :class="headingClass">
|
{{ isRoot ? 'Champs personnalisés du composant' : 'Champs personnalisés' }}
|
||||||
{{ isRoot ? 'Champs personnalisés du composant' : 'Champs personnalisés' }}
|
</h4>
|
||||||
</h4>
|
|
||||||
<button type="button" class="btn btn-outline btn-xs" @click="addCustomField">
|
|
||||||
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
|
||||||
Ajouter
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<p v-if="!(node.customFields?.length)" class="text-xs text-gray-500">
|
<p v-if="!(node.customFields?.length)" class="text-xs text-gray-500">
|
||||||
Aucun champ n'a encore été défini.
|
Aucun champ n'a encore été défini.
|
||||||
</p>
|
</p>
|
||||||
@@ -155,18 +149,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button type="button" class="btn btn-outline btn-xs" @click="addCustomField">
|
||||||
|
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section v-if="isRoot" class="space-y-3">
|
<section v-if="isRoot" class="space-y-3">
|
||||||
<div class="flex items-center justify-between gap-2">
|
<h4 :class="headingClass">
|
||||||
<h4 :class="headingClass">
|
{{ isRoot ? 'Produits inclus par défaut' : 'Produits' }}
|
||||||
{{ isRoot ? 'Produits inclus par défaut' : 'Produits' }}
|
</h4>
|
||||||
</h4>
|
|
||||||
<button v-if="!restrictedMode" type="button" class="btn btn-outline btn-xs" @click="addProduct">
|
|
||||||
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
|
||||||
Ajouter
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<p v-if="!(node.products?.length)" class="text-xs text-gray-500">
|
<p v-if="!(node.products?.length)" class="text-xs text-gray-500">
|
||||||
Aucun produit défini.
|
Aucun produit défini.
|
||||||
</p>
|
</p>
|
||||||
@@ -228,18 +220,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button v-if="!restrictedMode" type="button" class="btn btn-outline btn-xs" @click="addProduct">
|
||||||
|
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section v-if="isRoot" class="space-y-3">
|
<section v-if="isRoot" class="space-y-3">
|
||||||
<div class="flex items-center justify-between gap-2">
|
<h4 :class="headingClass">
|
||||||
<h4 :class="headingClass">
|
{{ isRoot ? 'Pièces incluses par défaut' : 'Pièces' }}
|
||||||
{{ isRoot ? 'Pièces incluses par défaut' : 'Pièces' }}
|
</h4>
|
||||||
</h4>
|
|
||||||
<button v-if="!restrictedMode" type="button" class="btn btn-outline btn-xs" @click="addPiece">
|
|
||||||
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
|
||||||
Ajouter
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<p v-if="!(node.pieces?.length)" class="text-xs text-gray-500">
|
<p v-if="!(node.pieces?.length)" class="text-xs text-gray-500">
|
||||||
Aucune pièce définie.
|
Aucune pièce définie.
|
||||||
</p>
|
</p>
|
||||||
@@ -302,21 +292,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button v-if="!restrictedMode" type="button" class="btn btn-outline btn-xs" @click="addPiece">
|
||||||
|
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section v-if="canManageSubcomponents || hasSubcomponents" class="space-y-3">
|
<section v-if="canManageSubcomponents || hasSubcomponents" class="space-y-3">
|
||||||
<div class="flex items-center justify-between gap-2">
|
<h4 :class="headingClass">Sous-composants</h4>
|
||||||
<h4 :class="headingClass">Sous-composants</h4>
|
|
||||||
<button
|
|
||||||
v-if="canManageSubcomponents && !restrictedMode"
|
|
||||||
type="button"
|
|
||||||
class="btn btn-outline btn-xs"
|
|
||||||
@click="addSubComponent"
|
|
||||||
>
|
|
||||||
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
|
||||||
Ajouter
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<p v-if="!isRoot && canManageSubcomponents" class="text-[11px] text-gray-500">
|
<p v-if="!isRoot && canManageSubcomponents" class="text-[11px] text-gray-500">
|
||||||
Sélectionnez uniquement la famille de ce sous-composant ; il sera configuré via son propre modèle.
|
Sélectionnez uniquement la famille de ce sous-composant ; il sera configuré via son propre modèle.
|
||||||
</p>
|
</p>
|
||||||
@@ -357,6 +340,15 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button
|
||||||
|
v-if="canManageSubcomponents && !restrictedMode"
|
||||||
|
type="button"
|
||||||
|
class="btn btn-outline btn-xs"
|
||||||
|
@click="addSubComponent"
|
||||||
|
>
|
||||||
|
<IconLucidePlus class="w-3 h-3 mr-2" aria-hidden="true" />
|
||||||
|
Ajouter
|
||||||
|
</button>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,31 +3,21 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="flex justify-between items-center mb-4">
|
<div class="flex justify-between items-center mb-4">
|
||||||
<h2 class="card-title">Composants</h2>
|
<h2 class="card-title">Composants</h2>
|
||||||
<div class="flex items-center gap-2">
|
<button
|
||||||
<button
|
type="button"
|
||||||
v-if="isEditMode"
|
class="btn btn-ghost btn-sm gap-2"
|
||||||
type="button"
|
@click="$emit('toggle-collapse')"
|
||||||
class="btn btn-sm md:btn-md btn-primary"
|
:title="collapsed ? 'Déplier tous les composants' : 'Replier tous les composants'"
|
||||||
@click="$emit('add-component')"
|
>
|
||||||
>
|
<IconLucideChevronRight
|
||||||
Ajouter un composant
|
class="w-5 h-5 transition-transform"
|
||||||
</button>
|
:class="collapsed ? 'rotate-0' : 'rotate-90'"
|
||||||
<button
|
aria-hidden="true"
|
||||||
type="button"
|
/>
|
||||||
class="btn btn-ghost btn-sm gap-2"
|
<span class="text-sm">
|
||||||
@click="$emit('toggle-collapse')"
|
{{ collapsed ? 'Tout déplier' : 'Tout replier' }}
|
||||||
:title="collapsed ? 'Déplier tous les composants' : 'Replier tous les composants'"
|
</span>
|
||||||
>
|
</button>
|
||||||
<IconLucideChevronRight
|
|
||||||
class="w-5 h-5 transition-transform"
|
|
||||||
:class="collapsed ? 'rotate-0' : 'rotate-90'"
|
|
||||||
aria-hidden="true"
|
|
||||||
/>
|
|
||||||
<span class="text-sm">
|
|
||||||
{{ collapsed ? 'Tout déplier' : 'Tout replier' }}
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="components.length === 0" class="text-sm text-gray-500 py-4">
|
<div v-if="components.length === 0" class="text-sm text-gray-500 py-4">
|
||||||
@@ -54,6 +44,15 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
v-if="isEditMode"
|
||||||
|
type="button"
|
||||||
|
class="btn btn-sm md:btn-md btn-primary"
|
||||||
|
@click="$emit('add-component')"
|
||||||
|
>
|
||||||
|
Ajouter un composant
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -3,31 +3,21 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="flex justify-between items-center mb-4">
|
<div class="flex justify-between items-center mb-4">
|
||||||
<h2 class="card-title">Pièces de la machine</h2>
|
<h2 class="card-title">Pièces de la machine</h2>
|
||||||
<div class="flex items-center gap-2">
|
<button
|
||||||
<button
|
type="button"
|
||||||
v-if="isEditMode"
|
class="btn btn-ghost btn-sm gap-2"
|
||||||
type="button"
|
@click="$emit('toggle-collapse')"
|
||||||
class="btn btn-sm md:btn-md btn-primary"
|
:title="collapsed ? 'Déplier toutes les pièces' : 'Replier toutes les pièces'"
|
||||||
@click="$emit('add-piece')"
|
>
|
||||||
>
|
<IconLucideChevronRight
|
||||||
Ajouter une pièce
|
class="w-5 h-5 transition-transform"
|
||||||
</button>
|
:class="collapsed ? 'rotate-0' : 'rotate-90'"
|
||||||
<button
|
aria-hidden="true"
|
||||||
type="button"
|
/>
|
||||||
class="btn btn-ghost btn-sm gap-2"
|
<span class="text-sm">
|
||||||
@click="$emit('toggle-collapse')"
|
{{ collapsed ? 'Tout déplier' : 'Tout replier' }}
|
||||||
:title="collapsed ? 'Déplier toutes les pièces' : 'Replier toutes les pièces'"
|
</span>
|
||||||
>
|
</button>
|
||||||
<IconLucideChevronRight
|
|
||||||
class="w-5 h-5 transition-transform"
|
|
||||||
:class="collapsed ? 'rotate-0' : 'rotate-90'"
|
|
||||||
aria-hidden="true"
|
|
||||||
/>
|
|
||||||
<span class="text-sm">
|
|
||||||
{{ collapsed ? 'Tout déplier' : 'Tout replier' }}
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="pieces.length === 0" class="text-sm text-gray-500 py-4">
|
<div v-if="pieces.length === 0" class="text-sm text-gray-500 py-4">
|
||||||
@@ -54,6 +44,15 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
v-if="isEditMode"
|
||||||
|
type="button"
|
||||||
|
class="btn btn-sm md:btn-md btn-primary"
|
||||||
|
@click="$emit('add-piece')"
|
||||||
|
>
|
||||||
|
Ajouter une pièce
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -15,19 +15,9 @@
|
|||||||
Produits sélectionnés directement pour cette machine.
|
Produits sélectionnés directement pour cette machine.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-2">
|
<span class="badge badge-outline" v-if="products.length">
|
||||||
<button
|
{{ products.length }} produit{{ products.length > 1 ? 's' : '' }}
|
||||||
v-if="isEditMode"
|
</span>
|
||||||
type="button"
|
|
||||||
class="btn btn-sm md:btn-md btn-primary"
|
|
||||||
@click="$emit('add-product')"
|
|
||||||
>
|
|
||||||
Ajouter un produit
|
|
||||||
</button>
|
|
||||||
<span class="badge badge-outline" v-if="products.length">
|
|
||||||
{{ products.length }} produit{{ products.length > 1 ? 's' : '' }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="products.length" class="space-y-3">
|
<div v-if="products.length" class="space-y-3">
|
||||||
@@ -117,6 +107,15 @@
|
|||||||
<p v-else class="text-xs text-gray-500">
|
<p v-else class="text-xs text-gray-500">
|
||||||
Aucun produit n'a été associé directement à cette machine.
|
Aucun produit n'a été associé directement à cette machine.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<button
|
||||||
|
v-if="isEditMode"
|
||||||
|
type="button"
|
||||||
|
class="btn btn-sm md:btn-md btn-primary"
|
||||||
|
@click="$emit('add-product')"
|
||||||
|
>
|
||||||
|
Ajouter un produit
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user