From 384c3f068015ff6f427f44b54137e41e09b1c8eb Mon Sep 17 00:00:00 2001 From: MatthieuTD <39524319+MatthieuTD@users.noreply.github.com> Date: Mon, 6 Oct 2025 16:55:45 +0200 Subject: [PATCH] Restore component catalog with requirement-based instantiation --- app/composables/useComposants.js | 6 +- app/pages/component-catalog.vue | 596 ++++++++++++++++++++++++++++++- app/pages/machine/[id].vue | 36 +- app/pages/machines/new.vue | 36 +- app/shared/modelUtils.ts | 42 +++ 5 files changed, 626 insertions(+), 90 deletions(-) diff --git a/app/composables/useComposants.js b/app/composables/useComposants.js index b04cdf3..290a50d 100644 --- a/app/composables/useComposants.js +++ b/app/composables/useComposants.js @@ -62,7 +62,11 @@ export function useComposants () { const result = await post('/composants', composantData) if (result.success) { composants.value.push(result.data) - showSuccess(`Composant "${composantData.name}" créé avec succès`) + const displayName = result.data?.name + || composantData?.definition?.name + || composantData?.name + || 'Composant' + showSuccess(`Composant "${displayName}" créé avec succès`) } return result } catch (error) { diff --git a/app/pages/component-catalog.vue b/app/pages/component-catalog.vue index d65415b..84dc0f3 100644 --- a/app/pages/component-catalog.vue +++ b/app/pages/component-catalog.vue @@ -1,29 +1,587 @@ diff --git a/app/pages/machine/[id].vue b/app/pages/machine/[id].vue index aad9041..4bb43a0 100644 --- a/app/pages/machine/[id].vue +++ b/app/pages/machine/[id].vue @@ -783,6 +783,7 @@ import { useApi } from '~/composables/useApi' import { useToast } from '~/composables/useToast' import { useDocuments } from '~/composables/useDocuments' import { getFileIcon } from '~/utils/fileIcons' +import { sanitizeDefinitionOverrides } from '~/shared/modelUtils' import { canPreviewDocument } from '~/utils/documentPreview' import ComponentHierarchy from '~/components/ComponentHierarchy.vue' import DocumentUpload from '~/components/DocumentUpload.vue' @@ -976,41 +977,6 @@ const createPieceSelectionEntry = (requirement, source = null) => ({ }, }) -const sanitizeDefinitionOverrides = (definition) => { - if (!definition || typeof definition !== 'object') { - return null - } - - const payload = {} - - if (typeof definition.name === 'string') { - const name = definition.name.trim() - if (name.length > 0) { - payload.name = name - } - } - - if (typeof definition.reference === 'string') { - const reference = definition.reference.trim() - if (reference.length > 0) { - payload.reference = reference - } - } - - if (definition.constructeurId !== undefined && definition.constructeurId !== null && definition.constructeurId !== '') { - payload.constructeurId = definition.constructeurId - } - - if (definition.prix !== undefined && definition.prix !== null && definition.prix !== '') { - const parsed = Number(definition.prix) - if (!Number.isNaN(parsed)) { - payload.prix = parsed - } - } - - return Object.keys(payload).length ? payload : null -} - const resetSkeletonRequirementSelections = () => { Object.keys(componentRequirementSelections).forEach((key) => { delete componentRequirementSelections[key] diff --git a/app/pages/machines/new.vue b/app/pages/machines/new.vue index 27f2600..f942123 100644 --- a/app/pages/machines/new.vue +++ b/app/pages/machines/new.vue @@ -560,6 +560,7 @@ import { useMachines } from '~/composables/useMachines' import { useSites } from '~/composables/useSites' import { useMachineTypesApi } from '~/composables/useMachineTypesApi' import { useToast } from '~/composables/useToast' +import { sanitizeDefinitionOverrides } from '~/shared/modelUtils' import IconLucidePlus from '~icons/lucide/plus' import IconLucideX from '~icons/lucide/x' import IconLucideEye from '~icons/lucide/eye' @@ -652,41 +653,6 @@ const createPieceSelectionEntry = (requirement, source = null) => ({ }, }) -const sanitizeDefinitionOverrides = (definition) => { - if (!definition || typeof definition !== 'object') { - return null - } - - const payload = {} - - if (typeof definition.name === 'string') { - const name = definition.name.trim() - if (name.length > 0) { - payload.name = name - } - } - - if (typeof definition.reference === 'string') { - const reference = definition.reference.trim() - if (reference.length > 0) { - payload.reference = reference - } - } - - if (definition.constructeurId !== undefined && definition.constructeurId !== null && definition.constructeurId !== '') { - payload.constructeurId = definition.constructeurId - } - - if (definition.prix !== undefined && definition.prix !== null && definition.prix !== '') { - const parsed = Number(definition.prix) - if (!Number.isNaN(parsed)) { - payload.prix = parsed - } - } - - return Object.keys(payload).length ? payload : null -} - const clearRequirementSelections = () => { Object.keys(componentRequirementSelections).forEach((key) => { delete componentRequirementSelections[key] diff --git a/app/shared/modelUtils.ts b/app/shared/modelUtils.ts index c0aebce..9333596 100644 --- a/app/shared/modelUtils.ts +++ b/app/shared/modelUtils.ts @@ -387,6 +387,48 @@ export const formatStructurePreview = (structure: any) => { return segments.join(' • ') } +export interface DefinitionOverridePayload { + name?: string + reference?: string + constructeurId?: string | null + prix?: number +} + +export const sanitizeDefinitionOverrides = (definition: any): DefinitionOverridePayload | null => { + if (!definition || typeof definition !== 'object') { + return null + } + + const payload: DefinitionOverridePayload = {} + + if (typeof definition.name === 'string') { + const name = definition.name.trim() + if (name.length > 0) { + payload.name = name + } + } + + if (typeof definition.reference === 'string') { + const reference = definition.reference.trim() + if (reference.length > 0) { + payload.reference = reference + } + } + + if (definition.constructeurId !== undefined && definition.constructeurId !== null && definition.constructeurId !== '') { + payload.constructeurId = definition.constructeurId + } + + if (definition.prix !== undefined && definition.prix !== null && definition.prix !== '') { + const parsed = Number(definition.prix) + if (!Number.isNaN(parsed)) { + payload.prix = parsed + } + } + + return Object.keys(payload).length ? payload : null +} + export const defaultPieceStructure = (): PieceModelStructure => ({ ...createEmptyPieceModelStructure(), })