/** * 二次确认模型(module 13 task 245):文案/按钮键规则对齐 admin-interactions.js —— * 优先显式 message,否则由行名拼接「确认删除“X”吗?此操作可能影响已有数据。」; * danger(删除/清空/删除导入类)默认标题「删除前确认」、确认键「确认删除」。 * 纯逻辑、无 UI 依赖,便于单测;打开入口见 admin-confirm.ts / AdminConfirm.vue。 */ export const ADMIN_CONFIRM = { dangerTitle: '删除前确认', defaultTitle: '请确认操作', confirmDeleteOk: '确认删除', confirmOk: '确认操作', cancel: '取消', deleteMessageSuffix: '此操作可能影响已有数据。', } as const export interface AdminConfirmPlan { danger: boolean title: string message: string confirmText: string cancelText: string type: 'warning' | 'info' } /** 由目标名称生成删除确认文案;无名称时退化为「该项」。 */ export function confirmMessageFor(targetName?: string): string { const name = typeof targetName === 'string' && targetName.trim() ? `“${targetName.trim()}”` : '该项' return `确认删除${name}吗?${ADMIN_CONFIRM.deleteMessageSuffix}` } export interface AdminConfirmOptions { danger?: boolean targetName?: string message?: string title?: string confirmText?: string } /** 归一出二次确认计划:显式字段优先,否则按 danger/目标名落默认值。 */ export function createConfirmPlan(opts: AdminConfirmOptions): AdminConfirmPlan { const danger = opts.danger !== false const message = opts.message && opts.message.trim() ? opts.message.trim() : confirmMessageFor(opts.targetName) return { danger, title: opts.title ?? (danger ? ADMIN_CONFIRM.dangerTitle : ADMIN_CONFIRM.defaultTitle), message, confirmText: opts.confirmText ?? (danger ? ADMIN_CONFIRM.confirmDeleteOk : ADMIN_CONFIRM.confirmOk), cancelText: ADMIN_CONFIRM.cancel, type: danger ? 'warning' : 'info', } } // 并发防护:同一时刻只允许一个确认框在途(拒绝重复弹出)。 let confirmLocked = false export function acquireConfirmLock(): boolean { if (confirmLocked) return false confirmLocked = true return true } export function releaseConfirmLock(): void { confirmLocked = false } export function isConfirmLocked(): boolean { return confirmLocked }