From 9ee348fff0e3bf6ec168b42257478545ea918dda Mon Sep 17 00:00:00 2001 From: Matthieu Date: Fri, 6 Feb 2026 17:16:16 +0100 Subject: [PATCH] refactor(front): extract shared utils and rewire pages --- app/components/ConstructeurSelect.vue | 28 +- app/components/ProductSelect.vue | 2 +- app/components/StructureNodeEditor.vue | 12 +- .../common/RequirementListEditor.vue | 45 +- ...ComponentTypes.js => useComponentTypes.ts} | 88 ++- .../{useComposants.js => useComposants.ts} | 149 +++-- ...seConstructeurs.js => useConstructeurs.ts} | 100 ++-- app/composables/useDocuments.js | 169 ------ app/composables/useDocuments.ts | 241 ++++++++ .../{usePieceTypes.js => usePieceTypes.ts} | 88 ++- .../{usePieces.js => usePieces.ts} | 152 +++-- ...{useProductTypes.js => useProductTypes.ts} | 73 ++- .../{useProducts.js => useProducts.ts} | 138 +++-- app/composables/useSiteManagement.ts | 5 +- app/composables/useSites.js | 111 ---- app/composables/useSites.ts | 139 +++++ app/pages/component/[id]/edit.vue | 555 ++---------------- app/pages/component/create.vue | 27 +- app/pages/pieces/[id]/edit.vue | 467 ++------------- app/pages/pieces/create.vue | 261 +------- app/pages/product/[id]/edit.vue | 312 +--------- app/pages/product/create.vue | 60 +- app/services/modelTypes.ts | 4 +- app/shared/apiRelations.ts | 2 +- app/shared/constructeurUtils.ts | 2 +- app/shared/modelUtils.ts | 12 +- app/shared/types/inventory.ts | 8 +- app/shared/utils/customFieldFormUtils.ts | 367 ++++++++++++ app/shared/utils/customFieldUtils.ts | 20 +- app/shared/utils/documentDisplayUtils.ts | 65 ++ app/shared/utils/historyDisplayUtils.ts | 78 +++ app/types/icons.d.ts | 14 + app/utils/events.ts | 41 ++ app/utils/formatters/email.ts | 8 +- package-lock.json | 36 +- package.json | 1 + 36 files changed, 1686 insertions(+), 2194 deletions(-) rename app/composables/{useComponentTypes.js => useComponentTypes.ts} (50%) rename app/composables/{useComposants.js => useComposants.ts} (54%) rename app/composables/{useConstructeurs.js => useConstructeurs.ts} (58%) delete mode 100644 app/composables/useDocuments.js create mode 100644 app/composables/useDocuments.ts rename app/composables/{usePieceTypes.js => usePieceTypes.ts} (50%) rename app/composables/{usePieces.js => usePieces.ts} (56%) rename app/composables/{useProductTypes.js => useProductTypes.ts} (53%) rename app/composables/{useProducts.js => useProducts.ts} (66%) delete mode 100644 app/composables/useSites.js create mode 100644 app/composables/useSites.ts create mode 100644 app/shared/utils/customFieldFormUtils.ts create mode 100644 app/shared/utils/documentDisplayUtils.ts create mode 100644 app/shared/utils/historyDisplayUtils.ts create mode 100644 app/types/icons.d.ts create mode 100644 app/utils/events.ts diff --git a/app/components/ConstructeurSelect.vue b/app/components/ConstructeurSelect.vue index 7bf19d8..311f4e5 100644 --- a/app/components/ConstructeurSelect.vue +++ b/app/components/ConstructeurSelect.vue @@ -246,6 +246,16 @@ const emitSelection = (ids: string[]) => { emit('update:modelValue', normalized) } +const extractDataArray = (data: unknown): ConstructeurSummary[] => { + if (Array.isArray(data)) { + return data as ConstructeurSummary[] + } + if (data && typeof data === 'object' && 'id' in data) { + return [data as ConstructeurSummary] + } + return [] +} + const ensureOptionsLoaded = async (force = false) => { if (!force && !searchTerm.value && constructeurs.value.length) { applyOptions(constructeurs.value as ConstructeurSummary[]) @@ -262,7 +272,7 @@ const ensureOptionsLoaded = async (force = false) => { const result = await searchConstructeurs(searchTerm.value) if (result.success) { - applyOptions(result.data || []) + applyOptions(extractDataArray(result.data)) lastSearchTerm = searchTerm.value } } @@ -283,7 +293,7 @@ const onSearch = () => { } const result = await searchConstructeurs(searchTerm.value) if (result.success) { - applyOptions(result.data || []) + applyOptions(extractDataArray(result.data)) lastSearchTerm = searchTerm.value } }, 250) @@ -310,16 +320,18 @@ const closeCreateModal = () => { const handleCreate = async () => { creating.value = true - const payload = { ...createForm.value } - if (!payload.phone) { - delete payload.phone + const payload: { name: string; email?: string; phone?: string } = { + name: createForm.value.name, } - if (!payload.email) { - delete payload.email + if (createForm.value.email) { + payload.email = createForm.value.email + } + if (createForm.value.phone) { + payload.phone = createForm.value.phone } const result = await createConstructeur(payload) creating.value = false - if (result.success) { + if (result.success && result.data && !Array.isArray(result.data)) { emitSelection([...selectedIds.value, result.data.id]) searchTerm.value = '' closeCreateModal() diff --git a/app/components/ProductSelect.vue b/app/components/ProductSelect.vue index a4bc49c..34c7d21 100644 --- a/app/components/ProductSelect.vue +++ b/app/components/ProductSelect.vue @@ -1,7 +1,7 @@