diff --git a/frontend/src/pages/catalog/TableIndex.tsx b/frontend/src/pages/catalog/TableIndex.tsx
index f4ca1415..d8e3cb71 100644
--- a/frontend/src/pages/catalog/TableIndex.tsx
+++ b/frontend/src/pages/catalog/TableIndex.tsx
@@ -12,7 +12,8 @@ import type { ListFilter, ListSort } from './model'
// ===========================================================================
// 表清单(数据目录页的左栏):搜索、按审阅进度筛选、排序、多选后批量起草。
-// 一行两层:上面是中文名和各状态的项数,下面是表名、类型、关联数和使用次数。键盘:↑↓ 在行之间移动,
+// 一行两层:上面是中文名和各状态的项数,下面是表名、类型、关联数和使用次数;还没填中文名的表上面直接写表名,
+// 下面淡淡地写「未填写中文名」——一屏几十行「未填写中文名」认不出是哪张表。键盘:↑↓ 在行之间移动,
// Home / End 到两头,Enter 打开;复选框按住 Shift 点选可以连选一段。
// ===========================================================================
@@ -224,15 +225,17 @@ const Row = memo(function Row({ row: r, index, active, checked, onToggle, onOpen
data-catalog-open-row=""
>
-
- {r.label ?? CT.noLabel}
-
+ {r.label
+ ? {r.label}
+ : {r.table_name}}
{progress === 'none'
? {CT.noCatalog}
: }
- {r.table_name}
+ {r.label
+ ? {r.table_name}
+ : {CT.noLabel}}
{r.kind && · {CATALOG_KIND_LABEL[r.kind] ?? r.kind}}
{r.is_view && · {CT.view}}
{r.relations > 0 && · {CT.relationCount(r.relations)}}
diff --git a/scripts/check-catalog.mjs b/scripts/check-catalog.mjs
index 39b233fc..5b3a7d9d 100644
--- a/scripts/check-catalog.mjs
+++ b/scripts/check-catalog.mjs
@@ -537,6 +537,16 @@ await section('数据目录 · 表清单的排序与筛选', async () => {
check('……读屏念得出各状态的项数', (await page.locator('[data-catalog-row="visits"] .sr-only').allInnerTexts()).join('|').includes(`推断 ${c.proposed} 项`))
check('没有目录的表写「没有目录」、中文名写「未填写中文名」', (await page.locator('[data-catalog-row="gates"]').innerText()).includes('没有目录')
&& (await page.locator('[data-catalog-row="gates"] [data-row-label]').innerText()) === '未填写中文名')
+ // 没填中文名的表:标题就是表名,「未填写中文名」降为下一行的淡色提示;填了的照旧中文名作标题、表名在下一行
+ const titleOf = (name) => page.locator(`[data-catalog-row="${name}"] [data-row-title]`).evaluate((el) => ({
+ text: el.innerText, weight: Number(getComputedStyle(el).fontWeight), color: getComputedStyle(el).color,
+ hint: getComputedStyle(el.closest('[data-catalog-row]').querySelector('[data-row-no-label]') ?? el).color,
+ }))
+ const gatesTitle = await titleOf('gates')
+ const visitsTitle = await titleOf('visits')
+ check('没填中文名:标题写表名、用正文的颜色和字重,「未填写中文名」是淡色的次要提示', gatesTitle.text === 'gates' && gatesTitle.weight >= 500
+ && gatesTitle.color === visitsTitle.color && gatesTitle.hint !== gatesTitle.color, JSON.stringify(gatesTitle))
+ check('填了中文名:标题写中文名', visitsTitle.text === '入园记录')
await cleanCopy(page, '表清单')
await shot(page, 'catalog-list')