@allbluecn/web-app 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +239 -30
- package/src/components/iteration/auto-schedule-dialog.tsx +150 -0
- package/src/components/iteration/burndown-chart.tsx +63 -0
- package/src/components/iteration/constants.ts +28 -0
- package/src/components/iteration/create-iteration-dialog.tsx +140 -0
- package/src/components/iteration/iteration-card.tsx +60 -0
- package/src/components/iteration/iteration-editor.tsx +116 -0
- package/src/components/iteration/iteration-progress-bar.tsx +44 -0
- package/src/components/iteration/iteration-status-badge.tsx +33 -0
- package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +21 -30
- package/src/components/knowledge/knowledge-toolbar.tsx +124 -1
- package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +2 -2
- package/src/components/layout/sidebar-03/nav-workspace.tsx +2 -2
- package/src/components/project/create-project-dialog.tsx +44 -57
- package/src/components/shared/__tests__/lucide-curated-icons.test.ts +83 -0
- package/src/components/shared/__tests__/lucide-icon-data.test.ts +131 -0
- package/src/components/shared/__tests__/lucide-icon-picker.test.tsx +197 -0
- package/src/components/shared/lucide-icon-picker/curated-icons.ts +478 -0
- package/src/components/shared/lucide-icon-picker/icon-data.ts +109 -0
- package/src/components/shared/lucide-icon-picker/index.tsx +82 -0
- package/src/components/shared/lucide-icon-picker/lucide-icon-by-name.tsx +78 -0
- package/src/components/shared/lucide-icon-picker/panel.tsx +163 -0
- package/src/components/story/__tests__/constants.test.ts +255 -0
- package/src/components/story/ai/story-ai-panel.tsx +23 -15
- package/src/components/story/ai/story-ai-preview-list.tsx +19 -0
- package/src/components/story/constants.ts +43 -1
- package/src/components/story/create-story-dialog.tsx +42 -16
- package/src/components/story/detail/__tests__/associated-attachments-panel.test.tsx +114 -0
- package/src/components/story/detail/__tests__/categories.test.tsx +62 -0
- package/src/components/story/detail/__tests__/dependencies-button.test.tsx +49 -0
- package/src/components/story/detail/activity-timeline.tsx +26 -4
- package/src/components/story/detail/story-detail-body.tsx +90 -38
- package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +857 -0
- package/src/components/story/detail/story-detail-toolbar/categories.tsx +23 -18
- package/src/components/story/detail/story-detail-toolbar/children.tsx +9 -4
- package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +95 -27
- package/src/components/story/detail/story-detail-toolbar.tsx +159 -8
- package/src/components/story/detail/story-properties.tsx +21 -4
- package/src/components/story/display/__tests__/group-fields.test.ts +107 -0
- package/src/components/story/display/group-resolver.tsx +2 -2
- package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +155 -0
- package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +155 -0
- package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +173 -0
- package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +174 -0
- package/src/components/story/inline-editors/dependency-type-select.tsx +180 -0
- package/src/components/story/inline-editors/index.ts +2 -1
- package/src/components/story/inline-editors/labels-editor.tsx +159 -3
- package/src/components/story/inline-editors/story-select-dialog.tsx +41 -63
- package/src/components/story/peek-panel.tsx +121 -21
- package/src/components/story/relations/__tests__/attachment-manage-dialog.test.tsx +171 -0
- package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +174 -0
- package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +93 -0
- package/src/components/story/relations/attachment-manage-dialog.tsx +490 -0
- package/src/components/story/relations/file-preview.tsx +173 -0
- package/src/components/story/relations/format.ts +120 -0
- package/src/components/story/relations/general-groups.ts +32 -0
- package/src/components/story/relations/knowledge-select-dialog.tsx +403 -0
- package/src/components/story/relations/link-manage-dialog.tsx +192 -0
- package/src/components/story/relations/story-ref-row.tsx +17 -27
- package/src/components/story/story-panel-header.tsx +25 -19
- package/src/components/story/story-toolbar.tsx +3 -3
- package/src/components/story/transfer-story-popover.tsx +2 -2
- package/src/components/story/types.ts +14 -0
- package/src/components/story/views/create-view-dialog.tsx +3 -3
- package/src/components/story/views/story-list/__tests__/group-header.test.tsx +219 -0
- package/src/components/story/views/story-list/group.tsx +1 -1
- package/src/components/story/views/story-list/inline-story-creator.tsx +2 -2
- package/src/components/story/views/story-list/row.tsx +1 -1
- package/src/components/workspace/create-workspace-dialog.tsx +41 -49
- package/src/lib/__tests__/project-display-id.test.ts +8 -5
- package/src/lib/changelog/sdk-versions.ts +20 -20
- package/src/lib/iteration/__tests__/status.test.ts +41 -0
- package/src/lib/iteration/status.ts +28 -0
- package/src/lib/project-display-id.ts +14 -5
- package/src/lib/project-module-meta.ts +77 -0
- package/src/lib/story/__tests__/video-embed.test.ts +77 -0
- package/src/lib/story/video-embed.ts +59 -0
- package/src/lib/utils.d.ts +1 -1
- package/src/plugins/.gen-manifest.json +13 -0
- package/src/plugins/modules.gen.ts +20 -0
- package/src/plugins/plugins.gen.ts +20 -0
- package/src/plugins/ui.gen.ts +8 -0
- package/src/providers/index.tsx +6 -0
- package/src/routeTree.gen.ts +96 -0
- package/src/routes/__root.tsx +0 -8
- package/src/routes/_nav/inspiration/route.tsx +8 -0
- package/src/routes/_nav/knowledge/index.lazy.tsx +2 -2
- package/src/routes/_nav/prd/$id/route.tsx +9 -0
- package/src/routes/_nav/prd/index.tsx +9 -0
- package/src/routes/_nav/prd/route.tsx +8 -0
- package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +52 -25
- package/src/routes/_nav/projects/$projectId/$storyId/route.tsx +6 -3
- package/src/routes/_nav/projects/$projectId/index.lazy.tsx +32 -15
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +289 -0
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.tsx +27 -0
- package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +111 -0
- package/src/routes/_nav/projects/$projectId/iterations/index.tsx +24 -0
- package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
- package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +78 -7
- package/src/routes/_nav/projects/$projectId/settings/route.tsx +6 -2
- package/src/routes/_nav/stories/$storyId/route.lazy.tsx +5 -1
- package/src/routes/_nav/stories/$storyId/route.tsx +4 -0
- package/src/routes/_nav/tags/$id/route.tsx +8 -0
- package/src/routes/_nav/tags/index.tsx +8 -0
- package/src/routes/_nav/tags/route.tsx +8 -0
- package/src/routes/_nav/tags/settings/route.tsx +9 -0
- package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +3 -3
- package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +4 -4
- package/src/routes/_nav/workspaces/index.lazy.tsx +3 -3
- package/src/routes/api/attachments/$id/content.ts +60 -0
- package/src/routes/api/attachments/upload.ts +148 -0
- package/src/routes/share/prd/$prdId/route.tsx +10 -0
- package/src/server/serverFns/__tests__/project-kb.test.ts +147 -0
- package/src/server/serverFns/iteration/__tests__/auto-schedule-core.test.ts +62 -0
- package/src/server/serverFns/iteration/__tests__/burndown-core.test.ts +90 -0
- package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +211 -0
- package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +155 -0
- package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +136 -0
- package/src/server/serverFns/iteration/auto-schedule-core.ts +54 -0
- package/src/server/serverFns/iteration/auto-schedule-internal.ts +88 -0
- package/src/server/serverFns/iteration/burndown-core.ts +60 -0
- package/src/server/serverFns/iteration/index.ts +22 -0
- package/src/server/serverFns/iteration/iteration-auto-schedule.ts +66 -0
- package/src/server/serverFns/iteration/iteration-burndown.ts +70 -0
- package/src/server/serverFns/iteration/iteration-crud.ts +208 -0
- package/src/server/serverFns/iteration/iteration-stories.ts +111 -0
- package/src/server/serverFns/iteration/iteration-transfer.ts +42 -0
- package/src/server/serverFns/iteration/schemas.ts +58 -0
- package/src/server/serverFns/iteration/transfer-internal.ts +62 -0
- package/src/server/serverFns/knowledge.ts +50 -4
- package/src/server/serverFns/project/module-overview.ts +109 -0
- package/src/server/serverFns/project.ts +45 -2
- package/src/server/serverFns/story/__tests__/kb-scope.test.ts +56 -0
- package/src/server/serverFns/story/__tests__/label-suggest-fn.test.ts +100 -0
- package/src/server/serverFns/story/__tests__/labels.test.ts +67 -0
- package/src/server/serverFns/story/__tests__/story-assoc.test.ts +222 -0
- package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +132 -2
- package/src/server/serverFns/story/index.ts +9 -4
- package/src/server/serverFns/story/kb-general.ts +39 -0
- package/src/server/serverFns/story/kb-scope.ts +52 -0
- package/src/server/serverFns/story/link-preview.ts +115 -0
- package/src/server/serverFns/story/story-assoc.ts +372 -51
- package/src/server/serverFns/story/story-attachments.ts +32 -45
- package/src/{components/project/project-icon.tsx → server/serverFns/story/story-crud/label-palette.ts} +16 -19
- package/src/server/serverFns/story/story-crud/label-suggest-core.ts +88 -0
- package/src/server/serverFns/story/story-crud/label-suggest.ts +38 -0
- package/src/{components/knowledge/knowledge-icon.tsx → server/serverFns/story/story-crud/label-upsert.ts} +13 -19
- package/src/server/serverFns/story/story-crud/labels.ts +3 -5
- package/src/server/serverFns/story/story-crud.ts +53 -6
- package/src/server/serverFns/story/story-dependencies.ts +158 -5
- package/src/server/serverFns/story/story-links.ts +43 -7
- package/src/server/serverFns/story/story-transfer.ts +5 -4
- package/src/server/serverFns/story/story-tree.ts +28 -1
- package/src/server/serverFns/story/types.ts +38 -0
- package/src/styles/globals.css +25 -0
- package/src/types/project.ts +5 -5
- package/vite.shared.ts +2 -0
- package/src/components/project/project-animated-icon.tsx +0 -73
- package/src/components/shared/icon-packs/index.ts +0 -1
- package/src/components/shared/icon-packs/knowledge.ts +0 -1
- package/src/components/shared/icon-packs/prd.ts +0 -1
- package/src/components/shared/icon-packs/project.ts +0 -1
- package/src/components/shared/icon-picker.tsx +0 -1
- package/src/components/story/detail/story-detail-toolbar/attachments.tsx +0 -73
- package/src/components/story/detail/story-detail-toolbar/knowledge.tsx +0 -73
- package/src/components/story/detail/story-detail-toolbar/links.tsx +0 -73
- package/src/components/story/relations/attachments-panel.tsx +0 -179
- package/src/components/story/relations/knowledge-panel.tsx +0 -284
- package/src/components/story/relations/links-panel.tsx +0 -240
- package/src/lib/project-mock.ts +0 -156
|
@@ -15,16 +15,25 @@
|
|
|
15
15
|
// You should have received a copy of the GNU Affero General Public License
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
|
+
import { pinyin } from "pinyin-pro";
|
|
18
19
|
import { BUILTIN_INDEPENDENT_DISPLAY_ID } from "./builtin-project";
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
|
-
* 从项目名提取 displayId
|
|
22
|
-
*
|
|
22
|
+
* 从项目名提取 displayId:字母数字原样保留,汉字转拼音首字母,
|
|
23
|
+
* 转大写,取前10位。示例:"产品需求PRD" → "CPXQPRD"。
|
|
23
24
|
*/
|
|
24
25
|
export function extractDisplayId(name: string): string {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const chars: string[] = [];
|
|
27
|
+
for (const ch of name) {
|
|
28
|
+
if (/[A-Za-z0-9]/.test(ch)) {
|
|
29
|
+
chars.push(ch);
|
|
30
|
+
} else if (/[\u4e00-\u9fff]/.test(ch)) {
|
|
31
|
+
const initial = pinyin(ch, { pattern: "first", toneType: "none" });
|
|
32
|
+
if (initial && /^[a-z]$/i.test(initial)) chars.push(initial);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (chars.length === 0) return "";
|
|
36
|
+
return chars.join("").toUpperCase().slice(0, 10);
|
|
28
37
|
}
|
|
29
38
|
|
|
30
39
|
/**
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// AllBlue - 理想之海
|
|
3
|
+
// Copyright (C) 2026 AllBlue Contributors
|
|
4
|
+
//
|
|
5
|
+
// This program is free software: you can redistribute it and/or modify
|
|
6
|
+
// it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
// the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
// (at your option) any later version.
|
|
9
|
+
//
|
|
10
|
+
// This program is distributed in the hope that it will be useful,
|
|
11
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
// GNU Affero General Public License for more details.
|
|
14
|
+
//
|
|
15
|
+
// You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
ClipboardList,
|
|
20
|
+
Package2,
|
|
21
|
+
Palette,
|
|
22
|
+
FlaskConical,
|
|
23
|
+
Bug,
|
|
24
|
+
CircleCheckBig,
|
|
25
|
+
} from "lucide-react";
|
|
26
|
+
import type {
|
|
27
|
+
ProjectModuleKey,
|
|
28
|
+
ProjectModuleOverview,
|
|
29
|
+
} from "@/types/project";
|
|
30
|
+
|
|
31
|
+
// 6 个板块元数据(key 与路由 $module 对应)
|
|
32
|
+
export const PROJECT_MODULE_META: Record<
|
|
33
|
+
ProjectModuleKey,
|
|
34
|
+
Omit<ProjectModuleOverview, "count" | "lastUpdatedAt" | "link">
|
|
35
|
+
> = {
|
|
36
|
+
requirement: {
|
|
37
|
+
key: "requirement",
|
|
38
|
+
title: "需求",
|
|
39
|
+
description: "收集与跟踪产品需求池",
|
|
40
|
+
icon: ClipboardList,
|
|
41
|
+
},
|
|
42
|
+
prd: {
|
|
43
|
+
key: "prd",
|
|
44
|
+
title: "PRD",
|
|
45
|
+
description: "产品需求文档与原型画板",
|
|
46
|
+
icon: Package2,
|
|
47
|
+
},
|
|
48
|
+
design: {
|
|
49
|
+
key: "design",
|
|
50
|
+
title: "设计",
|
|
51
|
+
description: "UI 设计稿与画板资源",
|
|
52
|
+
icon: Palette,
|
|
53
|
+
},
|
|
54
|
+
testcase: {
|
|
55
|
+
key: "testcase",
|
|
56
|
+
title: "测例",
|
|
57
|
+
description: "测试用例与执行计划",
|
|
58
|
+
icon: FlaskConical,
|
|
59
|
+
},
|
|
60
|
+
bug: {
|
|
61
|
+
key: "bug",
|
|
62
|
+
title: "BUG",
|
|
63
|
+
description: "缺陷跟踪与修复进度",
|
|
64
|
+
icon: Bug,
|
|
65
|
+
},
|
|
66
|
+
acceptance: {
|
|
67
|
+
key: "acceptance",
|
|
68
|
+
title: "验收",
|
|
69
|
+
description: "交付验收与上线检查",
|
|
70
|
+
icon: CircleCheckBig,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const PROJECT_MODULE_KEYS = Object.keys(
|
|
75
|
+
PROJECT_MODULE_META,
|
|
76
|
+
) as ProjectModuleKey[];
|
|
77
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveVideoEmbed } from "../video-embed";
|
|
3
|
+
|
|
4
|
+
describe("resolveVideoEmbed", () => {
|
|
5
|
+
it("非视频链接返回 null", () => {
|
|
6
|
+
expect(resolveVideoEmbed("https://example.com/page")).toBeNull();
|
|
7
|
+
expect(resolveVideoEmbed("https://lucide.dev/icons/layout-list")).toBeNull();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("直链视频文件走 file 分支(忽略 query/hash)", () => {
|
|
11
|
+
expect(resolveVideoEmbed("https://cdn.example.com/a.mp4")).toEqual({
|
|
12
|
+
kind: "file",
|
|
13
|
+
src: "https://cdn.example.com/a.mp4",
|
|
14
|
+
});
|
|
15
|
+
expect(
|
|
16
|
+
resolveVideoEmbed("https://cdn.example.com/a.webm?token=x#t=1"),
|
|
17
|
+
).toEqual({ kind: "file", src: "https://cdn.example.com/a.webm?token=x#t=1" });
|
|
18
|
+
expect(resolveVideoEmbed("https://cdn.example.com/a.MOV")).toEqual({
|
|
19
|
+
kind: "file",
|
|
20
|
+
src: "https://cdn.example.com/a.MOV",
|
|
21
|
+
});
|
|
22
|
+
// 扩展名仅匹配路径末段,不匹配 query 里的伪扩展名
|
|
23
|
+
expect(resolveVideoEmbed("https://example.com/watch?file=a.mp4")).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("YouTube watch 页转换为 embed 播放器", () => {
|
|
27
|
+
expect(resolveVideoEmbed("https://www.youtube.com/watch?v=dQw4w9WgXcQ")).toEqual({
|
|
28
|
+
kind: "iframe",
|
|
29
|
+
src: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
|
30
|
+
});
|
|
31
|
+
expect(
|
|
32
|
+
resolveVideoEmbed("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=30s"),
|
|
33
|
+
).toEqual({ kind: "iframe", src: "https://www.youtube.com/embed/dQw4w9WgXcQ" });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("YouTube youtu.be 短链与 shorts 转换", () => {
|
|
37
|
+
expect(resolveVideoEmbed("https://youtu.be/dQw4w9WgXcQ")).toEqual({
|
|
38
|
+
kind: "iframe",
|
|
39
|
+
src: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
|
40
|
+
});
|
|
41
|
+
expect(resolveVideoEmbed("https://www.youtube.com/shorts/abc123")).toEqual({
|
|
42
|
+
kind: "iframe",
|
|
43
|
+
src: "https://www.youtube.com/embed/abc123",
|
|
44
|
+
});
|
|
45
|
+
// 已是 embed 链接原样返回
|
|
46
|
+
expect(resolveVideoEmbed("https://www.youtube.com/embed/dQw4w9WgXcQ")).toEqual({
|
|
47
|
+
kind: "iframe",
|
|
48
|
+
src: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("Bilibili 视频页转换为官方播放器(BV 号 + 分 P)", () => {
|
|
53
|
+
expect(
|
|
54
|
+
resolveVideoEmbed("https://www.bilibili.com/video/BV1GJ411x7h7/"),
|
|
55
|
+
).toEqual({
|
|
56
|
+
kind: "iframe",
|
|
57
|
+
src: "https://player.bilibili.com/player.html?bvid=BV1GJ411x7h7&autoplay=0",
|
|
58
|
+
});
|
|
59
|
+
expect(
|
|
60
|
+
resolveVideoEmbed("https://www.bilibili.com/video/BV1GJ411x7h7?p=3"),
|
|
61
|
+
).toEqual({
|
|
62
|
+
kind: "iframe",
|
|
63
|
+
src: "https://player.bilibili.com/player.html?bvid=BV1GJ411x7h7&autoplay=0&p=3",
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("Vimeo 转换为播放器", () => {
|
|
68
|
+
expect(resolveVideoEmbed("https://vimeo.com/76979871")).toEqual({
|
|
69
|
+
kind: "iframe",
|
|
70
|
+
src: "https://player.vimeo.com/video/76979871",
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("b23.tv 短链无法本地解析,返回 null 交给原有探测逻辑", () => {
|
|
75
|
+
expect(resolveVideoEmbed("https://b23.tv/BV1GJ411x7h7")).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// 视频链接识别与官方 embed 转换:供关联面板链接预览使用
|
|
2
|
+
// 返回 null 表示非视频链接(交由原有的可嵌入探测逻辑处理)
|
|
3
|
+
|
|
4
|
+
export type VideoEmbed =
|
|
5
|
+
| { kind: "file"; src: string }
|
|
6
|
+
| { kind: "iframe"; src: string };
|
|
7
|
+
|
|
8
|
+
const VIDEO_FILE_RE = /\.(mp4|webm|ogg|ogv|mov|m4v)$/i;
|
|
9
|
+
|
|
10
|
+
const YOUTUBE_ID_RE =
|
|
11
|
+
/^(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:watch\?(?:.*&)?v=|shorts\/|embed\/)|youtu\.be\/)([A-Za-z0-9_-]{6,})/i;
|
|
12
|
+
|
|
13
|
+
const BILIBILI_BV_RE =
|
|
14
|
+
/^(?:https?:\/\/)?(?:www\.)?bilibili\.com\/video\/(BV[0-9A-Za-z]+)\/?(?:\?.*)?$/i;
|
|
15
|
+
|
|
16
|
+
const VIMEO_ID_RE = /^(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(\d+)(?:\?.*)?$/i;
|
|
17
|
+
|
|
18
|
+
/** 解析 B 站分 P 参数(仅接受纯数字,防止参数注入) */
|
|
19
|
+
function getBilibiliPart(rawUrl: string): string | null {
|
|
20
|
+
try {
|
|
21
|
+
const p = new URL(rawUrl).searchParams.get("p");
|
|
22
|
+
return p && /^\d+$/.test(p) ? p : null;
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function resolveVideoEmbed(rawUrl: string): VideoEmbed | null {
|
|
29
|
+
if (!rawUrl) return null;
|
|
30
|
+
|
|
31
|
+
// 直链视频文件:扩展名只看 URL 路径末段,避免 query 中的伪扩展名误判
|
|
32
|
+
try {
|
|
33
|
+
const parsed = new URL(rawUrl);
|
|
34
|
+
if (VIDEO_FILE_RE.test(parsed.pathname)) {
|
|
35
|
+
return { kind: "file", src: rawUrl };
|
|
36
|
+
}
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const youtube = rawUrl.match(YOUTUBE_ID_RE);
|
|
42
|
+
if (youtube) {
|
|
43
|
+
return { kind: "iframe", src: `https://www.youtube.com/embed/${youtube[1]}` };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const bilibili = rawUrl.match(BILIBILI_BV_RE);
|
|
47
|
+
if (bilibili) {
|
|
48
|
+
const part = getBilibiliPart(rawUrl);
|
|
49
|
+
const src = `https://player.bilibili.com/player.html?bvid=${bilibili[1]}&autoplay=0${part ? `&p=${part}` : ""}`;
|
|
50
|
+
return { kind: "iframe", src };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const vimeo = rawUrl.match(VIMEO_ID_RE);
|
|
54
|
+
if (vimeo) {
|
|
55
|
+
return { kind: "iframe", src: `https://player.vimeo.com/video/${vimeo[1]}` };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return null;
|
|
59
|
+
}
|
package/src/lib/utils.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { cn } from '
|
|
1
|
+
export { cn } from '@/components/ui-shared/utils';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"routeFiles": [
|
|
3
|
+
"src/routes/_nav/tags/route.tsx",
|
|
4
|
+
"src/routes/_nav/tags/index.tsx",
|
|
5
|
+
"src/routes/_nav/tags/$id/route.tsx",
|
|
6
|
+
"src/routes/_nav/tags/settings/route.tsx",
|
|
7
|
+
"src/routes/_nav/inspiration/route.tsx",
|
|
8
|
+
"src/routes/_nav/prd/route.tsx",
|
|
9
|
+
"src/routes/_nav/prd/index.tsx",
|
|
10
|
+
"src/routes/_nav/prd/$id/route.tsx",
|
|
11
|
+
"src/routes/share/prd/$prdId/route.tsx"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// AUTO-GENERATED by @allbluecn/kernel — DO NOT EDIT
|
|
2
|
+
import type { ProFeature } from '@allbluecn/kernel'
|
|
3
|
+
|
|
4
|
+
export const activePluginIds = ['@allbluecn/tags', '@allbluecn/inspiration', '@allbluecn/prd'] as const
|
|
5
|
+
export type ActivePluginId = (typeof activePluginIds)[number]
|
|
6
|
+
|
|
7
|
+
export const implementedModules: Record<ProFeature, boolean> = {
|
|
8
|
+
billing: false,
|
|
9
|
+
hostedAi: false,
|
|
10
|
+
sso: false,
|
|
11
|
+
audit: false,
|
|
12
|
+
permissions: false,
|
|
13
|
+
license: false,
|
|
14
|
+
versionHistory: false,
|
|
15
|
+
automation: false,
|
|
16
|
+
templates: false,
|
|
17
|
+
analytics: false,
|
|
18
|
+
globalSearch: false,
|
|
19
|
+
compliance: false,
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// AUTO-GENERATED by @allbluecn/kernel — DO NOT EDIT
|
|
2
|
+
// profile: oss (validated: 3 plugins)
|
|
3
|
+
// 拓扑序:@allbluecn/tags -> @allbluecn/inspiration -> @allbluecn/prd
|
|
4
|
+
import tags from '@allbluecn/plugins-core/tags'
|
|
5
|
+
import inspiration from '@allbluecn/plugins-core/inspiration'
|
|
6
|
+
import prd from '@allbluecn/plugins-core/prd'
|
|
7
|
+
import { defineProfile, type ProfileDefinition } from '@allbluecn/kernel'
|
|
8
|
+
|
|
9
|
+
export const profile: ProfileDefinition = defineProfile({
|
|
10
|
+
id: 'oss',
|
|
11
|
+
plugins: [tags, inspiration, prd],
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
export const pluginIds: string[] = ['@allbluecn/tags', '@allbluecn/inspiration', '@allbluecn/prd']
|
|
15
|
+
|
|
16
|
+
export const pluginMiddleware: unknown[] = [
|
|
17
|
+
...tags.contributes.serverMiddleware ?? [],
|
|
18
|
+
...inspiration.contributes.serverMiddleware ?? [],
|
|
19
|
+
...prd.contributes.serverMiddleware ?? [],
|
|
20
|
+
]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// AUTO-GENERATED by @allbluecn/kernel — DO NOT EDIT
|
|
2
|
+
import { NavTag } from '@allbluecn/plugins-core/tags/ui'
|
|
3
|
+
import { type ComponentType } from 'react'
|
|
4
|
+
import type { SettingsTabContribution } from '@allbluecn/kernel'
|
|
5
|
+
|
|
6
|
+
export const navItems: ComponentType[] = [NavTag]
|
|
7
|
+
export const settingsTabs: SettingsTabContribution[] = []
|
|
8
|
+
export const dashboardWidgets: ComponentType[] = []
|
package/src/providers/index.tsx
CHANGED
|
@@ -28,6 +28,12 @@ import type { Session } from "@/lib/auth/auth-client";
|
|
|
28
28
|
import { exchangeRemoteTokenFn } from "@/server/serverFns/auth/session";
|
|
29
29
|
import { toast } from "sonner";
|
|
30
30
|
import { createServerI18n } from "@/lib/i18n/server";
|
|
31
|
+
import { registerIconPicker } from "@allbluecn/plugins-core/prd/icon-picker-bridge";
|
|
32
|
+
import { LucideIconPicker } from "@/components/shared/lucide-icon-picker";
|
|
33
|
+
|
|
34
|
+
// 宿主注入图标选择器实现,供 plugins-core 的 PRD 弹窗等使用(模块级单例)
|
|
35
|
+
registerIconPicker(LucideIconPicker);
|
|
36
|
+
|
|
31
37
|
|
|
32
38
|
function DesktopDeepLinkListener() {
|
|
33
39
|
useEffect(() => {
|
package/src/routeTree.gen.ts
CHANGED
|
@@ -82,6 +82,7 @@ import { Route as NavTagsIdRouteRouteImport } from './routes/_nav/tags/$id/route
|
|
|
82
82
|
import { Route as NavTagsSettingsRouteRouteImport } from './routes/_nav/tags/settings/route'
|
|
83
83
|
import { Route as NavWorkspacesIndexRouteImport } from './routes/_nav/workspaces/index'
|
|
84
84
|
import { Route as NavWorkspacesWorkspaceIdRouteRouteImport } from './routes/_nav/workspaces/$workspaceId/route'
|
|
85
|
+
import { Route as ApiAttachmentsUploadRouteImport } from './routes/api/attachments/upload'
|
|
85
86
|
import { Route as ApiAuthSplatRouteImport } from './routes/api.auth.$'
|
|
86
87
|
import { Route as ApiAuthDesktopCallbackRouteImport } from './routes/api/auth/desktop-callback'
|
|
87
88
|
import { Route as ApiDesignUploadRouteImport } from './routes/api/design/upload'
|
|
@@ -100,8 +101,11 @@ import { Route as NavProjectsProjectIdStoryIdRouteRouteImport } from './routes/_
|
|
|
100
101
|
import { Route as NavProjectsProjectIdSettingsRouteRouteImport } from './routes/_nav/projects/$projectId/settings/route'
|
|
101
102
|
import { Route as NavSettingsAiProviderIdRouteRouteImport } from './routes/_nav/settings/ai/$providerId/route'
|
|
102
103
|
import { Route as NavWorkspacesWorkspaceIdSettingsRouteRouteImport } from './routes/_nav/workspaces/$workspaceId/settings/route'
|
|
104
|
+
import { Route as ApiAttachmentsIdContentRouteImport } from './routes/api/attachments/$id/content'
|
|
103
105
|
import { Route as DesignFilesProjectIdArtboardIdFilenameRouteImport } from './routes/design-files/$projectId/$artboardId/$filename'
|
|
104
106
|
import { Route as NavKnowledgeKbIdDocDocIdRouteRouteImport } from './routes/_nav/knowledge/$kbId/doc/$docId/route'
|
|
107
|
+
import { Route as NavProjectsProjectIdIterationsIndexRouteImport } from './routes/_nav/projects/$projectId/iterations/index'
|
|
108
|
+
import { Route as NavProjectsProjectIdIterationsIterationIdRouteRouteImport } from './routes/_nav/projects/$projectId/iterations/$iterationId/route'
|
|
105
109
|
import { Route as ApiSharePrdPrdIdEventsRouteImport } from './routes/api/share/prd/$prdId/events'
|
|
106
110
|
|
|
107
111
|
const NavKnowledgeBookmarksIndexLazyRouteImport = createFileRoute(
|
|
@@ -575,6 +579,11 @@ const NavWorkspacesWorkspaceIdRouteRoute =
|
|
|
575
579
|
(d) => d.Route,
|
|
576
580
|
),
|
|
577
581
|
)
|
|
582
|
+
const ApiAttachmentsUploadRoute = ApiAttachmentsUploadRouteImport.update({
|
|
583
|
+
id: '/api/attachments/upload',
|
|
584
|
+
path: '/api/attachments/upload',
|
|
585
|
+
getParentRoute: () => rootRouteImport,
|
|
586
|
+
} as any)
|
|
578
587
|
const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({
|
|
579
588
|
id: '/api/auth/$',
|
|
580
589
|
path: '/api/auth/$',
|
|
@@ -790,6 +799,11 @@ const NavWorkspacesWorkspaceIdSettingsRouteRoute =
|
|
|
790
799
|
(d) => d.Route,
|
|
791
800
|
),
|
|
792
801
|
)
|
|
802
|
+
const ApiAttachmentsIdContentRoute = ApiAttachmentsIdContentRouteImport.update({
|
|
803
|
+
id: '/api/attachments/$id/content',
|
|
804
|
+
path: '/api/attachments/$id/content',
|
|
805
|
+
getParentRoute: () => rootRouteImport,
|
|
806
|
+
} as any)
|
|
793
807
|
const DesignFilesProjectIdArtboardIdFilenameRoute =
|
|
794
808
|
DesignFilesProjectIdArtboardIdFilenameRouteImport.update({
|
|
795
809
|
id: '/design-files/$projectId/$artboardId/$filename',
|
|
@@ -824,6 +838,26 @@ const NavKnowledgeLawsEditIdLazyRoute =
|
|
|
824
838
|
} as any).lazy(() =>
|
|
825
839
|
import('./routes/_nav/knowledge/laws/edit/$id.lazy').then((d) => d.Route),
|
|
826
840
|
)
|
|
841
|
+
const NavProjectsProjectIdIterationsIndexRoute =
|
|
842
|
+
NavProjectsProjectIdIterationsIndexRouteImport.update({
|
|
843
|
+
id: '/iterations/',
|
|
844
|
+
path: '/iterations/',
|
|
845
|
+
getParentRoute: () => NavProjectsProjectIdRouteRoute,
|
|
846
|
+
} as any).lazy(() =>
|
|
847
|
+
import('./routes/_nav/projects/$projectId/iterations/index.lazy').then(
|
|
848
|
+
(d) => d.Route,
|
|
849
|
+
),
|
|
850
|
+
)
|
|
851
|
+
const NavProjectsProjectIdIterationsIterationIdRouteRoute =
|
|
852
|
+
NavProjectsProjectIdIterationsIterationIdRouteRouteImport.update({
|
|
853
|
+
id: '/iterations/$iterationId',
|
|
854
|
+
path: '/iterations/$iterationId',
|
|
855
|
+
getParentRoute: () => NavProjectsProjectIdRouteRoute,
|
|
856
|
+
} as any).lazy(() =>
|
|
857
|
+
import('./routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy').then(
|
|
858
|
+
(d) => d.Route,
|
|
859
|
+
),
|
|
860
|
+
)
|
|
827
861
|
const ApiSharePrdPrdIdEventsRoute = ApiSharePrdPrdIdEventsRouteImport.update({
|
|
828
862
|
id: '/api/share/prd/$prdId/events',
|
|
829
863
|
path: '/api/share/prd/$prdId/events',
|
|
@@ -898,6 +932,7 @@ export interface FileRoutesByFullPath {
|
|
|
898
932
|
'/share/law/$id': typeof ShareLawIdRouteRoute
|
|
899
933
|
'/share/prd/$prdId': typeof SharePrdPrdIdRouteRoute
|
|
900
934
|
'/chat/$threadId': typeof NavChatThreadIdRoute
|
|
935
|
+
'/api/attachments/upload': typeof ApiAttachmentsUploadRoute
|
|
901
936
|
'/api/auth/$': typeof ApiAuthSplatRoute
|
|
902
937
|
'/api/auth/desktop-callback': typeof ApiAuthDesktopCallbackRoute
|
|
903
938
|
'/api/design/upload': typeof ApiDesignUploadRoute
|
|
@@ -916,6 +951,7 @@ export interface FileRoutesByFullPath {
|
|
|
916
951
|
'/projects/$projectId/settings': typeof NavProjectsProjectIdSettingsRouteRoute
|
|
917
952
|
'/settings/ai/$providerId': typeof NavSettingsAiProviderIdRouteRoute
|
|
918
953
|
'/workspaces/$workspaceId/settings': typeof NavWorkspacesWorkspaceIdSettingsRouteRoute
|
|
954
|
+
'/api/attachments/$id/content': typeof ApiAttachmentsIdContentRoute
|
|
919
955
|
'/design-files/$projectId/$artboardId/$filename': typeof DesignFilesProjectIdArtboardIdFilenameRoute
|
|
920
956
|
'/settings/ai/': typeof NavSettingsAiIndexRouteLazyRoute
|
|
921
957
|
'/knowledge/bookmarks/$id': typeof NavKnowledgeBookmarksIdLazyRoute
|
|
@@ -930,9 +966,11 @@ export interface FileRoutesByFullPath {
|
|
|
930
966
|
'/knowledge/summary/': typeof NavKnowledgeSummaryIndexLazyRoute
|
|
931
967
|
'/projects/$projectId/': typeof NavProjectsProjectIdIndexLazyRoute
|
|
932
968
|
'/knowledge/$kbId/doc/$docId': typeof NavKnowledgeKbIdDocDocIdRouteRoute
|
|
969
|
+
'/projects/$projectId/iterations/$iterationId': typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
|
|
933
970
|
'/api/share/prd/$prdId/events': typeof ApiSharePrdPrdIdEventsRoute
|
|
934
971
|
'/knowledge/compliance/edit/$id': typeof NavKnowledgeComplianceEditIdLazyRoute
|
|
935
972
|
'/knowledge/laws/edit/$id': typeof NavKnowledgeLawsEditIdLazyRoute
|
|
973
|
+
'/projects/$projectId/iterations/': typeof NavProjectsProjectIdIterationsIndexRoute
|
|
936
974
|
}
|
|
937
975
|
export interface FileRoutesByTo {
|
|
938
976
|
'/': typeof PublicIndexRouteRoute
|
|
@@ -988,6 +1026,7 @@ export interface FileRoutesByTo {
|
|
|
988
1026
|
'/share/law/$id': typeof ShareLawIdRouteRoute
|
|
989
1027
|
'/share/prd/$prdId': typeof SharePrdPrdIdRouteRoute
|
|
990
1028
|
'/chat/$threadId': typeof NavChatThreadIdRoute
|
|
1029
|
+
'/api/attachments/upload': typeof ApiAttachmentsUploadRoute
|
|
991
1030
|
'/api/auth/$': typeof ApiAuthSplatRoute
|
|
992
1031
|
'/api/auth/desktop-callback': typeof ApiAuthDesktopCallbackRoute
|
|
993
1032
|
'/api/design/upload': typeof ApiDesignUploadRoute
|
|
@@ -1006,6 +1045,7 @@ export interface FileRoutesByTo {
|
|
|
1006
1045
|
'/projects/$projectId/settings': typeof NavProjectsProjectIdSettingsRouteRoute
|
|
1007
1046
|
'/settings/ai/$providerId': typeof NavSettingsAiProviderIdRouteRoute
|
|
1008
1047
|
'/workspaces/$workspaceId/settings': typeof NavWorkspacesWorkspaceIdSettingsRouteRoute
|
|
1048
|
+
'/api/attachments/$id/content': typeof ApiAttachmentsIdContentRoute
|
|
1009
1049
|
'/design-files/$projectId/$artboardId/$filename': typeof DesignFilesProjectIdArtboardIdFilenameRoute
|
|
1010
1050
|
'/settings/ai': typeof NavSettingsAiIndexRouteLazyRoute
|
|
1011
1051
|
'/knowledge/bookmarks/$id': typeof NavKnowledgeBookmarksIdLazyRoute
|
|
@@ -1020,9 +1060,11 @@ export interface FileRoutesByTo {
|
|
|
1020
1060
|
'/knowledge/summary': typeof NavKnowledgeSummaryIndexLazyRoute
|
|
1021
1061
|
'/projects/$projectId': typeof NavProjectsProjectIdIndexLazyRoute
|
|
1022
1062
|
'/knowledge/$kbId/doc/$docId': typeof NavKnowledgeKbIdDocDocIdRouteRoute
|
|
1063
|
+
'/projects/$projectId/iterations/$iterationId': typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
|
|
1023
1064
|
'/api/share/prd/$prdId/events': typeof ApiSharePrdPrdIdEventsRoute
|
|
1024
1065
|
'/knowledge/compliance/edit/$id': typeof NavKnowledgeComplianceEditIdLazyRoute
|
|
1025
1066
|
'/knowledge/laws/edit/$id': typeof NavKnowledgeLawsEditIdLazyRoute
|
|
1067
|
+
'/projects/$projectId/iterations': typeof NavProjectsProjectIdIterationsIndexRoute
|
|
1026
1068
|
}
|
|
1027
1069
|
export interface FileRoutesById {
|
|
1028
1070
|
__root__: typeof rootRouteImport
|
|
@@ -1096,6 +1138,7 @@ export interface FileRoutesById {
|
|
|
1096
1138
|
'/share/law/$id': typeof ShareLawIdRouteRoute
|
|
1097
1139
|
'/share/prd/$prdId': typeof SharePrdPrdIdRouteRoute
|
|
1098
1140
|
'/_nav/chat/$threadId': typeof NavChatThreadIdRoute
|
|
1141
|
+
'/api/attachments/upload': typeof ApiAttachmentsUploadRoute
|
|
1099
1142
|
'/api/auth/$': typeof ApiAuthSplatRoute
|
|
1100
1143
|
'/api/auth/desktop-callback': typeof ApiAuthDesktopCallbackRoute
|
|
1101
1144
|
'/api/design/upload': typeof ApiDesignUploadRoute
|
|
@@ -1114,6 +1157,7 @@ export interface FileRoutesById {
|
|
|
1114
1157
|
'/_nav/projects/$projectId/settings': typeof NavProjectsProjectIdSettingsRouteRoute
|
|
1115
1158
|
'/_nav/settings/ai/$providerId': typeof NavSettingsAiProviderIdRouteRoute
|
|
1116
1159
|
'/_nav/workspaces/$workspaceId/settings': typeof NavWorkspacesWorkspaceIdSettingsRouteRoute
|
|
1160
|
+
'/api/attachments/$id/content': typeof ApiAttachmentsIdContentRoute
|
|
1117
1161
|
'/design-files/$projectId/$artboardId/$filename': typeof DesignFilesProjectIdArtboardIdFilenameRoute
|
|
1118
1162
|
'/_nav/settings/ai/': typeof NavSettingsAiIndexRouteLazyRoute
|
|
1119
1163
|
'/_nav/knowledge/bookmarks/$id': typeof NavKnowledgeBookmarksIdLazyRoute
|
|
@@ -1128,9 +1172,11 @@ export interface FileRoutesById {
|
|
|
1128
1172
|
'/_nav/knowledge/summary/': typeof NavKnowledgeSummaryIndexLazyRoute
|
|
1129
1173
|
'/_nav/projects/$projectId/': typeof NavProjectsProjectIdIndexLazyRoute
|
|
1130
1174
|
'/_nav/knowledge/$kbId/doc/$docId': typeof NavKnowledgeKbIdDocDocIdRouteRoute
|
|
1175
|
+
'/_nav/projects/$projectId/iterations/$iterationId': typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
|
|
1131
1176
|
'/api/share/prd/$prdId/events': typeof ApiSharePrdPrdIdEventsRoute
|
|
1132
1177
|
'/_nav/knowledge/compliance/edit/$id': typeof NavKnowledgeComplianceEditIdLazyRoute
|
|
1133
1178
|
'/_nav/knowledge/laws/edit/$id': typeof NavKnowledgeLawsEditIdLazyRoute
|
|
1179
|
+
'/_nav/projects/$projectId/iterations/': typeof NavProjectsProjectIdIterationsIndexRoute
|
|
1134
1180
|
}
|
|
1135
1181
|
export interface FileRouteTypes {
|
|
1136
1182
|
fileRoutesByFullPath: FileRoutesByFullPath
|
|
@@ -1202,6 +1248,7 @@ export interface FileRouteTypes {
|
|
|
1202
1248
|
| '/share/law/$id'
|
|
1203
1249
|
| '/share/prd/$prdId'
|
|
1204
1250
|
| '/chat/$threadId'
|
|
1251
|
+
| '/api/attachments/upload'
|
|
1205
1252
|
| '/api/auth/$'
|
|
1206
1253
|
| '/api/auth/desktop-callback'
|
|
1207
1254
|
| '/api/design/upload'
|
|
@@ -1220,6 +1267,7 @@ export interface FileRouteTypes {
|
|
|
1220
1267
|
| '/projects/$projectId/settings'
|
|
1221
1268
|
| '/settings/ai/$providerId'
|
|
1222
1269
|
| '/workspaces/$workspaceId/settings'
|
|
1270
|
+
| '/api/attachments/$id/content'
|
|
1223
1271
|
| '/design-files/$projectId/$artboardId/$filename'
|
|
1224
1272
|
| '/settings/ai/'
|
|
1225
1273
|
| '/knowledge/bookmarks/$id'
|
|
@@ -1234,9 +1282,11 @@ export interface FileRouteTypes {
|
|
|
1234
1282
|
| '/knowledge/summary/'
|
|
1235
1283
|
| '/projects/$projectId/'
|
|
1236
1284
|
| '/knowledge/$kbId/doc/$docId'
|
|
1285
|
+
| '/projects/$projectId/iterations/$iterationId'
|
|
1237
1286
|
| '/api/share/prd/$prdId/events'
|
|
1238
1287
|
| '/knowledge/compliance/edit/$id'
|
|
1239
1288
|
| '/knowledge/laws/edit/$id'
|
|
1289
|
+
| '/projects/$projectId/iterations/'
|
|
1240
1290
|
fileRoutesByTo: FileRoutesByTo
|
|
1241
1291
|
to:
|
|
1242
1292
|
| '/'
|
|
@@ -1292,6 +1342,7 @@ export interface FileRouteTypes {
|
|
|
1292
1342
|
| '/share/law/$id'
|
|
1293
1343
|
| '/share/prd/$prdId'
|
|
1294
1344
|
| '/chat/$threadId'
|
|
1345
|
+
| '/api/attachments/upload'
|
|
1295
1346
|
| '/api/auth/$'
|
|
1296
1347
|
| '/api/auth/desktop-callback'
|
|
1297
1348
|
| '/api/design/upload'
|
|
@@ -1310,6 +1361,7 @@ export interface FileRouteTypes {
|
|
|
1310
1361
|
| '/projects/$projectId/settings'
|
|
1311
1362
|
| '/settings/ai/$providerId'
|
|
1312
1363
|
| '/workspaces/$workspaceId/settings'
|
|
1364
|
+
| '/api/attachments/$id/content'
|
|
1313
1365
|
| '/design-files/$projectId/$artboardId/$filename'
|
|
1314
1366
|
| '/settings/ai'
|
|
1315
1367
|
| '/knowledge/bookmarks/$id'
|
|
@@ -1324,9 +1376,11 @@ export interface FileRouteTypes {
|
|
|
1324
1376
|
| '/knowledge/summary'
|
|
1325
1377
|
| '/projects/$projectId'
|
|
1326
1378
|
| '/knowledge/$kbId/doc/$docId'
|
|
1379
|
+
| '/projects/$projectId/iterations/$iterationId'
|
|
1327
1380
|
| '/api/share/prd/$prdId/events'
|
|
1328
1381
|
| '/knowledge/compliance/edit/$id'
|
|
1329
1382
|
| '/knowledge/laws/edit/$id'
|
|
1383
|
+
| '/projects/$projectId/iterations'
|
|
1330
1384
|
id:
|
|
1331
1385
|
| '__root__'
|
|
1332
1386
|
| '/_login'
|
|
@@ -1399,6 +1453,7 @@ export interface FileRouteTypes {
|
|
|
1399
1453
|
| '/share/law/$id'
|
|
1400
1454
|
| '/share/prd/$prdId'
|
|
1401
1455
|
| '/_nav/chat/$threadId'
|
|
1456
|
+
| '/api/attachments/upload'
|
|
1402
1457
|
| '/api/auth/$'
|
|
1403
1458
|
| '/api/auth/desktop-callback'
|
|
1404
1459
|
| '/api/design/upload'
|
|
@@ -1417,6 +1472,7 @@ export interface FileRouteTypes {
|
|
|
1417
1472
|
| '/_nav/projects/$projectId/settings'
|
|
1418
1473
|
| '/_nav/settings/ai/$providerId'
|
|
1419
1474
|
| '/_nav/workspaces/$workspaceId/settings'
|
|
1475
|
+
| '/api/attachments/$id/content'
|
|
1420
1476
|
| '/design-files/$projectId/$artboardId/$filename'
|
|
1421
1477
|
| '/_nav/settings/ai/'
|
|
1422
1478
|
| '/_nav/knowledge/bookmarks/$id'
|
|
@@ -1431,9 +1487,11 @@ export interface FileRouteTypes {
|
|
|
1431
1487
|
| '/_nav/knowledge/summary/'
|
|
1432
1488
|
| '/_nav/projects/$projectId/'
|
|
1433
1489
|
| '/_nav/knowledge/$kbId/doc/$docId'
|
|
1490
|
+
| '/_nav/projects/$projectId/iterations/$iterationId'
|
|
1434
1491
|
| '/api/share/prd/$prdId/events'
|
|
1435
1492
|
| '/_nav/knowledge/compliance/edit/$id'
|
|
1436
1493
|
| '/_nav/knowledge/laws/edit/$id'
|
|
1494
|
+
| '/_nav/projects/$projectId/iterations/'
|
|
1437
1495
|
fileRoutesById: FileRoutesById
|
|
1438
1496
|
}
|
|
1439
1497
|
export interface RootRouteChildren {
|
|
@@ -1452,12 +1510,14 @@ export interface RootRouteChildren {
|
|
|
1452
1510
|
ServerWsRoute: typeof ServerWsRoute
|
|
1453
1511
|
ApiLicenseActivateRouteRoute: typeof ApiLicenseActivateRouteRoute
|
|
1454
1512
|
ApiLicenseHeartbeatRouteRoute: typeof ApiLicenseHeartbeatRouteRoute
|
|
1513
|
+
ApiAttachmentsUploadRoute: typeof ApiAttachmentsUploadRoute
|
|
1455
1514
|
ApiAuthSplatRoute: typeof ApiAuthSplatRoute
|
|
1456
1515
|
ApiAuthDesktopCallbackRoute: typeof ApiAuthDesktopCallbackRoute
|
|
1457
1516
|
ApiDesignUploadRoute: typeof ApiDesignUploadRoute
|
|
1458
1517
|
ApiKnowledgeSyncGithubRoute: typeof ApiKnowledgeSyncGithubRoute
|
|
1459
1518
|
ApiNotificationsStreamRoute: typeof ApiNotificationsStreamRoute
|
|
1460
1519
|
ServerAnyhubProxySplatRoute: typeof ServerAnyhubProxySplatRoute
|
|
1520
|
+
ApiAttachmentsIdContentRoute: typeof ApiAttachmentsIdContentRoute
|
|
1461
1521
|
DesignFilesProjectIdArtboardIdFilenameRoute: typeof DesignFilesProjectIdArtboardIdFilenameRoute
|
|
1462
1522
|
ApiSharePrdPrdIdEventsRoute: typeof ApiSharePrdPrdIdEventsRoute
|
|
1463
1523
|
}
|
|
@@ -1961,6 +2021,13 @@ declare module '@tanstack/react-router' {
|
|
|
1961
2021
|
preLoaderRoute: typeof NavWorkspacesWorkspaceIdRouteRouteImport
|
|
1962
2022
|
parentRoute: typeof NavWorkspacesRouteRoute
|
|
1963
2023
|
}
|
|
2024
|
+
'/api/attachments/upload': {
|
|
2025
|
+
id: '/api/attachments/upload'
|
|
2026
|
+
path: '/api/attachments/upload'
|
|
2027
|
+
fullPath: '/api/attachments/upload'
|
|
2028
|
+
preLoaderRoute: typeof ApiAttachmentsUploadRouteImport
|
|
2029
|
+
parentRoute: typeof rootRouteImport
|
|
2030
|
+
}
|
|
1964
2031
|
'/api/auth/$': {
|
|
1965
2032
|
id: '/api/auth/$'
|
|
1966
2033
|
path: '/api/auth/$'
|
|
@@ -2164,6 +2231,13 @@ declare module '@tanstack/react-router' {
|
|
|
2164
2231
|
preLoaderRoute: typeof NavWorkspacesWorkspaceIdSettingsRouteRouteImport
|
|
2165
2232
|
parentRoute: typeof NavWorkspacesWorkspaceIdRouteRoute
|
|
2166
2233
|
}
|
|
2234
|
+
'/api/attachments/$id/content': {
|
|
2235
|
+
id: '/api/attachments/$id/content'
|
|
2236
|
+
path: '/api/attachments/$id/content'
|
|
2237
|
+
fullPath: '/api/attachments/$id/content'
|
|
2238
|
+
preLoaderRoute: typeof ApiAttachmentsIdContentRouteImport
|
|
2239
|
+
parentRoute: typeof rootRouteImport
|
|
2240
|
+
}
|
|
2167
2241
|
'/design-files/$projectId/$artboardId/$filename': {
|
|
2168
2242
|
id: '/design-files/$projectId/$artboardId/$filename'
|
|
2169
2243
|
path: '/design-files/$projectId/$artboardId/$filename'
|
|
@@ -2192,6 +2266,20 @@ declare module '@tanstack/react-router' {
|
|
|
2192
2266
|
preLoaderRoute: typeof NavKnowledgeLawsEditIdLazyRouteImport
|
|
2193
2267
|
parentRoute: typeof NavKnowledgeLawsRouteRoute
|
|
2194
2268
|
}
|
|
2269
|
+
'/_nav/projects/$projectId/iterations/': {
|
|
2270
|
+
id: '/_nav/projects/$projectId/iterations/'
|
|
2271
|
+
path: '/iterations'
|
|
2272
|
+
fullPath: '/projects/$projectId/iterations/'
|
|
2273
|
+
preLoaderRoute: typeof NavProjectsProjectIdIterationsIndexRouteImport
|
|
2274
|
+
parentRoute: typeof NavProjectsProjectIdRouteRoute
|
|
2275
|
+
}
|
|
2276
|
+
'/_nav/projects/$projectId/iterations/$iterationId': {
|
|
2277
|
+
id: '/_nav/projects/$projectId/iterations/$iterationId'
|
|
2278
|
+
path: '/iterations/$iterationId'
|
|
2279
|
+
fullPath: '/projects/$projectId/iterations/$iterationId'
|
|
2280
|
+
preLoaderRoute: typeof NavProjectsProjectIdIterationsIterationIdRouteRouteImport
|
|
2281
|
+
parentRoute: typeof NavProjectsProjectIdRouteRoute
|
|
2282
|
+
}
|
|
2195
2283
|
'/api/share/prd/$prdId/events': {
|
|
2196
2284
|
id: '/api/share/prd/$prdId/events'
|
|
2197
2285
|
path: '/api/share/prd/$prdId/events'
|
|
@@ -2425,6 +2513,8 @@ interface NavProjectsProjectIdRouteRouteChildren {
|
|
|
2425
2513
|
NavProjectsProjectIdStoryIdRouteRoute: typeof NavProjectsProjectIdStoryIdRouteRoute
|
|
2426
2514
|
NavProjectsProjectIdSettingsRouteRoute: typeof NavProjectsProjectIdSettingsRouteRoute
|
|
2427
2515
|
NavProjectsProjectIdIndexLazyRoute: typeof NavProjectsProjectIdIndexLazyRoute
|
|
2516
|
+
NavProjectsProjectIdIterationsIterationIdRouteRoute: typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
|
|
2517
|
+
NavProjectsProjectIdIterationsIndexRoute: typeof NavProjectsProjectIdIterationsIndexRoute
|
|
2428
2518
|
}
|
|
2429
2519
|
|
|
2430
2520
|
const NavProjectsProjectIdRouteRouteChildren: NavProjectsProjectIdRouteRouteChildren =
|
|
@@ -2434,6 +2524,10 @@ const NavProjectsProjectIdRouteRouteChildren: NavProjectsProjectIdRouteRouteChil
|
|
|
2434
2524
|
NavProjectsProjectIdSettingsRouteRoute:
|
|
2435
2525
|
NavProjectsProjectIdSettingsRouteRoute,
|
|
2436
2526
|
NavProjectsProjectIdIndexLazyRoute: NavProjectsProjectIdIndexLazyRoute,
|
|
2527
|
+
NavProjectsProjectIdIterationsIterationIdRouteRoute:
|
|
2528
|
+
NavProjectsProjectIdIterationsIterationIdRouteRoute,
|
|
2529
|
+
NavProjectsProjectIdIterationsIndexRoute:
|
|
2530
|
+
NavProjectsProjectIdIterationsIndexRoute,
|
|
2437
2531
|
}
|
|
2438
2532
|
|
|
2439
2533
|
const NavProjectsProjectIdRouteRouteWithChildren =
|
|
@@ -2651,12 +2745,14 @@ const rootRouteChildren: RootRouteChildren = {
|
|
|
2651
2745
|
ServerWsRoute: ServerWsRoute,
|
|
2652
2746
|
ApiLicenseActivateRouteRoute: ApiLicenseActivateRouteRoute,
|
|
2653
2747
|
ApiLicenseHeartbeatRouteRoute: ApiLicenseHeartbeatRouteRoute,
|
|
2748
|
+
ApiAttachmentsUploadRoute: ApiAttachmentsUploadRoute,
|
|
2654
2749
|
ApiAuthSplatRoute: ApiAuthSplatRoute,
|
|
2655
2750
|
ApiAuthDesktopCallbackRoute: ApiAuthDesktopCallbackRoute,
|
|
2656
2751
|
ApiDesignUploadRoute: ApiDesignUploadRoute,
|
|
2657
2752
|
ApiKnowledgeSyncGithubRoute: ApiKnowledgeSyncGithubRoute,
|
|
2658
2753
|
ApiNotificationsStreamRoute: ApiNotificationsStreamRoute,
|
|
2659
2754
|
ServerAnyhubProxySplatRoute: ServerAnyhubProxySplatRoute,
|
|
2755
|
+
ApiAttachmentsIdContentRoute: ApiAttachmentsIdContentRoute,
|
|
2660
2756
|
DesignFilesProjectIdArtboardIdFilenameRoute:
|
|
2661
2757
|
DesignFilesProjectIdArtboardIdFilenameRoute,
|
|
2662
2758
|
ApiSharePrdPrdIdEventsRoute: ApiSharePrdPrdIdEventsRoute,
|