feat(machines) : ajoute le clonage par catégorie (structure seule)

Nouveau mode de clonage de machine via le paramètre `mode` de
POST /api/machines/{id}/clone :
- mode "full" (défaut) : comportement inchangé (clone complet)
- mode "structure" : ne recopie que les catégories des slots
  (modelType), composant/pièce/produit concrets laissés vides
  (slots à compléter), sans overrides ni custom field values

Front : sélecteur de mode dans la page de création de machine,
visible uniquement quand une machine source est choisie.
This commit is contained in:
Matthieu
2026-06-15 11:16:02 +02:00
parent b775718df6
commit 494298f981
5 changed files with 173 additions and 13 deletions
@@ -33,6 +33,9 @@ export function useMachineCreatePage() {
siteId: '',
reference: '',
cloneFromMachineId: '',
// 'full' = clone complet (composants/pièces concrets) ; 'structure' = catégories
// uniquement (slots à compléter).
cloneMode: 'full' as 'full' | 'structure',
})
// ---------------------------------------------------------------------------
@@ -57,6 +60,7 @@ export function useMachineCreatePage() {
result = await cloneMachine(newMachine.cloneFromMachineId, {
name: newMachine.name,
siteId: newMachine.siteId,
mode: newMachine.cloneMode,
...(newMachine.reference ? { reference: newMachine.reference } : {}),
})
} else {
+1 -1
View File
@@ -169,7 +169,7 @@ export function useMachines() {
}
}
const cloneMachine = async (sourceId: string, data: { name: string; siteId: string; reference?: string }): Promise<ApiResponse> => {
const cloneMachine = async (sourceId: string, data: { name: string; siteId: string; reference?: string; mode?: 'full' | 'structure' }): Promise<ApiResponse> => {
loading.value = true
try {
const result = await post(`/machines/${sourceId}/clone`, data)
+35
View File
@@ -103,6 +103,41 @@
</div>
</div>
<!-- Clone mode (visible only when a source machine is selected) -->
<div v-if="c.newMachine.cloneFromMachineId" class="form-control">
<label class="label">
<span class="label-text">Mode de clonage</span>
</label>
<div class="flex flex-col gap-2 sm:flex-row sm:gap-6">
<label class="flex items-start gap-2 cursor-pointer">
<input
v-model="c.newMachine.cloneMode"
type="radio"
value="full"
class="radio radio-primary radio-sm mt-0.5"
:disabled="!canEdit"
>
<span class="text-sm">
Tout cloner
<span class="block text-xs text-gray-500">Structure + composants et pièces assignés</span>
</span>
</label>
<label class="flex items-start gap-2 cursor-pointer">
<input
v-model="c.newMachine.cloneMode"
type="radio"
value="structure"
class="radio radio-primary radio-sm mt-0.5"
:disabled="!canEdit"
>
<span class="text-sm">
Structure seule
<span class="block text-xs text-gray-500">Catégories uniquement, slots à compléter</span>
</span>
</label>
</div>
</div>
<!-- Actions -->
<div class="flex justify-end gap-3 pt-4 border-t border-base-200">
<NuxtLink to="/machines" class="btn btn-outline btn-sm md:btn-md">