三面拆分①:surface 配置与区表 —— 归属/亮灯/旧链改写皆纯函数先测后写

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-27 20:50:32 +08:00
co-authored by Claude Fable 5
parent ac85ecf2ea
commit e578b5bc34
6 changed files with 309 additions and 50 deletions
+28 -7
View File
@@ -12,13 +12,14 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { logoutRoute } from '@contracts';
import { call } from '@web-shared/typed-fetch.ts';
import { Ico } from '@web-shared/Ico.tsx';
import { Note } from '@web-shared/gov/primitives.tsx';
import { TABS, ZM, ZONES, routeLabel } from '@web-shared/gov/gov-route.ts';
import type { GovZone, Nav, Route } from '@web-shared/gov/gov-route.ts';
import { useGovStaff, useGovTasks } from '@web-shared/gov/gov-api.ts';
import { TasksHome, TaskLogPage, TaskPage, WfPage } from '@features/gov-task';
import { EmpPage, PeopleHome, RolePage } from '@features/gov-staff';
import { EdgesPage, PkgPage, WorkflowsHome } from '@features/gov-process';
import { TriggerPage, TriggersHome } from '@features/gov-trigger';
import { TriggerPage } from '@features/gov-trigger';
import { ActPage, LibraryHome } from '@features/gov-activity';
import { ToolPage, ToolsHome } from '@features/gov-tool';
import { DataHome, ObjPage } from '@features/gov-data';
@@ -34,7 +35,8 @@ function readPlace(): Place {
const parts = raw.split('/').filter((s) => s !== '');
const zone = (ZONES.find((z) => z.key === parts[1])?.key ?? 'tasks') as GovZone;
const tabs = TABS[zone];
const tab = tabs.find((t) => t.key === parts[2])?.key ?? tabs[0]!.key;
// 台账区的页签是数据域(动态生成),静态表里没有 —— 认不出就原样收下,别兜到不存在的首签
const tab = tabs.find((t) => t.key === parts[2])?.key ?? tabs[0]?.key ?? (parts[2] ?? '');
const stack: Route[] = [];
for (const seg of parts.slice(3)) {
const at = seg.indexOf(':');
@@ -83,7 +85,7 @@ export function GovShell() {
const p = readPlace();
go({ ...p, stack: p.stack.slice(0, -1) });
}, [go]);
const goZone = useCallback((z: GovZone) => go({ zone: z, tab: TABS[z][0]!.key, stack: [] }), [go]);
const goZone = useCallback((z: GovZone) => go({ zone: z, tab: TABS[z][0]?.key ?? '', stack: [] }), [go]);
const jump = useCallback((z: GovZone, tab: string, r?: Route) => go({ zone: z, tab, stack: r ? [r] : [] }), [go]);
const nav: Nav = { push, jump };
@@ -218,16 +220,35 @@ export function GovShell() {
);
}
/** 企业蓝图 —— Task 6 接真;在那之前先给设计者一句「这里将有什么」 */
function BlueprintPlaceholder() {
return (
<Note>
这里将把四库串成一条因果链:流程包(战略)→ 活动库(方法)→ 工具箱(能力)→ 数据域(对象),
并把「哪里还没定义完」聚成一张待补清单。先从左轨进各库编排。
</Note>
);
}
/** 台账 —— Task 10 接真;导航项已随数据域长出来了,内容随后 */
function LedgersPlaceholder() {
return <Note>这里将按域列出全部台账对象、行数据与版本。域的结构在设计中心 · 数据域维护。</Note>;
}
function ZoneHome({ zone, tab, nav }: { zone: GovZone; tab: string; nav: Nav }) {
const P = {
tasks: TasksHome,
people: PeopleHome,
// 设计中心
blueprint: BlueprintPlaceholder,
workflows: WorkflowsHome,
triggers: TriggersHome,
library: LibraryHome,
tools: ToolsHome,
data: DataHome,
memory: MemoryHome,
// 运营中心
cockpit: MemoryHome,
tasks: TasksHome,
people: PeopleHome,
ledgers: LedgersPlaceholder,
knowledge: MemoryHome,
system: SystemHome,
}[zone];
return <P tab={tab} nav={nav} />;