diff --git a/app/pages/component-catalog.vue b/app/pages/component-catalog.vue index ec74635..f5df048 100644 --- a/app/pages/component-catalog.vue +++ b/app/pages/component-catalog.vue @@ -124,13 +124,11 @@ import { computed, onMounted } from 'vue' import DataTable from '~/components/common/DataTable.vue' import { useComposants } from '~/composables/useComposants' import { useComponentTypes } from '~/composables/useComponentTypes' -import { useToast } from '~/composables/useToast' import { useDataTable } from '~/composables/useDataTable' import DocumentThumbnail from '~/components/DocumentThumbnail.vue' import { isImageDocument, isPdfDocument } from '~/utils/documentPreview' const { canEdit } = usePermissions() -const { showError } = useToast() const { composants, total, loadComposants, loading: loadingComposantsRef, deleteComposant } = useComposants() const { componentTypes, loadComponentTypes } = useComponentTypes() const loadingComposants = computed(() => loadingComposantsRef.value) @@ -203,29 +201,27 @@ const resolveComponentType = (component: Record) => { return '—' } -const resolveDeleteGuard = (component: Record) => { - const blockingReasons: string[] = [] +const resolveDeleteImpact = (component: Record) => { + const impacts: string[] = [] const machineLinks = Array.isArray(component?.machineLinks) ? component.machineLinks.length : component?.machineLinksCount ?? 0 const documents = Array.isArray(component?.documents) ? component.documents.length : component?.documentsCount ?? 0 const customFields = Array.isArray(component?.customFieldValues) ? component.customFieldValues.length : component?.customFieldValuesCount ?? 0 - if (machineLinks > 0) blockingReasons.push(`${machineLinks} liaison${machineLinks > 1 ? 's' : ''} machine`) - if (documents > 0) blockingReasons.push(`${documents} document${documents > 1 ? 's' : ''}`) - return { blockingReasons, hasCustomFields: customFields > 0 } + if (machineLinks > 0) impacts.push(`${machineLinks} liaison${machineLinks > 1 ? 's' : ''} machine`) + if (documents > 0) impacts.push(`${documents} document${documents > 1 ? 's' : ''}`) + if (customFields > 0) impacts.push(`${customFields} valeur${customFields > 1 ? 's' : ''} de champs personnalisés`) + return impacts } const handleDeleteComponent = async (component: Record) => { - const { blockingReasons, hasCustomFields } = resolveDeleteGuard(component) - if (blockingReasons.length) { - showError(`Impossible de supprimer ce composant car il possède encore: ${blockingReasons.join(', ')}. Supprimez ou détachez ces éléments avant de réessayer.`) - return - } const componentName = component?.name || 'ce composant' - const confirmLines = [`Voulez-vous vraiment supprimer ${componentName} ?`] - if (hasCustomFields) { - confirmLines.push('Les valeurs de champs personnalisés associées seront également supprimées.') + const impacts = resolveDeleteImpact(component) + const lines = [`Voulez-vous vraiment supprimer « ${componentName} » ?`] + if (impacts.length) { + lines.push(`Cela supprimera également :\n• ${impacts.join('\n• ')}`) } + lines.push('Cette action est irréversible.') const { confirm } = useConfirm() - const confirmed = await confirm({ message: confirmLines.join('\n\n') }) + const confirmed = await confirm({ title: 'Supprimer le composant', message: lines.join('\n\n'), dangerous: true }) if (!confirmed) return await deleteComposant(component.id) fetchComposants() diff --git a/app/pages/pieces-catalog.vue b/app/pages/pieces-catalog.vue index d0ce906..9448ddf 100644 --- a/app/pages/pieces-catalog.vue +++ b/app/pages/pieces-catalog.vue @@ -147,13 +147,11 @@ import { computed, onMounted } from 'vue' import DataTable from '~/components/common/DataTable.vue' import { usePieces } from '~/composables/usePieces' import { usePieceTypes } from '~/composables/usePieceTypes' -import { useToast } from '~/composables/useToast' import { useDataTable } from '~/composables/useDataTable' import DocumentThumbnail from '~/components/DocumentThumbnail.vue' import { isImageDocument, isPdfDocument } from '~/utils/documentPreview' const { canEdit } = usePermissions() -const { showError } = useToast() const { pieces, total, loadPieces, loading: loadingPiecesRef, deletePiece } = usePieces() const { pieceTypes, loadPieceTypes } = usePieceTypes() const loadingPieces = computed(() => loadingPiecesRef.value) @@ -280,29 +278,27 @@ const buildPieceSuppliersDisplay = (piece: Record) => { return { suppliers, visible, overflow, tooltip: suppliers.length ? suppliers.join(', ') : '' } } -const resolveDeleteGuard = (piece: Record) => { - const blockingReasons: string[] = [] +const resolveDeleteImpact = (piece: Record) => { + const impacts: string[] = [] const machineLinks = Array.isArray(piece?.machineLinks) ? piece.machineLinks.length : piece?.machineLinksCount ?? 0 const documents = Array.isArray(piece?.documents) ? piece.documents.length : piece?.documentsCount ?? 0 const customFields = Array.isArray(piece?.customFieldValues) ? piece.customFieldValues.length : piece?.customFieldValuesCount ?? 0 - if (machineLinks > 0) blockingReasons.push(`${machineLinks} liaison${machineLinks > 1 ? 's' : ''} machine`) - if (documents > 0) blockingReasons.push(`${documents} document${documents > 1 ? 's' : ''}`) - return { blockingReasons, hasCustomFields: customFields > 0 } + if (machineLinks > 0) impacts.push(`${machineLinks} liaison${machineLinks > 1 ? 's' : ''} machine`) + if (documents > 0) impacts.push(`${documents} document${documents > 1 ? 's' : ''}`) + if (customFields > 0) impacts.push(`${customFields} valeur${customFields > 1 ? 's' : ''} de champs personnalisés`) + return impacts } const handleDeletePiece = async (piece: Record) => { - const { blockingReasons, hasCustomFields } = resolveDeleteGuard(piece) - if (blockingReasons.length) { - showError(`Impossible de supprimer cette pièce car elle possède encore: ${blockingReasons.join(', ')}. Supprimez ou détachez ces éléments avant de réessayer.`) - return - } const pieceName = piece?.name || 'cette pièce' - const confirmLines = [`Voulez-vous vraiment supprimer ${pieceName} ?`] - if (hasCustomFields) { - confirmLines.push('Les valeurs de champs personnalisés associées seront également supprimées.') + const impacts = resolveDeleteImpact(piece) + const lines = [`Voulez-vous vraiment supprimer « ${pieceName} » ?`] + if (impacts.length) { + lines.push(`Cela supprimera également :\n• ${impacts.join('\n• ')}`) } + lines.push('Cette action est irréversible.') const { confirm } = useConfirm() - const confirmed = await confirm({ message: confirmLines.join('\n\n') }) + const confirmed = await confirm({ title: 'Supprimer la pièce', message: lines.join('\n\n'), dangerous: true }) if (!confirmed) return await deletePiece(piece.id) fetchPieces()