/** * feature `gov-activity` —— 活动库:两维分类 × 包版本 × 资产版本 * * 自 `~/coding/JCAI_PRD/governance/_components/Governance.tsx` 平移: * DOM 结构、类名(`g-*` + 色调 `t-*`)与文案原样保留,mock 常量换成服务端投影(README 平移规则 1/2/4)。 * 区首页只负责导航,治理动作一律落在下钻详情页的**就地确认带**(影响预览三必答)。 */ import { Ico } from '@web-shared/Ico.tsx'; import { Card, Chip, Clear, Entry, Note, PageHead, QueryGate, St } from '@web-shared/gov/primitives.tsx'; import { PARA } from '@web-shared/gov/tone.ts'; import type { Nav } from '@web-shared/gov/gov-route.ts'; import { useGovActivities, useGovMemory, } from '@web-shared/gov/gov-api.ts'; export type HomeProps = { tab: string; nav: Nav }; export function LibraryHome({ nav }: HomeProps) { const q = useGovActivities(); const activities = q.data?.activities ?? []; return ( <> 活动是任务的定义:编排引用一个活动,运行时就长出一个任务。业务分类 × 活动类型两维平级; 每活动两条版本序列——包版本走安装两审,资产版本走进化管线。 审批点与网关不在这里:它们是流程层的系统内置要素,零开发、不入库。 {activities.length === 0 ? ( 货架是空的 —— 装一个活动进来,编排里才引用得到它。 ) : ( {activities.map((a) => { const para = PARA[a.paradigm]; const latest = a.packageVersions[a.packageVersions.length - 1]; const effective = a.assetVersions.filter((v) => v.effective).length; return ( nav.push({ k: 'act', id: a.activityId })} > {a.name} {a.activityId} {para.label} {a.category} 包 v{latest?.version ?? '—'} {/* 只报查得到的事实:资产生效版数与上架状态。 「实现到没到位」这一层,清单里没有可靠依据 —— 不在卡上编一个章。 */} {a.enabled ? '已上架' : '已停用'} 资产生效 {effective} ); })} )} > ); } /* ---------------- ⑥ 工具管理 ---------------- */ export function ActPage({ id, nav }: { id: string; nav: Nav }) { const q = useGovActivities(); const memory = useGovMemory(id); const a = (q.data?.activities ?? []).find((x) => x.activityId === id); if (a === undefined) return 活动不存在。; return ( <> {PARA[a.paradigm].label} {a.category} {a.enabled ? '已启用' : '已停用'} > } desc={PARA[a.paradigm].full + ' —— 活动是系统外开发、经此安装的外装件。'} /> {a.packageVersions.map((p) => ( v{p.version} {p.state} · {p.installedAt.slice(0, 16).replace('T', ' ')} ))} {a.assetVersions.map((v, i) => ( {v.kind} v{v.version} {v.effective ? '生效中' : '历史'} ))} {a.assetVersions.length === 0 && 尚无资产版本。} nav.jump('knowledge', 'layers')} /> > ); }