/** * Mirrors web-admin/src/utils/mp-pl-plan-detail-actions.ts (no vitest in web-admin). */ function splitMpPlanDetailActions(input) { const primary = [] const more = [] if (input.canEdit) primary.push({ kind: 'edit', label: '编辑' }) if (input.canArrange) { primary.push({ kind: 'arrange', label: input.arrangeLabel }) } if (input.canCopyDriver) more.push({ kind: 'copy-driver', label: '复制给司机' }) if (input.canCopySite) more.push({ kind: 'copy-site', label: '复制给现场' }) if (input.canCopyPoundQrcode) more.push({ kind: 'copy-pound-qrcode', label: '复制磅单二维码' }) more.push({ kind: 'copy', label: '复制' }) if (input.canWait) more.push({ kind: 'wait', label: '等客户通知' }) if (input.canCancelWait) more.push({ kind: 'cancel-wait', label: '取消等通知' }) if (input.canVoid) more.push({ kind: 'void', label: '作废', danger: true }) while (primary.length > 2) more.unshift(primary.pop()) if (primary.length === 0) { const preferKinds = ['copy', 'wait', 'cancel-wait', 'void'] for (const kind of preferKinds) { if (primary.length >= 2) break const idx = more.findIndex((a) => a.kind === kind) if (idx < 0) continue primary.push(more.splice(idx, 1)[0]) } while (primary.length < 2 && more.length) { primary.push(more.shift()) } } return { primary, more } } function splitMpPlanFormFooterActions(input) { const more = [{ key: 'cancel', label: '取消' }] const primary = [] const hasStrongPrimary = input.showSaveAndArrange || input.showRearrange if (input.showDraft) primary.push({ key: 'draft', label: '暂存' }) if (input.showSave) { primary.push({ key: 'save', label: input.saveLabel, type: hasStrongPrimary ? 'default' : 'primary', ghost: hasStrongPrimary }) } if (input.showRearrange) { primary.push({ key: 'rearrange', label: '调整运输', type: 'primary' }) } else if (input.showSaveAndArrange) { primary.push({ key: 'saveAndArrange', label: input.saveAndArrangeLabel, type: 'primary' }) } while (primary.length > 3) { const overflow = primary.pop() more.splice(1, 0, overflow) } if (primary.length === 0 && more.length > 1) { const first = more.find((a) => a.key !== 'cancel') || more[0] if (first) { more.splice(more.indexOf(first), 1) primary.push({ ...first, type: first.type || 'primary' }) } } return { primary, more } } function assert(cond, msg) { if (!cond) { console.error('FAIL:', msg) process.exit(1) } } const both = splitMpPlanDetailActions({ canEdit: true, canArrange: true, arrangeLabel: '安排运输', canWait: true, canCancelWait: false, canVoid: true }) assert( both.primary.map((a) => a.kind).join(',') === 'edit,arrange', 'primary should be edit,arrange' ) assert( both.more.map((a) => a.kind).join(',') === 'copy,wait,void', 'more should be copy,wait,void' ) const withArrangeCopy = splitMpPlanDetailActions({ canEdit: true, canArrange: true, arrangeLabel: '调整运输', canCopyDriver: true, canCopySite: true, canCopyPoundQrcode: true, canWait: false, canCancelWait: false, canVoid: true }) assert( withArrangeCopy.more.map((a) => a.kind).join(',') === 'copy-driver,copy-site,copy-pound-qrcode,copy,void', 'arrange copy actions go first in more' ) const onlyEdit = splitMpPlanDetailActions({ canEdit: true, canArrange: false, arrangeLabel: '安排运输', canWait: true, canCancelWait: false, canVoid: true }) assert(onlyEdit.primary.map((a) => a.kind).join(',') === 'edit', 'only edit stays primary') assert( onlyEdit.more.map((a) => a.kind).join(',') === 'copy,wait,void', 'rest stay in more when primary already has items' ) const onlyVoid = splitMpPlanDetailActions({ canEdit: false, canArrange: false, arrangeLabel: '安排运输', canWait: false, canCancelWait: false, canVoid: true }) assert(onlyVoid.primary.length === 2, 'promote more into primary only when empty') assert(onlyVoid.primary[0].kind === 'copy', 'first promoted is copy') assert(onlyVoid.primary[1].kind === 'void', 'second promoted is void') assert(onlyVoid.more.map((a) => a.kind).join(',') === '', 'more empty after promote') const onlyArrangeCopy = splitMpPlanDetailActions({ canEdit: false, canArrange: false, arrangeLabel: '安排运输', canCopyDriver: true, canCopySite: false, canCopyPoundQrcode: false, canWait: false, canCancelWait: false, canVoid: false }) assert( onlyArrangeCopy.primary.map((a) => a.kind).join(',') === 'copy,copy-driver', 'prefer copy over arrange-copy when promoting' ) assert( onlyArrangeCopy.more.map((a) => a.kind).join(',') === '', 'more empty after promote with only copy actions' ) const formNew = splitMpPlanFormFooterActions({ showDraft: true, showSave: true, showSaveAndArrange: true, showRearrange: false, saveLabel: '创建', saveAndArrangeLabel: '创建并安排运输' }) assert( formNew.primary.map((a) => a.key).join(',') === 'draft,save,saveAndArrange', 'form primary shows draft,save,saveAndArrange' ) assert(formNew.more.map((a) => a.key).join(',') === 'cancel', 'form more only cancel') console.log('check-mp-pl-plan-detail-actions: ok')