优化
This commit is contained in:
+124
-94
@@ -241,100 +241,24 @@ describe('approved Admin density ownership', () => {
|
||||
expect(style.content).not.toMatch(/inner-wrapper::before\s*\{[^}]*display:\s*none/)
|
||||
})
|
||||
|
||||
it('uses the shared compact metric cards for finance statistics and settlement totals', () => {
|
||||
expect(read('modules/finance/pages/FinanceReceivableStatisticsView.vue')).toContain('spacing="compact"')
|
||||
expect(read('modules/finance/pages/FinanceFormalSettlementPage.vue')).toContain(':spacing="detailMode ? \'normal\' : \'compact\'"')
|
||||
const financeStyles = read('modules/finance/financeDensity.css')
|
||||
expect(financeStyles).toContain('.admin-workbench.receivable-statistics-page.admin-page.is-spacing-compact,')
|
||||
expect(financeStyles).toContain('.admin-workbench.finance-settlement-page.admin-page.is-spacing-compact { gap: 0; }')
|
||||
expect(financeStyles).not.toContain('.data-table__toolbar')
|
||||
const baseStyle = parse(read('shared/components/AdminPage.vue')).descriptor.styles[0]!
|
||||
const compiled = compileStyle({ source: baseStyle.content, filename: 'AdminPage.vue', id: 'data-v-spacing-check', scoped: true })
|
||||
expect(compiled.errors).toHaveLength(0)
|
||||
const baseSelector = compiled.code.match(/([^{}]+)\{\s*gap: 12px;/)![1]!.trim()
|
||||
const specificity = (selector: string) => (selector.match(/\.[\w-]+|\[[^\]]+\]/g) ?? []).length
|
||||
for (const page of ['receivable-statistics-page', 'finance-settlement-page']) {
|
||||
const selector = `.admin-workbench.${page}.admin-page.is-spacing-compact`
|
||||
expect(specificity(selector), 'must override scoped AdminPage even when it loads later').toBeGreaterThan(specificity(baseSelector))
|
||||
}
|
||||
for (const file of ['FinanceReceivableStatisticsView', 'FinanceFormalSettlementPage']) {
|
||||
const content = read(`modules/finance/pages/${file}.vue`)
|
||||
const summary = content.match(/<section class="finance-metric-grid"[^>]*v-loading="loading"[\s\S]*?<\/section>/)![0]
|
||||
expect(content.indexOf(summary), file).toBeLessThan(content.indexOf('<template #filters>'))
|
||||
const template = parse(content).descriptor.template!.ast!
|
||||
function visit(node: { tag?: string; loc?: { source: string }; children?: unknown[] }, insideTable = false) {
|
||||
if (node.tag === 'section' && node.loc?.source === summary) expect(insideTable, file).toBe(false)
|
||||
for (const child of node.children ?? []) visit(child as typeof node, insideTable || node.tag === 'DataTable')
|
||||
}
|
||||
visit(template)
|
||||
expect(summary.match(/workbench-metric workbench-tone is-compact/g), file).toHaveLength(3)
|
||||
expect(summary).toContain('v-loading="loading" :aria-busy="loading"')
|
||||
expect(summary).not.toContain('density-detail-overview')
|
||||
for (const tone of ['blue', 'green', 'purple']) expect(summary).toContain(`data-tone="${tone}"`)
|
||||
}
|
||||
})
|
||||
it('keeps finance detail tables on one continuous surface', () => {
|
||||
const statements = read('modules/finance/pages/FinanceCustomerStatementsView.vue')
|
||||
const arap = read('modules/finance/pages/FinanceCustomerArapView.vue')
|
||||
expect(statements).not.toContain('<el-tabs')
|
||||
expect(statements).toContain('title="账单明细表"')
|
||||
expect(statements).toContain('title="账单支付历史表"')
|
||||
expect(statements.match(/class="detail-table-scroll workbench-table is-page-surface"/g)).toHaveLength(2)
|
||||
expect(statements).not.toContain('title="账单明细"')
|
||||
expect(statements).not.toContain('title="支付历史"')
|
||||
expect(arap).toContain('<div class="workbench-table is-page-surface"><DataTable :data="operationLogRows"')
|
||||
const css = read('modules/finance/financeDensity.css')
|
||||
expect(css).toContain('.finance-density-detail > .detail-page-layout__content .density-form-section')
|
||||
expect(css).toContain('padding-block: 0;')
|
||||
const accounts = read('modules/finance/pages/FinanceCustomerAccountsView.vue')
|
||||
expect(accounts).not.toContain(':deep(.detail-page-layout__content)')
|
||||
})
|
||||
it('keeps finance detail insets on the outer page without stripping card or cell padding', () => {
|
||||
for (const [file, className] of [['FinanceCustomerAccountsView', 'finance-account-detail'], ['FinanceCustomerArapView', 'finance-arap-detail']]) {
|
||||
expect(read(`modules/finance/pages/${file}.vue`)).toContain(`class="${className} admin-density admin-workbench is-embedded"`)
|
||||
}
|
||||
const css = read('modules/finance/financeDensity.css')
|
||||
const rule = css.slice(css.indexOf('/* The outer AdminPage owns'))
|
||||
expect(rule).toContain('@media screen')
|
||||
expect(rule).toContain('padding-inline: 0;')
|
||||
expect(rule).toContain('.detail-page-layout__content > .settlement-detail-content')
|
||||
expect(rule).toContain(':is(.density-detail-overview, .statement-summary-section)')
|
||||
for (const protectedClass of ['workbench-metric', 'el-descriptions__cell', 'query-toolbar', 'el-table']) expect(rule).not.toContain(protectedClass)
|
||||
const accountStyles = parse(read('modules/finance/pages/FinanceCustomerAccountsView.vue')).descriptor.styles[0]!.content
|
||||
expect(accountStyles.match(/\.account-metrics \{([^}]+)\}/)![1]).not.toMatch(/padding:|padding-inline:|padding-left:|padding-right:/)
|
||||
})
|
||||
it('keeps account detail filters in the shared table layout and long identifiers readable', () => {
|
||||
const content = read('modules/finance/pages/FinanceCustomerAccountsView.vue')
|
||||
const header = content.split('<template #header>')[1]!.split('</template>')[0]!
|
||||
expect(header).toContain('@click="exportLedger"')
|
||||
expect(header).toContain('v-if="canExport"')
|
||||
expect(header).toContain(':loading="ledgerExportBusy"')
|
||||
const ledgerSection = content.split('class="ledger-section density-form-section"')[1]!.split('</FormSection>')[0]!
|
||||
expect(ledgerSection).not.toContain('#toolbar-actions')
|
||||
expect(ledgerSection).toContain('class="detail-table-scroll workbench-table is-page-surface"')
|
||||
expect(ledgerSection).toContain('class="ledger-table" appearance="integrated"')
|
||||
const rechargeSection = content.split('class="recharge-section density-form-section"')[1]!.split('</FormSection>')[0]!
|
||||
expect(rechargeSection).toContain('class="detail-table-scroll workbench-table is-page-surface"')
|
||||
expect(content.match(/account-metric workbench-metric workbench-tone is-compact/g)).toHaveLength(6)
|
||||
expect(content).toContain('creditExpiryLabel(selected)')
|
||||
expect(content).toContain("'is-negative': Number(selected.actualBalance) < 0")
|
||||
expect(content).toContain('<template #filters><QueryToolbar v-model="ledgerFilters"')
|
||||
expect(content).not.toContain(':deep(.ledger-query.query-toolbar)')
|
||||
expect(content).toContain('class="density-descriptions account-profile"')
|
||||
const styles = parse(content).descriptor.styles.map(style => style.content).join('\n')
|
||||
expect(styles).not.toContain('text-overflow: ellipsis')
|
||||
expect(styles).toContain('overflow-wrap: anywhere')
|
||||
})
|
||||
it('keeps pallet overview spacing and metric appearance owned by shared primitives', () => {
|
||||
it('keeps pallet and container overview 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(css, file).toContain('.admin-workbench.pallet-page.admin-page.is-spacing-compact { gap: 0; }')
|
||||
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.{]/)
|
||||
}
|
||||
const containerPage = parse(read('modules/domestic-containers/pages/DomesticContainersView.vue')).descriptor
|
||||
const containerStyles = containerPage.styles.map(style => style.content).join('\n')
|
||||
+ read('modules/domestic-containers/pages/domesticContainersSummary.css')
|
||||
expect(containerPage.template!.content).toMatch(/<AdminPage\b[^>]*spacing="compact"/)
|
||||
expect(containerStyles).toContain('.admin-workbench.domestic-containers-page.admin-page.is-spacing-compact { gap: 0; }')
|
||||
expect(containerPage.template!.content).toContain('workbench-metric workbench-tone is-compact')
|
||||
expect(containerStyles).not.toMatch(/\.inventory-summary\s*(?:>|\s)\s*(?:article|div|span|strong)\b/)
|
||||
expect(containerStyles).not.toMatch(/\.workbench-metric[\s.{]/)
|
||||
})
|
||||
|
||||
it('lets local transport editors fill the workspace and keeps form density in shared primitives', () => {
|
||||
@@ -691,6 +615,8 @@ describe('approved Admin density ownership', () => {
|
||||
|
||||
it('keeps dashboard visualizations outside detail-field table styling', () => {
|
||||
const dashboard = read('modules/dashboard/pages/DashboardView.vue')
|
||||
expect(dashboard).toContain('<AdminPage as="div" spacing="compact" class="admin-density admin-workbench">')
|
||||
expect(dashboard).toContain('.dashboard-view > .admin-page.is-spacing-compact { gap: var(--admin-space-2); }')
|
||||
const metrics = elementsOf(dashboard, 'div').filter(node => classesOf(node).includes('dashboard-metrics'))
|
||||
expect(metrics).toHaveLength(1)
|
||||
const cards = elementsOf(dashboard, 'article').filter(node => classesOf(node).includes('dashboard-metric'))
|
||||
@@ -780,10 +706,13 @@ describe('approved Admin density ownership', () => {
|
||||
|
||||
it('keeps warehouse editors and import results on shared sections and cell editors', () => {
|
||||
const source = read('modules/warehouses/pages/WarehousesView.vue')
|
||||
expect(source).toContain('class="density-form density-dialog-sections"')
|
||||
expect(source).toContain('class="density-form density-form--outlined density-dialog-sections"')
|
||||
expect(source).toContain('density-table density-table--editable warehouse-editor-table')
|
||||
const importer = expectWorkbenchDialogs(source).find(node => classesOf(node).includes('warehouse-import-dialog'))
|
||||
expect(importer).toBeDefined()
|
||||
const editor = expectWorkbenchDialogs(source).find(node => classesOf(node).includes('warehouse-editor-dialog'))
|
||||
expect(editor).toBeDefined()
|
||||
expect(editor!.loc.source).not.toContain('data-tone=')
|
||||
expect(source).toContain('class="density-table warehouse-import-summary"')
|
||||
expect(source).toContain('class="density-actions density-actions--footer"')
|
||||
expect(source).not.toContain('<FormSection')
|
||||
@@ -824,26 +753,30 @@ describe('approved Admin density ownership', () => {
|
||||
expect(css).toContain(':not(.is-fullscreen)')
|
||||
})
|
||||
|
||||
it('opts fee item editing into drawer sections and existing cell editors without changing other drawers', () => {
|
||||
it('opts fee item editing into white dialog sections and existing cell editors', () => {
|
||||
const source = read('modules/fee-items/pages/FeeItemsView.vue')
|
||||
const ast = parse(source).descriptor.template!.ast!
|
||||
let editorFound = false
|
||||
const visit = (nodes: typeof ast.children, inEditor = false) => { for (const node of nodes) {
|
||||
if (node.type !== 1) continue
|
||||
const inside = inEditor || node.tag === 'AppDrawer' && classesOf(node).includes('admin-density-drawer--editor')
|
||||
if (node.tag === 'AppDrawer') {
|
||||
const inside = inEditor || node.tag === 'AppDialog' && classesOf(node).includes('fee-item-editor')
|
||||
if (node.tag === 'AppDialog' && classesOf(node).includes('fee-item-editor')) {
|
||||
editorFound = true
|
||||
for (const name of ['admin-density', 'admin-density-drawer', 'admin-density-drawer--editor']) expect(classesOf(node)).toContain(name)
|
||||
for (const name of ['admin-density-dialog', 'fee-item-editor']) expect(classesOf(node)).toContain(name)
|
||||
}
|
||||
if (classesOf(node).some(name => ['density-dialog-section', 'density-table--editable'].includes(name))) expect(inside).toBe(true)
|
||||
visit(node.children, inside)
|
||||
} }
|
||||
visit(ast.children)
|
||||
expect(editorFound).toBe(true)
|
||||
expect(source).not.toMatch(/density-dialog-section[^>]*data-tone=/)
|
||||
expect(source).not.toContain('AppDrawer')
|
||||
expect(source).toContain('class="density-form density-form--outlined density-dialog-sections"')
|
||||
expect(source).toContain('label="默认价格(CNY)" label-width="120px"')
|
||||
expect(source).not.toContain('<FormSection')
|
||||
expect(source).not.toContain('label-position="top"')
|
||||
expect(source).toContain('class="density-actions density-actions--footer"')
|
||||
expect(source).toContain('size="min(620px, 94vw)"')
|
||||
expect(source).toContain('width="min(760px, 94vw)" align-center')
|
||||
expect(shared).toContain(':where(.admin-density-drawer--detail, .admin-density-drawer--editor)')
|
||||
const css = parse(source).descriptor.styles.map(style => style.content).join('')
|
||||
expect(css).not.toContain('direction-grid')
|
||||
@@ -864,6 +797,14 @@ describe('approved Admin density ownership', () => {
|
||||
expect(css).not.toMatch(/\.task-(?:detail-summary|failure)\b|\.detail-load-error\b/)
|
||||
})
|
||||
|
||||
it('uses compact pallet-style cards above the customer visit list', () => {
|
||||
const source = read('modules/overseas-warehouse/pages/CustomerVisitsView.vue')
|
||||
expect(source.match(/class="workbench-metric workbench-tone is-compact"/g)).toHaveLength(3)
|
||||
expect(source.indexOf('aria-label="回访统计"')).toBeLessThan(source.indexOf('<ListPageLayout'))
|
||||
expect(source).not.toContain('visit-summary density-detail-overview')
|
||||
expect(source).toContain('.admin-workbench.customer-visits-page.admin-page.is-spacing-compact { gap: 0; }')
|
||||
for (const field of ['visitable', 'pending', 'completed']) expect(source).toContain('summary.' + field + ".toLocaleString('zh-CN')")
|
||||
})
|
||||
it('keeps ship price book upload compact with shared table and confirmation styles', () => {
|
||||
const list = read('modules/fba-pricing/carrier-rates/pages/CarrierRatesView.vue')
|
||||
const detail = read('modules/fba-pricing/carrier-rates/pages/CarrierRateDetailView.vue')
|
||||
@@ -887,7 +828,7 @@ describe('approved Admin density ownership', () => {
|
||||
expect(dialog!.props.some(prop => prop.type === 6 && prop.name === 'fullscreenable')).toBe(true)
|
||||
expect(dialog!.props.some(prop => prop.type === 7 && prop.name === 'bind' && prop.arg?.type === 4 && prop.arg.content === 'confirm-loading' && prop.exp?.type === 4 && prop.exp.content === 'saving')).toBe(true)
|
||||
expect(source).toContain('density-table--editable')
|
||||
expect(source).toContain('data-tone="work"')
|
||||
if (source === importer) expect(source).toContain('data-tone="work"')
|
||||
expect(source).toContain('data-tone="source"')
|
||||
expect(source).toContain('class="density-actions density-actions--footer"')
|
||||
expect(source).not.toContain('label-position="top"')
|
||||
@@ -895,6 +836,9 @@ describe('approved Admin density ownership', () => {
|
||||
expect(css).not.toMatch(/font-size|background|border|el-dialog__body|max-height/)
|
||||
}
|
||||
expect(editor).toContain('v-if="readonly"')
|
||||
expect(editor).not.toContain('data-tone="work"')
|
||||
expect(editor).toContain('class="density-form density-form--outlined density-dialog-sections"')
|
||||
expect(read('modules/overseas-master-data/pages/FleetQuotesView.vue')).toContain('<RowActions text-actions')
|
||||
expect(editor).toContain('class="density-fields fleet-quote-facts"')
|
||||
const confirmations = confirmationClasses(read('modules/overseas-master-data/pages/FleetQuotesView.vue'))
|
||||
expect(confirmations.length).toBeGreaterThan(0)
|
||||
@@ -903,6 +847,7 @@ describe('approved Admin density ownership', () => {
|
||||
|
||||
it('keeps pricing dialogs on shared tables and sections without local form paint', () => {
|
||||
const rate = read('modules/overseas-master-data/pages/ExchangeRatesView.vue')
|
||||
expect(rate).toContain('class="density-form density-form--outlined"')
|
||||
const quote = read('modules/overseas-master-data/pages/OverseasQuotesView.vue')
|
||||
for (const source of [rate, quote]) {
|
||||
const dialogs = expectWorkbenchDialogs(source)
|
||||
@@ -918,7 +863,8 @@ describe('approved Admin density ownership', () => {
|
||||
expect(quote.match(/fullscreenable/g)).toHaveLength(2)
|
||||
expect(quote).toContain('data-tone="summary"')
|
||||
expect(quote).toContain('data-tone="source"')
|
||||
expect(quote).toContain('data-tone="work"')
|
||||
expect(quote).not.toContain('data-tone="work"')
|
||||
expect(quote).toContain('class="density-form density-form--outlined density-dialog-sections"')
|
||||
const css = parse(quote).descriptor.styles.map(style => style.content).join('')
|
||||
expect(css).not.toMatch(/font-size|background|border|el-dialog__body|max-height/)
|
||||
})
|
||||
@@ -1769,6 +1715,90 @@ describe('approved Admin density ownership', () => {
|
||||
expect(popups).not.toContain('label-position="top"')
|
||||
expect(statements).not.toContain('.create-period-row')
|
||||
})
|
||||
it('uses the shared compact metric cards for finance statistics and settlement totals', () => {
|
||||
expect(read('modules/finance/pages/FinanceReceivableStatisticsView.vue')).toContain('spacing="compact"')
|
||||
expect(read('modules/finance/pages/FinanceFormalSettlementPage.vue')).toContain(':spacing="detailMode ? \'normal\' : \'compact\'"')
|
||||
const financeStyles = read('modules/finance/financeDensity.css')
|
||||
expect(financeStyles).toContain('.admin-workbench.receivable-statistics-page.admin-page.is-spacing-compact,')
|
||||
expect(financeStyles).toContain('.admin-workbench.finance-settlement-page.admin-page.is-spacing-compact { gap: 0; }')
|
||||
expect(financeStyles).not.toContain('.data-table__toolbar')
|
||||
const baseStyle = parse(read('shared/components/AdminPage.vue')).descriptor.styles[0]!
|
||||
const compiled = compileStyle({ source: baseStyle.content, filename: 'AdminPage.vue', id: 'data-v-spacing-check', scoped: true })
|
||||
expect(compiled.errors).toHaveLength(0)
|
||||
const baseSelector = compiled.code.match(/([^{}]+)\{\s*gap: 12px;/)![1]!.trim()
|
||||
const specificity = (selector: string) => (selector.match(/\.[\w-]+|\[[^\]]+\]/g) ?? []).length
|
||||
for (const page of ['receivable-statistics-page', 'finance-settlement-page']) {
|
||||
const selector = `.admin-workbench.${page}.admin-page.is-spacing-compact`
|
||||
expect(specificity(selector), 'must override scoped AdminPage even when it loads later').toBeGreaterThan(specificity(baseSelector))
|
||||
}
|
||||
for (const file of ['FinanceReceivableStatisticsView', 'FinanceFormalSettlementPage']) {
|
||||
const content = read(`modules/finance/pages/${file}.vue`)
|
||||
const summary = content.match(/<section class="finance-metric-grid"[^>]*v-loading="loading"[\s\S]*?<\/section>/)![0]
|
||||
expect(content.indexOf(summary), file).toBeLessThan(content.indexOf('<template #filters>'))
|
||||
const template = parse(content).descriptor.template!.ast!
|
||||
function visit(node: { tag?: string; loc?: { source: string }; children?: unknown[] }, insideTable = false) {
|
||||
if (node.tag === 'section' && node.loc?.source === summary) expect(insideTable, file).toBe(false)
|
||||
for (const child of node.children ?? []) visit(child as typeof node, insideTable || node.tag === 'DataTable')
|
||||
}
|
||||
visit(template)
|
||||
expect(summary.match(/workbench-metric workbench-tone is-compact/g), file).toHaveLength(3)
|
||||
expect(summary).toContain('v-loading="loading" :aria-busy="loading"')
|
||||
expect(summary).not.toContain('density-detail-overview')
|
||||
for (const tone of ['blue', 'green', 'purple']) expect(summary).toContain(`data-tone="${tone}"`)
|
||||
}
|
||||
})
|
||||
it('keeps finance detail tables on one continuous surface', () => {
|
||||
const statements = read('modules/finance/pages/FinanceCustomerStatementsView.vue')
|
||||
const arap = read('modules/finance/pages/FinanceCustomerArapView.vue')
|
||||
expect(statements).not.toContain('<el-tabs')
|
||||
expect(statements).toContain('title="账单明细表"')
|
||||
expect(statements).toContain('title="账单支付历史表"')
|
||||
expect(statements.match(/class="detail-table-scroll workbench-table is-page-surface"/g)).toHaveLength(2)
|
||||
expect(statements).not.toContain('title="账单明细"')
|
||||
expect(statements).not.toContain('title="支付历史"')
|
||||
expect(arap).toContain('<div class="workbench-table is-page-surface"><DataTable :data="operationLogRows"')
|
||||
const css = read('modules/finance/financeDensity.css')
|
||||
expect(css).toContain('.finance-density-detail > .detail-page-layout__content .density-form-section')
|
||||
expect(css).toContain('padding-block: 0;')
|
||||
const accounts = read('modules/finance/pages/FinanceCustomerAccountsView.vue')
|
||||
expect(accounts).not.toContain(':deep(.detail-page-layout__content)')
|
||||
})
|
||||
it('keeps finance detail insets on the outer page without stripping card or cell padding', () => {
|
||||
for (const [file, className] of [['FinanceCustomerAccountsView', 'finance-account-detail'], ['FinanceCustomerArapView', 'finance-arap-detail']]) {
|
||||
expect(read(`modules/finance/pages/${file}.vue`)).toContain(`class="${className} admin-density admin-workbench is-embedded"`)
|
||||
}
|
||||
const css = read('modules/finance/financeDensity.css')
|
||||
const rule = css.slice(css.indexOf('/* The outer AdminPage owns'))
|
||||
expect(rule).toContain('@media screen')
|
||||
expect(rule).toContain('padding-inline: 0;')
|
||||
expect(rule).toContain('.detail-page-layout__content > .settlement-detail-content')
|
||||
expect(rule).toContain(':is(.density-detail-overview, .statement-summary-section)')
|
||||
for (const protectedClass of ['workbench-metric', 'el-descriptions__cell', 'query-toolbar', 'el-table']) expect(rule).not.toContain(protectedClass)
|
||||
const accountStyles = parse(read('modules/finance/pages/FinanceCustomerAccountsView.vue')).descriptor.styles[0]!.content
|
||||
expect(accountStyles.match(/\.account-metrics \{([^}]+)\}/)![1]).not.toMatch(/padding:|padding-inline:|padding-left:|padding-right:/)
|
||||
})
|
||||
it('keeps account detail filters in the shared table layout and long identifiers readable', () => {
|
||||
const content = read('modules/finance/pages/FinanceCustomerAccountsView.vue')
|
||||
const header = content.split('<template #header>')[1]!.split('</template>')[0]!
|
||||
expect(header).toContain('@click="exportLedger"')
|
||||
expect(header).toContain('v-if="canExport"')
|
||||
expect(header).toContain(':loading="ledgerExportBusy"')
|
||||
const ledgerSection = content.split('class="ledger-section density-form-section"')[1]!.split('</FormSection>')[0]!
|
||||
expect(ledgerSection).not.toContain('#toolbar-actions')
|
||||
expect(ledgerSection).toContain('class="detail-table-scroll workbench-table is-page-surface"')
|
||||
expect(ledgerSection).toContain('class="ledger-table" appearance="integrated"')
|
||||
const rechargeSection = content.split('class="recharge-section density-form-section"')[1]!.split('</FormSection>')[0]!
|
||||
expect(rechargeSection).toContain('class="detail-table-scroll workbench-table is-page-surface"')
|
||||
expect(content.match(/account-metric workbench-metric workbench-tone is-compact/g)).toHaveLength(6)
|
||||
expect(content).toContain('creditExpiryLabel(selected)')
|
||||
expect(content).toContain("'is-negative': Number(selected.actualBalance) < 0")
|
||||
expect(content).toContain('<template #filters><QueryToolbar v-model="ledgerFilters"')
|
||||
expect(content).not.toContain(':deep(.ledger-query.query-toolbar)')
|
||||
expect(content).toContain('class="density-descriptions account-profile"')
|
||||
const styles = parse(content).descriptor.styles.map(style => style.content).join('\n')
|
||||
expect(styles).not.toContain('text-overflow: ellipsis')
|
||||
expect(styles).toContain('overflow-wrap: anywhere')
|
||||
})
|
||||
it('keeps wallet dialogs compact while preserving financial warnings and preview space', () => {
|
||||
const content = read('modules/finance/pages/FinanceCustomerAccountsView.vue')
|
||||
const popups = content.slice(content.indexOf('<AppDialog'))
|
||||
|
||||
Reference in New Issue
Block a user