align(全局+asin): 每面板操作提示条(guides对齐旧版admin-interactions.js原文);asin域行内按钮统一实心small(对齐.btn-sm);商品类目树折叠钮靛蓝#6366f1改蓝白token

This commit is contained in:
2026-09-06 21:38:16 +08:00
parent 26e062d32c
commit 4742a2e3b5
10 changed files with 315 additions and 13 deletions
@@ -0,0 +1,60 @@
import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
/** 对齐旧版 .btn-sm:asin 域 5 页表格行内操作(编辑/删除/配置)统一为实心小按钮(type primary/danger + size small),不再用 link/text;类目树折叠钮由靛蓝改为蓝白 token。 */
// 实心小按钮:同一 el-button 内同时含 size="small" 与 @click="<action>",且不含 link/text 修饰。
const SOLID_ACTION = (action: string) => new RegExp(`<el-button[^>]*size="small"[^>]*@click="${action}`)
const NO_MODIFIER = (action: string, mod: 'link' | 'text') =>
new RegExp(`<el-button[^>]*${mod}[^>]*@click="${action}`)
function assertRowButtonSolid(source: string, action: string) {
assert.match(source, SOLID_ACTION(action), `${action} 为 size=small 实心按钮`)
assert.doesNotMatch(source, NO_MODIFIER(action, 'link'), `${action} 不再 link`)
assert.doesNotMatch(source, NO_MODIFIER(action, 'text'), `${action} 不再 text`)
}
test('align_dedupe_registry_row_buttons_solid', () => {
const s = readSource('src/pages/asin/DedupeRegistryPage.vue')
assertRowButtonSolid(s, 'openEdit')
assertRowButtonSolid(s, 'removeRow')
})
test('align_invalid_asin_row_buttons_solid', () => {
const s = readSource('src/pages/asin/AsinInvalidPage.vue')
assertRowButtonSolid(s, 'openEdit')
assertRowButtonSolid(s, 'remove')
})
test('align_query_asin_config_solid', () => {
assertRowButtonSolid(readSource('src/pages/asin/QueryAsinPage.vue'), 'openConfig')
})
test('align_skip_price_config_solid', () => {
assertRowButtonSolid(readSource('src/pages/asin/SkipPricePage.vue'), 'openConfig')
})
test('align_product_category_tree_row_buttons_solid', () => {
const s = readSource('src/pages/asin/ProductCategoryPage.vue')
assertRowButtonSolid(s, 'openEdit')
assertRowButtonSolid(s, 'removeCategory')
})
test('align_product_category_no_indigo_left', () => {
const s = readSource('src/pages/asin/ProductCategoryPage.vue')
assert.doesNotMatch(s, /#6366f1|#eef0fe|6366f1|eef0fe/, '靛蓝色点已清')
assert.match(s, /--admin-primary-soft/, '折叠钮改用蓝白主色 soft token')
})
test('align_product_category_search_and_tree_edits_both_solid', () => {
const s = readSource('src/pages/asin/ProductCategoryPage.vue')
const opens = s.match(/<el-button[^>]*size="small"[^>]*@click="openEdit/g) || []
assert.ok(opens.length >= 2, `树/搜索两处编辑均实心(${opens.length}`)
})
test('align_product_category_load_more_kept_link', () => {
// 类目"加载更多"是非行内操作的树加载行,保留 link 不误伤。
const s = readSource('src/pages/asin/ProductCategoryPage.vue')
assert.match(s, /link size="small" type="primary"[^>]*loadMoreChildren/, '加载更多保留 link')
})
@@ -0,0 +1,73 @@
import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
import { adminPages } from '../src/router/routes.ts'
import {
OPERATION_GUIDES,
OPERATION_GUIDE_FALLBACK,
OPERATION_GUIDE_STORAGE_KEY,
operationGuideFor,
} from '../src/layout/operation-guides.ts'
/** 对齐旧版 admin-interactions.js guides 表:每业务菜单页顶部展示可折叠「当前页面操作提示」,文案沿用旧版原文;店铺撞款监控(例外)不展示。 */
const EXCEPTED_KEY = 'admin_shop_data_duplicate_check'
test('align_guide_users_matches_reference_text', () => {
const g = operationGuideFor('admin_users')
assert.ok(g)
assert.equal(g.text, '先用筛选定位账号,再编辑角色和菜单权限;删除账号会要求二次确认。')
assert.deepEqual(g.steps, ['筛选账号', '编辑权限', '确认保存'])
})
test('align_guide_history_and_version_reference_text', () => {
assert.match(operationGuideFor('admin_history')!.text, /生成记录可按用户和时间范围回溯/)
assert.deepEqual(operationGuideFor('admin_version')!.steps, ['上传压缩包', '检查版本记录', '维护历史版本'])
})
test('align_guide_group_manage_falls_back', () => {
// 旧版 group-manage 无独立 guide,用通用 fallback。
assert.deepEqual(operationGuideFor('admin_group_manage'), OPERATION_GUIDE_FALLBACK)
})
test('align_guide_duplicate_check_not_present', () => {
// 例外页:不展示提示条(不参与本轮对齐)。
assert.equal(operationGuideFor(EXCEPTED_KEY), null)
assert.equal(EXCEPTED_KEY in OPERATION_GUIDES, false)
})
test('align_guide_unknown_key_null', () => {
assert.equal(operationGuideFor(undefined), null)
assert.equal(operationGuideFor(null), null)
assert.equal(operationGuideFor('not-a-menu'), null)
assert.equal(operationGuideFor(''), null)
})
test('align_guide_every_router_page_has_guide_except_duplicate_check', () => {
// 路由注册表里的业务页除例外页外都应有独立/兜底提示。
const without = adminPages.filter((p) => p.menuKey !== EXCEPTED_KEY)
assert.ok(without.length >= 15, '业务页至少 15')
for (const page of without) {
assert.ok(operationGuideFor(page.menuKey), `缺少 guide: ${page.menuKey}`)
}
})
test('align_guide_storage_key_matches_legacy', () => {
assert.equal(OPERATION_GUIDE_STORAGE_KEY, 'shufuAdminGuideCollapsed')
})
test('align_guide_component_in_layout_headline', () => {
const layout = readSource('src/layout/AdminLayout.vue')
assert.match(layout, /OperationGuide/, '壳层引用 OperationGuide 组件')
const comp = readSource('src/layout/OperationGuide.vue')
assert.match(comp, /当前页面操作提示/, '标题对齐旧版 adminOperationGuide 语义')
assert.match(comp, /收起提示/, '折叠按钮文案')
assert.match(comp, /展开提示/, '展开按钮文案')
assert.match(comp, /operationGuideFor\(route\.meta\.menuKey\)/, '按菜单 key 查文案')
assert.match(comp, /OPERATION_GUIDE_STORAGE_KEY/, '折叠态读写同一 localStorage key')
})
test('align_guide_fallback_shape', () => {
assert.equal(OPERATION_GUIDE_FALLBACK.steps.length, 3)
assert.ok(OPERATION_GUIDE_FALLBACK.text.length > 10)
})