export const resolveDeleteImpact = (entity: Record): string[] => { const impacts: string[] = [] const machineLinks = Array.isArray(entity?.machineLinks) ? entity.machineLinks.length : entity?.machineLinksCount ?? 0 const documents = Array.isArray(entity?.documents) ? entity.documents.length : entity?.documentsCount ?? 0 const customFields = Array.isArray(entity?.customFieldValues) ? entity.customFieldValues.length : entity?.customFieldValuesCount ?? 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 } export const buildDeleteMessage = (entityName: string, impacts: string[]): string => { const lines = [`Voulez-vous vraiment supprimer « ${entityName} » ?`] if (impacts.length) { lines.push(`Cela supprimera également :\n• ${impacts.join('\n• ')}`) } lines.push('Cette action est irréversible.') return lines.join('\n\n') } interface UsedInMachine { id: string name: string | null site?: { id: string; name: string | null } | null } interface UsedInEntity { id: string name: string | null } export interface UsageInfo { machines?: UsedInMachine[] composants?: UsedInEntity[] pieces?: UsedInEntity[] } const formatMachineLine = (m: UsedInMachine): string => { const name = m.name?.trim() || '(sans nom)' const siteName = m.site?.name?.trim() return siteName ? `${name} (${siteName})` : name } /** * Builds a delete-confirmation message that lists the machines (and other * entities) currently using the item. The user sees exactly what will be * detached before they confirm the deletion. */ export const buildDeleteMessageWithUsage = ( entityName: string, entityLabel: string, usage: UsageInfo, ): string => { const machines = usage.machines ?? [] const composants = usage.composants ?? [] const pieces = usage.pieces ?? [] const lines = [`Voulez-vous vraiment supprimer « ${entityName} » ?`] if (machines.length > 0) { const header = machines.length === 1 ? `${entityLabel} est actuellement utilisée par 1 machine :` : `${entityLabel} est actuellement utilisée par ${machines.length} machines :` const bullets = machines.map((m) => `• ${formatMachineLine(m)}`).join('\n') lines.push(`${header}\n${bullets}\n\nLa supprimer la retirera de ${machines.length === 1 ? 'cette machine' : 'ces machines'}.`) } if (composants.length > 0) { const header = composants.length === 1 ? 'Elle est également référencée par 1 composant :' : `Elle est également référencée par ${composants.length} composants :` const bullets = composants .map((c) => `• ${c.name?.trim() || '(sans nom)'}`) .join('\n') lines.push(`${header}\n${bullets}`) } if (pieces.length > 0) { const header = pieces.length === 1 ? 'Elle est également utilisée par 1 pièce :' : `Elle est également utilisée par ${pieces.length} pièces :` const bullets = pieces .map((p) => `• ${p.name?.trim() || '(sans nom)'}`) .join('\n') lines.push(`${header}\n${bullets}`) } lines.push('Cette action est irréversible.') return lines.join('\n\n') }