Merge readable-audit two-trees frontend work into the render workspace

Why: Owner decision merge_whole requires the parent "two trees" initiative's
Frontend work (local-only 95e1948, feature/rdm-two-trees-readable-audit:
814643f..95e1948) to ship together with the unified document render
workspace branch.

Evidence:
- Conflict src/components/RdmAuditWorkspace.tsx (TreeList render): HEAD added
  a per-document "阅读与交付" open button inside the old two-level doc/section
  list; 95e1948 replaced that list with the recursive TreeNodeRow. Kept the
  recursive TreeNodeRow and moved the open button into it (wrapped in
  .rdm-audit-tree-row, onOpenDoc threaded through recursion, shown for
  kind === 'doc' at any depth; aria-label keeps "阅读与交付:<title>").
  MaterialsTab/DocumentRenderWorkspace, saveBase64File and key={pid} from
  HEAD and readable presentation, paging, detail seq-guard, trace relation
  and timeline changes from 95e1948 merged cleanly.
- Conflict src/styles.css (both appended at end of file): kept HEAD's
  render workspace / cockpit rules followed by 95e1948's 760px media query.
- Semantic fix e2e/rdm-audit.playwright.ts: tree kind is now shown in
  business language, so the section filter matches '章节' instead of
  'section'.
- npm test: 42 files, 496 tests passed (incl. design-guard,
  rdmAuditPresentation, rdmAuditTree); npm run build: ok;
  node scripts/check-knip.mjs: 50 <= 51; npx playwright test --list: 78 tests
  in 17 files.

Impact: RDM audit materials tab renders both project trees recursively with
readable names and still opens any document in the render workspace; audit
timeline and trace show readable records and retired/stale relations.

Refs: 95e1948 (814643f, b52f965, c9b55eb, b921bef, 505aba3, 1ef68ab,
ad503c9, 987be74, 95e1948); HEAD 50d12ce

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-10-18 07:16:47 +00:00
co-authored by Cursor
7 changed files with 575 additions and 95 deletions
+1 -1
View File
@@ -71,7 +71,7 @@ test.describe.serial('U4 项目追溯审计工作区', () => {
await page.getByRole('tab', { name: '资料与文档' }).click()
await page.locator('.rdm-audit-tree-node').first().click()
const sectionNode = page.locator('.rdm-audit-tree-children .rdm-audit-tree-node')
.filter({ has: page.locator('.rdm-audit-tree-kind', { hasText: 'section' }) }).first()
.filter({ has: page.locator('.rdm-audit-tree-kind', { hasText: '章节' }) }).first()
await expect(sectionNode).toBeVisible()
await sectionNode.click()
await expect(page.locator('.rdm-audit-detail')).toBeVisible()