Merge release/test and preserve pickup execution and photo workflows

This commit is contained in:
2026-10-21 17:35:43 +08:00
39 changed files with 1093 additions and 120 deletions
+2 -1
View File
@@ -33,7 +33,7 @@
.admin-density .el-empty__description { margin-top: 0; }
.admin-density .el-empty__description p { font-size: var(--admin-font-body, 13px); }
.admin-density-dialog .el-form-item__label { line-height: 22px; }
.admin-density-dialog .el-form--inline .el-form-item__label { align-items: center; }
.admin-density-dialog .el-form-item:not(.el-form-item--label-top) .el-form-item__label { align-items: center; }
:is(.admin-density, .admin-density-dialog, .admin-density-drawer) .el-table th.el-table__cell {
background: var(--cc-list-table-header-bg);
color: var(--cc-list-table-header-text);
@@ -243,6 +243,7 @@
.admin-density .density-contained-tabs > .el-tabs__content { padding: var(--admin-space-5); }
.admin-density .density-contained-tabs.density-contained-tabs--flush > .el-tabs__content { padding: 0; }
/* Explicit page descriptions share the teleported detail table scale. */
:is(.admin-density, .admin-density-dialog) .density-descriptions .el-descriptions__label.el-descriptions__cell { width: var(--admin-label-width); font-size: var(--admin-font-caption); background: var(--admin-label-bg); }
+36 -4
View File
@@ -836,7 +836,7 @@ describe('approved Admin density ownership', () => {
it('keeps contained overseas tab content and external cargo tab bodies separate', () => {
expect(shared).toContain('.density-element-tabs:not(.density-contained-tabs) > .el-tabs__content { display: none; }')
for (const file of ['LastMileOrderDetailView', 'DeliveryOrderDetailView']) {
for (const file of ['LastMileOrderDetailView', 'DeliveryOrderDetailView', 'DispatchDetailView']) {
const source = read('modules/overseas-warehouse/pages/' + file + '.vue')
const ast = parse(source).descriptor.template!.ast!
let panes = 0
@@ -855,6 +855,24 @@ describe('approved Admin density ownership', () => {
}
})
it('fits the five dispatch vehicle fields in one desktop row with read-only detail tabs', () => {
const source = read('modules/overseas-warehouse/pages/DispatchDetailView.vue')
const css = parse(source).descriptor.styles.map(style => style.content).join('\n')
const declarations = (source: string, selector: string) => {
const values: Record<string, string> = {}
cssRoot(source).walkRules(rule => {
if (rule.selector === selector && rule.parent?.type !== 'atrule') rule.walkDecls(decl => { values[decl.prop] = decl.value })
})
return values
}
expect(declarations(css, '.dispatch-detail .vehicle-fields')['grid-template-columns']).toBe('minmax(0, 1.3fr) minmax(0, 1.6fr) minmax(0, 1.2fr) minmax(0, 1.5fr) minmax(0, 0.8fr)')
expect(declarations(css, '.dispatch-detail .vehicle-fields > div')['grid-template-columns']).toBe('max-content minmax(0, 1fr)')
expect(css).not.toContain('.dispatch-actions')
expect(declarations(shared, '.admin-density .density-contained-tabs > .el-tabs__content').padding).toBe('var(--admin-space-5)')
expect(declarations(shared, '.admin-density .density-contained-tabs.density-contained-tabs--flush > .el-tabs__content').padding).toBe('0')
expect(elementsOf(source, 'el-tabs').every(node => classesOf(node).includes('density-contained-tabs--flush'))).toBe(true)
})
it('opts shared overseas detail and relationship wrappers in only at approved callers', () => {
for (const file of ['modules/overseas-warehouse/components/OverseasDetailShell.vue', 'modules/overseas-warehouse/components/OverseasReadOnlyDetail.vue', 'shared/components/InboundCodeRelationshipDialog.vue']) {
const source = read(file)
@@ -1099,7 +1117,17 @@ describe('approved Admin density ownership', () => {
cell.innerHTML = '<table class="el-table__body"><tbody><tr><td class="el-table__cell"></td></tr></tbody></table>'
expect(cell.querySelector('td')!.matches(stripeSelector)).toBe(false)
expect(rules.get('.admin-density-dialog .el-descriptions__label.el-descriptions__cell')?.background).toBe('var(--admin-label-bg)')
expect(rules.get('.admin-density-dialog .el-form--inline .el-form-item__label')?.['align-items']).toBe('center')
const horizontalLabelSelector = '.admin-density-dialog .el-form-item:not(.el-form-item--label-top) .el-form-item__label'
expect(rules.get(horizontalLabelSelector)?.['align-items']).toBe('center')
const labelFixture = document.createElement('div')
labelFixture.innerHTML = '<div class="admin-density-dialog"><form class="el-form"><div class="el-form-item el-form-item--label-left"><label class="el-form-item__label">计划送仓日期</label></div></form></div>'
const formItem = labelFixture.querySelector('.el-form-item')!
const label = labelFixture.querySelector('label')!
expect(label.matches(horizontalLabelSelector)).toBe(true)
formItem.className = 'el-form-item el-form-item--label-right'
expect(label.matches(horizontalLabelSelector)).toBe(true)
formItem.className = 'el-form-item el-form-item--label-top'
expect(label.matches(horizontalLabelSelector)).toBe(false)
expect(rules.get('.admin-density-dialog.el-dialog.admin-density-workspace > .el-dialog__body')?.flex).toBe('1 1 auto')
for (const tone of ['warning', 'purple', 'primary', 'success', 'danger']) {
expect(rules.get(`:is(.admin-density, .admin-density-dialog) .density-action[data-tone="${tone}"]`)?.['--action-hover-bg']).toBe(`var(--admin-action-${tone}-hover)`)
@@ -1302,7 +1330,8 @@ describe('approved Admin density ownership', () => {
expect(source).not.toContain('class="density-dialog-section dispatch-draft-toolbar"')
expect(source).toContain('<template #vehicle-controls>')
expect(source).toContain('class="density-form dispatch-setup-fields"')
expect(source).toContain('class="dispatch-warehouse-picker" aria-label="起运仓"')
expect(source).toContain('<el-form-item v-if="mode === \'empty\'" label="起运仓">')
expect(source).toContain('<template #order-controls>')
expect(source).not.toContain('class="dispatch-warehouse-field" label="起运仓"')
expect(source).not.toContain('data-tone="work"')
expect(source).not.toContain('data-tone="summary"')
@@ -1352,7 +1381,10 @@ describe('approved Admin density ownership', () => {
}
expect(workflow).not.toMatch(/max-height="(?:380|420)"/)
expect(evidence).toContain('class="density-table dispatch-evidence-table"')
expect(evidence).toContain('fullscreenable :loading="previewLoading"')
expect(evidence).toContain('fullscreenable :loading="previewBusy"')
expect(evidence).toContain('class="evidence-preview" :aria-busy="previewBusy"')
expect(evidence).not.toContain('aria-label="本车附件预览信息"')
expect(evidence).not.toContain('正在读取本车附件…')
expect(evidence).toContain('<LoadErrorState')
expect(evidence).toContain('<LineClampText')
for (const source of [workflow, evidence]) {