Skip to content

Commit e9b6c43

Browse files
committed
feat(knowledge): 体系页空态示例体系入口
1 parent eaef8d8 commit e9b6c43

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// @vitest-environment jsdom
2+
/**
3+
* KnowledgePage.test.tsx — 体系页空态示例入口 + 全局向导联动(v0.13.7 具象化)。
4+
*
5+
* @ai-context: 空态(systems.length === 0)渲染 KnowledgeSampleView——示例≠预填
6+
* (纪律裁决 2026-08-24):浏览是被动参照;复制需先有全局体系,
7+
* 无全局时 onNeedGlobal 打开全局创建向导(既有 handleCreated 流)。
8+
*/
9+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
10+
import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react";
11+
12+
const { invokeMock } = vi.hoisted(() => ({ invokeMock: vi.fn() }));
13+
vi.mock("@tauri-apps/api/core", () => ({ invoke: invokeMock }));
14+
vi.mock("@tauri-apps/plugin-dialog", () => ({ confirm: vi.fn().mockResolvedValue(true) }));
15+
16+
import KnowledgePage from "./KnowledgePage";
17+
18+
beforeEach(() => {
19+
invokeMock.mockReset();
20+
invokeMock.mockImplementation(async (cmd: string) => {
21+
switch (cmd) {
22+
case "list_knowledge_systems": return [];
23+
case "list_knowledge_nodes": return [];
24+
case "list_knowledge_concepts": return [];
25+
case "list_knowledge_models": return [];
26+
case "list_knowledge_links": return [];
27+
default: throw new Error(`unexpected: ${cmd}`);
28+
}
29+
});
30+
});
31+
32+
afterEach(() => cleanup());
33+
34+
describe("KnowledgePage 空态", () => {
35+
it("空态显示示例体系入口", async () => {
36+
render(<KnowledgePage />);
37+
const sample = await screen.findByTestId("sample-view");
38+
expect(sample.textContent).toContain("摄影");
39+
expect(screen.getByTestId("sample-copy")).toBeTruthy();
40+
});
41+
42+
it("空态点示例复制(无全局)→ 打开全局创建向导", async () => {
43+
render(<KnowledgePage />);
44+
fireEvent.click(await screen.findByTestId("sample-copy"));
45+
await waitFor(() => expect(screen.getByTestId("knowledge-wizard")).toBeTruthy());
46+
});
47+
});

‎app/src/pages/KnowledgePage.tsx‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import KnowledgeDetailPanel from "../components/KnowledgeDetailPanel";
2121
import KnowledgeConceptDialog from "../components/KnowledgeConceptDialog";
2222
import KnowledgeModelDialog from "../components/KnowledgeModelDialog";
2323
import ConceptCardRow from "../components/ConceptCardRow";
24+
import KnowledgeSampleView from "../components/KnowledgeSampleView";
2425

2526
type MiddleView = "tree" | "concept" | "model";
2627

@@ -126,6 +127,16 @@ export default function KnowledgePage() {
126127
<button data-testid="page-create-first" onClick={() => setWizardOpen(true)} style={{ fontSize: 14, cursor: "pointer", padding: "10px 24px", borderRadius: 8, border: "1px solid #0f766e", background: "#f0fdfa", color: "#0f766e", fontWeight: 600 }}>
127128
✳ 创建你的第一个体系
128129
</button>
130+
{/* v0.13.7:空态示例入口——浏览为被动参照,复制得骨架("待改造"非"已完成") */}
131+
{/* 无全局体系时 onNeedGlobal 打开向导;创建后 handleCreated 刷新并选中,空态随之退出 */}
132+
<KnowledgeSampleView
133+
onCopied={(sys) => {
134+
setWizardOpen(false);
135+
void loadSystems().then(() => setSelectedSystemId(sys.id));
136+
}}
137+
onNeedGlobal={() => setWizardOpen(true)}
138+
refreshGlobal={0}
139+
/>
129140
{wizardOpen && <KnowledgeSystemWizard onClose={() => setWizardOpen(false)} onCreated={(sys) => void handleCreated(sys)} />}
130141
</div>
131142
);

0 commit comments

Comments
 (0)