| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /**
- * 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')
|