This commit is contained in:
2026-10-26 13:58:52 +08:00
parent 7688f859c7
commit 6580853ad3
6 changed files with 28 additions and 15 deletions
@@ -166,7 +166,7 @@ onMounted(initialize)
</script>
<template>
<AdminPage class="admin-density admin-workbench"><OperationErrorToast :details="mutationError" />
<AdminPage spacing="compact" class="pallet-page admin-density admin-workbench"><OperationErrorToast :details="mutationError" />
<section class="summary-grid" aria-label="海外托盘数量概览">
<article class="workbench-metric workbench-tone is-compact" data-tone="blue">
<div class="workbench-metric-heading"><span class="workbench-icon is-compact"><Layers aria-hidden="true" /></span><h2 class="workbench-metric-label">托盘总数</h2></div>
@@ -220,6 +220,7 @@ onMounted(initialize)
</template>
<style scoped>
.pallet-page.admin-page.is-spacing-compact { gap: var(--admin-space-3); }
.pallet-editor-table { table-layout: fixed; }
.pallet-editor-table td:not([colspan]) { width: 50%; }
@@ -111,6 +111,8 @@ describe('OrderDeclarationEditorDialog', () => {
expect(listWarehouseLogisticsChannels).toHaveBeenCalledWith('700000000000000001')
expect(wrapper.text()).toContain('国内收货仓和中转仓不可修改,如需变更请重新下单')
expect(wrapper.text()).toContain('RK-001')
expect(wrapper.get('.readonly-facts').text()).not.toContain('版本')
expect(wrapper.findComponent({ name: 'ElDescriptions' }).props('column')).toBe(3)
const volume = wrapper.findComponent({ name: 'ElInputNumber' })
expect(volume.props()).toMatchObject({ min: 0.0001, precision: 4, controls: false, modelValue: 0.625 })
volume.vm.$emit('update:modelValue', 0.875)
@@ -244,24 +244,23 @@ async function save() {
<section class="density-dialog-section" data-tone="source">
<h3 class="density-dialog-section__title">原订单资料</h3>
<el-descriptions :column="4" border class="readonly-facts density-descriptions">
<el-descriptions :column="3" border class="readonly-facts density-descriptions">
<el-descriptions-item label="入仓码">{{ detail.summary.inboundCode || '—' }}</el-descriptions-item>
<el-descriptions-item label="国内收货仓">{{ detail.summary.receivingWarehouseName || '—' }}</el-descriptions-item>
<el-descriptions-item label="目的仓/中转仓">{{ detail.summary.destinationWarehouseName || '—' }}</el-descriptions-item>
<el-descriptions-item label="版本">{{ form.expectedVersion }}</el-descriptions-item>
</el-descriptions>
</section>
<section class="density-dialog-section" data-tone="work">
<h3 class="density-dialog-section__title">订单申报资料</h3>
<el-form label-position="left" label-width="110px" class="order-fields density-form">
<el-form label-position="left" label-width="110px" class="order-fields density-form density-form--outlined">
<div class="workbench-evidence"><table class="density-table density-table--editable order-declaration-fields" aria-label="订单申报资料">
<colgroup><col style="width: 40%"><col style="width: 27%"><col style="width: 33%"></colgroup>
<tbody>
<tr>
<td><el-form-item label="渠道名称" required><el-select v-model="form.channelCode" aria-label="渠道名称" filterable clearable :loading="channelsLoading" placeholder="请选择正式渠道" @change="selectChannel"><el-option v-for="channel in channels" :key="channel.channelCode" :label="`${channel.channelName} · ${channel.channelCode}`" :value="channel.channelCode" /></el-select></el-form-item></td>
<td><el-form-item label="渠道编码"><span aria-label="渠道编码">{{ form.channelCode || '—' }}</span></el-form-item></td>
<td><el-form-item label="预估体积(m³)"><el-input-number v-model="form.estimatedVolumeCbm" :min="0.0001" :precision="4" :controls="false" aria-label="预估体积(m³)" placeholder="请输入预估体积(选填)" /></el-form-item></td>
<td><el-form-item label="预估体积(m³)"><el-input-number v-model="form.estimatedVolumeCbm" :min="0.0001" :precision="4" :controls="false" aria-label="预估体积(m³)" placeholder="选填" /></el-form-item></td>
</tr>
<tr>
<td><el-form-item label="预计到货时间"><el-date-picker v-model="form.expectedArrivalAt" type="datetime" value-format="YYYY-MM-DDTHH:mm:ss" format="YYYY-MM-DD HH:mm" aria-label="预计到货时间" clearable /></el-form-item></td>
@@ -345,7 +345,7 @@ onMounted(() => {
</script>
<template>
<AdminPage as="div" class="pallet-page admin-density admin-workbench">
<AdminPage as="div" spacing="compact" class="pallet-page admin-density admin-workbench">
<section class="summary-grid" aria-label="托盘数量概览">
<article class="workbench-metric workbench-tone is-compact" data-tone="blue">
<div class="workbench-metric-heading"><span class="workbench-icon is-compact"><Layers aria-hidden="true" /></span><h2 class="workbench-metric-label">托盘总数</h2></div>
@@ -487,7 +487,8 @@ onMounted(() => {
</template>
<style scoped>
.pallet-page { display: grid; min-width: 0; gap: var(--admin-space-6, 16px); }
.pallet-page { display: grid; min-width: 0; }
.pallet-page.admin-page.is-spacing-compact { gap: var(--admin-space-3); }
.summary-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--workbench-grid-gap); }
.table-panel { min-width: 0; }
.context-empty { padding: var(--admin-space-6, 16px); color: var(--workbench-muted); text-align: center; }
+3
View File
@@ -285,6 +285,9 @@
--el-input-hover-border-color: var(--el-color-primary);
--el-input-bg-color: var(--admin-surface);
}
:is(.admin-density, .admin-density-dialog) .density-form--outlined {
--el-border-radius-base: var(--cc-radius-lg);
}
:is(.admin-density, .admin-density-dialog) .density-form--outlined :is(.el-input, .el-textarea) {
--el-input-border-color: var(--el-border-color);
--el-input-hover-border-color: var(--el-border-color-hover);
+15 -8
View File
@@ -219,12 +219,16 @@ const cssRoot = (css: string) => {
}
describe('approved Admin density ownership', () => {
it('keeps domestic pallet metric appearance owned by shared workbench styles', () => {
const page = parse(read('modules/warehouse-resources/pallets/pages/PalletsView.vue')).descriptor
const css = page.styles.map(style => style.content).join('\n')
expect(page.template!.content).toContain('workbench-metric workbench-tone is-compact')
expect(css).not.toMatch(/\.summary-grid\s+(?:article|span|strong|\.idle|\.occupied)\b/)
expect(css).not.toMatch(/\.workbench-metric[\s.{]/)
it('keeps pallet overview spacing and metric appearance owned by shared primitives', () => {
for (const file of ['warehouse-resources/pallets/pages/PalletsView.vue', 'overseas-warehouse/pages/PalletsView.vue']) {
const page = parse(read(`modules/${file}`)).descriptor
const css = page.styles.map(style => style.content).join('\n')
expect(page.template!.content, file).toMatch(/<AdminPage\b[^>]*spacing="compact"/)
expect(css, file).toContain('.pallet-page.admin-page.is-spacing-compact { gap: var(--admin-space-3); }')
expect(page.template!.content, file).toContain('workbench-metric workbench-tone is-compact')
expect(css, file).not.toMatch(/\.summary-grid\s+(?:article|span|strong|\.idle|\.occupied)\b/)
expect(css, file).not.toMatch(/\.workbench-metric[\s.{]/)
}
})
it('lets local transport editors fill the workspace and keeps form density in shared primitives', () => {
@@ -308,6 +312,9 @@ describe('approved Admin density ownership', () => {
'--el-input-hover-border-color': 'var(--el-border-color-hover)',
'--el-input-bg-color': 'var(--admin-surface)',
})
expect(rules.get(':is(.admin-density, .admin-density-dialog) .density-form--outlined')).toEqual({
'--el-border-radius-base': 'var(--cc-radius-lg)',
})
const customerRules = new Map<string, Record<string, string>>()
cssRoot(read('modules/customers/customerDensity.css')).walkRules(rule => {
const values: Record<string, string> = {}
@@ -356,10 +363,10 @@ describe('approved Admin density ownership', () => {
})
}
})
it('keeps declaration order fields on the continuous cell-editor baseline', () => {
it('keeps declaration order fields outlined within the continuous cell-editor layout', () => {
const source = read('modules/unified-orders/components/OrderDeclarationEditorDialog.vue')
const orderFields = source.slice(source.indexOf('<el-form label-position="left"'), source.indexOf('</el-form>') + '</el-form>'.length)
expect(orderFields).toContain('class="order-fields density-form"')
expect(orderFields).toContain('class="order-fields density-form density-form--outlined"')
expect(orderFields).toContain('density-table density-table--editable')
expect(orderFields).not.toMatch(/<el-(?:row|col)\b/)
expect(orderFields).toContain('<span aria-label="渠道编码">')