@allbluecn/web-app 0.19.5 → 0.21.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 +3 -3
- package/src/components/bug/__tests__/board-subgroups.test.tsx +1 -1
- package/src/components/bug/__tests__/board-view.test.tsx +1 -1
- package/src/components/bug/__tests__/comment-reactions.test.tsx +1 -1
- package/src/components/bug/__tests__/create-bug-dialog.test.tsx +2 -2
- package/src/components/bug/__tests__/filters-compat.test.tsx +1 -1
- package/src/components/bug/__tests__/fix-request-race.test.tsx +1 -1
- package/src/components/bug/__tests__/peek-modes.test.tsx +1 -1
- package/src/components/bug/__tests__/use-paged-bug-groups.test.tsx +1 -1
- package/src/components/bug/__tests__/view-type.test.tsx +1 -1
- package/src/components/bug/bug-list-view.tsx +2 -2
- package/src/components/bug/bug-toolbar.tsx +1 -1
- package/src/components/bug/create-bug-dialog.tsx +3 -3
- package/src/components/bug/detail/__tests__/activity-timeline.test.tsx +1 -1
- package/src/components/bug/detail/__tests__/bug-detail-collab.test.tsx +1 -1
- package/src/components/bug/detail/__tests__/repro-report-card.test.tsx +1 -1
- package/src/components/bug/detail/activity-tabs.tsx +34 -3
- package/src/components/bug/detail/activity-timeline.tsx +1 -1
- package/src/components/bug/detail/bug-detail-body.tsx +3 -3
- package/src/components/bug/detail/comment-input.tsx +1 -1
- package/src/components/bug/detail/comment-item.tsx +1 -1
- package/src/components/bug/detail/comment-reactions.tsx +1 -1
- package/src/components/bug/detail/comment-thread.tsx +1 -1
- package/src/components/bug/detail/props-section.tsx +2 -2
- package/src/components/bug/detail/repro-report-card.tsx +1 -1
- package/src/components/bug/detail/reproduce-steps-view.tsx +1 -1
- package/src/components/bug/display/use-paged-bug-groups.ts +2 -2
- package/src/components/bug/filters/field-configs.tsx +1 -1
- package/src/components/bug/inline-editors/assignee-editor.tsx +1 -1
- package/src/components/bug/peek-panel.tsx +2 -2
- package/src/components/bug/reproduce-steps-editor.tsx +1 -1
- package/src/components/bug/story-bugs-panel.tsx +10 -6
- package/src/components/bug/views/board-view.tsx +2 -2
- package/src/components/bug/views/bug-list/batch-toolbar.tsx +1 -1
- package/src/components/bug/views/bug-list/group.tsx +1 -1
- package/src/components/bug/views/bug-list/index.tsx +1 -1
- package/src/components/bug/views/bug-list/inline-bug-creator.tsx +1 -1
- package/src/components/bug/views/bug-list/row.tsx +2 -2
- package/src/components/bug/views/create-view-dialog.tsx +1 -1
- package/src/components/design/editor/versions/hooks/use-design-versions.ts +11 -4
- package/src/components/design/editor/versions/page-version-panel.tsx +30 -11
- package/src/components/harness/code/workspace-context.tsx +5 -1
- package/src/components/harness/code/workspace-picker.tsx +19 -6
- package/src/components/harness/composer/harness-composer.tsx +25 -3
- package/src/components/harness/composer/mention/mention-resolvers.ts +2 -0
- package/src/components/harness/composer/mention/mention-suggestion-menu.tsx +6 -3
- package/src/components/harness/composer/mention/use-mention-sources.ts +1 -1
- package/src/components/iteration/iteration-progress-bar.tsx +2 -2
- package/src/components/knowledge/public/legal-compliance-editor.tsx +1 -1
- package/src/components/layout/sidebar-03/nav-knowledge.tsx +1 -1
- package/src/components/layout/sidebar-03/nav-workspace.tsx +1 -1
- package/src/components/project/invite-member-dialog.tsx +2 -2
- package/src/components/project/project-member-manager.tsx +0 -3
- package/src/components/shared-kit/list-kit/kanban/__tests__/instance-key.test.ts +1 -1
- package/src/components/story/__tests__/constants.test.ts +1 -1
- package/src/components/story/__tests__/dependency-type-badge.test.ts +1 -1
- package/src/components/story/__tests__/peek-panel-patch-sync.test.tsx +1 -1
- package/src/components/story/__tests__/story-list-view-peek-sync.test.tsx +1 -1
- package/src/components/story/ai/story-ai-panel.tsx +1 -1
- package/src/components/story/ai/story-ai-preview-list.tsx +2 -2
- package/src/components/story/ai/use-story-ai-model.ts +17 -4
- package/src/components/story/columns.tsx +2 -2
- package/src/components/story/create-story-dialog.tsx +4 -4
- package/src/components/story/detail/__tests__/activity-timeline.test.tsx +1 -1
- package/src/components/story/detail/__tests__/associated-attachments-panel.test.tsx +1 -1
- package/src/components/story/detail/__tests__/story-collab.test.tsx +1 -1
- package/src/components/story/detail/activity-tabs.tsx +1 -1
- package/src/components/story/detail/activity-timeline.tsx +36 -17
- package/src/components/story/detail/comment-input.tsx +1 -1
- package/src/components/story/detail/comment-item.tsx +1 -1
- package/src/components/story/detail/comment-thread.tsx +1 -1
- package/src/components/story/detail/reaction-bar.tsx +1 -1
- package/src/components/story/detail/story-detail-body.tsx +4 -4
- package/src/components/story/detail/story-detail-toolbar/__tests__/attachment-cache.test.ts +83 -0
- package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +50 -9
- package/src/components/story/detail/story-detail-toolbar/children.tsx +3 -3
- package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +9 -8
- package/src/components/story/detail/story-detail-toolbar/index.tsx +8 -8
- package/src/components/story/detail/story-detail-toolbar/related-test-cases.tsx +2 -2
- package/src/components/story/detail/story-properties.tsx +2 -2
- package/src/components/story/display/__tests__/flatten-story-groups.test.ts +1 -1
- package/src/components/story/display/__tests__/group-fields.test.ts +1 -1
- package/src/components/story/display/__tests__/group-resolver.test.ts +2 -2
- package/src/components/story/display/__tests__/order-resolver.test.ts +1 -1
- package/src/components/story/display/__tests__/use-grouped-stories.test.ts +1 -1
- package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +1 -1
- package/src/components/story/display/flatten-story-groups.ts +1 -1
- package/src/components/story/display/group-fields.ts +2 -2
- package/src/components/story/display/group-resolver.tsx +4 -4
- package/src/components/story/display/order-resolver.ts +3 -3
- package/src/components/story/display/types.ts +5 -4
- package/src/components/story/display/use-grouped-stories.ts +5 -5
- package/src/components/story/display/use-paged-story-groups.ts +11 -4
- package/src/components/story/entity-overlay.ts +24 -0
- package/src/components/story/filters/field-configs.tsx +2 -2
- package/src/components/story/inline-editors/assignee-editor.tsx +1 -1
- package/src/components/story/inline-editors/dependency-type-select.tsx +1 -1
- package/src/components/story/inline-editors/parent-story-editor.tsx +2 -2
- package/src/components/story/inline-editors/priority-editor.tsx +2 -2
- package/src/components/story/inline-editors/state-editor.tsx +2 -2
- package/src/components/story/inline-editors/story-select-dialog.tsx +2 -2
- package/src/components/story/peek-panel.tsx +6 -5
- package/src/components/story/priority-icon.tsx +2 -2
- package/src/components/story/relations/__tests__/attachment-manage-dialog.test.tsx +1 -1
- package/src/components/story/relations/__tests__/design-select-dialog.test.tsx +1 -1
- package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +1 -1
- package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +1 -1
- package/src/components/story/relations/attachment-manage-dialog.tsx +4 -4
- package/src/components/story/relations/design-select-dialog.tsx +2 -2
- package/src/components/story/relations/knowledge-select-dialog.tsx +2 -2
- package/src/components/story/relations/link-manage-dialog.tsx +2 -2
- package/src/components/story/relations/story-ref-row.tsx +3 -3
- package/src/components/story/story-list-table.tsx +1 -1
- package/src/components/story/story-list-view.tsx +1 -1
- package/src/components/story/story-toolbar.tsx +1 -1
- package/src/components/story/transfer-story-popover.tsx +3 -2
- package/src/components/story/views/__tests__/calendar-view.test.tsx +1 -1
- package/src/components/story/views/__tests__/kanban-drop-subgroup.test.ts +1 -1
- package/src/components/story/views/__tests__/kanban-peek-sync.test.tsx +2 -2
- package/src/components/story/views/__tests__/kanban-view-membership-sync.test.tsx +1 -1
- package/src/components/story/views/__tests__/timeline-view.test.tsx +1 -1
- package/src/components/story/views/calendar/__tests__/mappers.test.ts +1 -1
- package/src/components/story/views/calendar/mappers.ts +1 -1
- package/src/components/story/views/calendar-view.tsx +1 -1
- package/src/components/story/views/create-view-dialog.tsx +1 -1
- package/src/components/story/views/kanban-view.tsx +2 -2
- package/src/components/story/views/story-list/batch-preview-dialog.tsx +2 -2
- package/src/components/story/views/story-list/batch-toolbar.tsx +3 -3
- package/src/components/story/views/story-list/group.tsx +18 -5
- package/src/components/story/views/story-list/index.tsx +4 -2
- package/src/components/story/views/story-list/inline-story-creator.tsx +2 -2
- package/src/components/story/views/story-list/row.tsx +2 -2
- package/src/components/story/views/story-list/use-flat-rows.ts +1 -1
- package/src/components/story/views/timeline/__tests__/mappers.test.ts +2 -2
- package/src/components/story/views/timeline/mappers.ts +2 -2
- package/src/components/story/views/timeline/use-date-commit.ts +1 -1
- package/src/components/story/views/timeline-view.tsx +2 -2
- package/src/components/testcase/__tests__/case-row.test.tsx +1 -1
- package/src/components/testcase/__tests__/create-dialog-scope.test.tsx +1 -1
- package/src/components/testcase/__tests__/display-options.test.tsx +1 -1
- package/src/components/testcase/__tests__/export-entry.test.tsx +1 -1
- package/src/components/testcase/__tests__/list-view.test.tsx +1 -1
- package/src/components/testcase/__tests__/step-editor.test.tsx +4 -2
- package/src/components/testcase/__tests__/toolbar.test.tsx +1 -1
- package/src/components/testcase/create-testcase-dialog.tsx +6 -5
- package/src/components/testcase/detail/case-detail-body.tsx +1 -1
- package/src/components/testcase/detail/properties.tsx +1 -1
- package/src/components/testcase/display/display-dropdown.tsx +2 -2
- package/src/components/testcase/display/use-testcase-display-options.ts +1 -1
- package/src/components/testcase/filters/field-configs.tsx +1 -1
- package/src/components/testcase/generation/draft-card.tsx +2 -2
- package/src/components/testcase/inline-editors/assignee-editor.tsx +1 -1
- package/src/components/testcase/list/case-row.tsx +1 -1
- package/src/components/testcase/list/grouped-list.tsx +1 -1
- package/src/components/testcase/list-view.tsx +2 -2
- package/src/components/testcase/runs/convert-bug-button.tsx +2 -2
- package/src/components/testcase/step-editor.tsx +13 -2
- package/src/components/testcase/testcase-toolbar.tsx +2 -2
- package/src/components/testcase/views/batch-toolbar.tsx +1 -1
- package/src/components/testcase/views/board-view.tsx +2 -2
- package/src/lib/changelog/sdk-versions.ts +2 -2
- package/src/lib/collections/knowledge/knowledge-bases-collection.ts +2 -1
- package/src/lib/collections/query-keys.ts +18 -0
- package/src/lib/collections/reference/users-brief-collection.ts +2 -1
- package/src/lib/collections/reference/workspaces-collection.ts +2 -1
- package/src/lib/story/__tests__/activity-grouper.test.ts +1 -1
- package/src/lib/story/activity-grouper.ts +1 -1
- package/src/paraglide/messages/_index.d.ts +2 -0
- package/src/paraglide/messages/_index.js +88269 -5642
- package/src/paraglide/messages/en.js +28255 -0
- package/src/paraglide/messages/story_group_loadfailed1.d.ts +17 -0
- package/src/paraglide/messages/story_group_loadfailed1.js +30 -0
- package/src/paraglide/messages/story_group_retry.d.ts +16 -0
- package/src/paraglide/messages/story_group_retry.js +29 -0
- package/src/paraglide/messages/zh.js +28253 -0
- package/src/routes/_nav/bugs/$bugId/route.lazy.tsx +2 -2
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +1 -1
- package/src/routes/_nav/route.tsx +1 -2
- package/src/routes/_nav/stories/$storyId/route.lazy.tsx +2 -2
- package/src/routes/_nav/stories/$storyId/route.tsx +1 -1
- package/src/routes/api/design/prototype/__tests__/route.test.ts +4 -1
- package/src/server/__tests__/task-executor.test.ts +7 -0
- package/src/server/ai-gateway/__tests__/ai-output-guard.test.ts +4 -4
- package/src/server/ai-gateway/__tests__/tools-authorization.test.ts +25 -0
- package/src/server/ai-gateway/tools/server.ts +24 -15
- package/src/server/knowledge/reindex-guard.ts +35 -0
- package/src/server/lib/__tests__/cron-auth.test.ts +1 -1
- package/src/server/serverFns/__tests__/legal-code-canonical.test.ts +169 -0
- package/src/server/serverFns/__tests__/story-tree.test.ts +0 -1
- package/src/server/serverFns/__tests__/story-types.test.ts +2 -1
- package/src/server/serverFns/__tests__/update-bug-guard.test.ts +1 -1
- package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +95 -44
- package/src/server/serverFns/bug/__tests__/bug-crud.test.ts +46 -18
- package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +1 -1
- package/src/server/serverFns/bug/bug-activities.ts +2 -2
- package/src/server/serverFns/bug/bug-comments.ts +44 -19
- package/src/server/serverFns/bug/bug-crud/detail-select.ts +1 -1
- package/src/server/serverFns/bug/bug-crud/detail.ts +2 -2
- package/src/server/serverFns/bug/bug-crud.ts +142 -110
- package/src/server/serverFns/bug/bug-group-query.ts +1 -1
- package/src/server/serverFns/bug/bug-groups.ts +2 -2
- package/src/server/serverFns/bug/bug-story-utils.ts +1 -1
- package/src/server/serverFns/chat/conversations.ts +27 -13
- package/src/server/serverFns/harness/github-workspace.ts +32 -25
- package/src/server/serverFns/harness/search-mention-candidates.ts +3 -1
- package/src/server/serverFns/iteration/iteration-crud.ts +1 -1
- package/src/server/serverFns/knowledge/public/legal/create.ts +3 -0
- package/src/server/serverFns/knowledge/public/legal/update.ts +8 -8
- package/src/server/serverFns/knowledge-index.ts +12 -5
- package/src/server/serverFns/project.ts +5 -11
- package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +15 -4
- package/src/server/serverFns/story/__tests__/story-transfer.test.ts +20 -0
- package/src/server/serverFns/story/link-preview.ts +3 -2
- package/src/server/serverFns/story/story-children.ts +1 -1
- package/src/server/serverFns/story/story-comments.ts +1 -1
- package/src/server/serverFns/story/story-crud/bulk.ts +1 -1
- package/src/server/serverFns/story/story-crud.ts +1 -1
- package/src/server/serverFns/story/story-dependencies.ts +61 -69
- package/src/server/serverFns/story/story-groups.ts +1 -1
- package/src/server/serverFns/story/story-transfer.ts +8 -20
- package/src/server/serverFns/testcase/__tests__/automation.test.ts +21 -0
- package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +1 -1
- package/src/server/serverFns/testcase/automation.ts +24 -1
- package/src/server/serverFns/testcase/testcase-board.ts +1 -1
- package/src/server/serverFns/testcase/testcase-crud.ts +1 -1
- package/src/server/serverFns/testcase/testcase-display-options.ts +1 -1
- package/src/server/serverFns/testcase/testcase-filter-views.ts +1 -1
- package/src/server/serverFns/testcase/types.ts +1 -1
- package/src/server/story/types.ts +7 -3
- package/src/shared/bug/__tests__/constants.test.ts +1 -1
- package/src/{components → shared}/bug/types.ts +4 -3
- package/src/{components → shared}/story/constants.ts +1 -1
- package/src/{components → shared}/story/types.ts +1 -7
- package/src/types/project.ts +1 -2
- /package/src/{components/testcase/display → shared/testcase}/field-configs.ts +0 -0
|
@@ -202,6 +202,27 @@ beforeEach(() => {
|
|
|
202
202
|
});
|
|
203
203
|
|
|
204
204
|
describe("generateArtifactFn", () => {
|
|
205
|
+
it("S22:同 case+kind 并发生成被服务端守卫拒绝,完成后可再次生成", async () => {
|
|
206
|
+
M.runChatAsAgent.mockImplementation(async () => {
|
|
207
|
+
// 拉长首例生成,制造 in-flight 窗口
|
|
208
|
+
await new Promise((r) => setTimeout(r, 30));
|
|
209
|
+
return aiOutput();
|
|
210
|
+
});
|
|
211
|
+
M.runVitestSpec.mockResolvedValue(runResult());
|
|
212
|
+
|
|
213
|
+
const first = generateArtifactFn({ data: { caseId: CASE_ID, kind: "unit" } });
|
|
214
|
+
await expect(
|
|
215
|
+
generateArtifactFn({ data: { caseId: CASE_ID, kind: "unit" } }),
|
|
216
|
+
).rejects.toThrow("正在生成中");
|
|
217
|
+
await expect(first).resolves.toMatchObject({ artifact: expect.anything() });
|
|
218
|
+
|
|
219
|
+
// 释放后可再次生成
|
|
220
|
+
M.runChatAsAgent.mockResolvedValue(aiOutput());
|
|
221
|
+
await expect(
|
|
222
|
+
generateArtifactFn({ data: { caseId: CASE_ID, kind: "unit" } }),
|
|
223
|
+
).resolves.toMatchObject({ artifact: expect.anything() });
|
|
224
|
+
});
|
|
225
|
+
|
|
205
226
|
it("requireFeature 第一行门控 + AI 调用走 testgen bizKey + testcase.automation promptKey 覆盖", async () => {
|
|
206
227
|
M.runChatAsAgent.mockResolvedValue(aiOutput());
|
|
207
228
|
M.runVitestSpec.mockResolvedValue(runResult());
|
|
@@ -94,7 +94,7 @@ import {
|
|
|
94
94
|
updateFilterViewFn,
|
|
95
95
|
deleteFilterViewFn,
|
|
96
96
|
} from "../testcase-filter-views";
|
|
97
|
-
import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/
|
|
97
|
+
import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/shared/testcase/field-configs";
|
|
98
98
|
|
|
99
99
|
const U = "u-1";
|
|
100
100
|
const P = "pr-1";
|
|
@@ -170,6 +170,12 @@ const generateArtifactInputSchema = z.object({
|
|
|
170
170
|
targetSourcePath: z.string().min(1).optional(),
|
|
171
171
|
});
|
|
172
172
|
|
|
173
|
+
// S22(审计 A2x ⚪ 防重入半部):同 case+kind 的生成任务进程内互斥——长链路
|
|
174
|
+
// (2 轮 AI + 2 轮沙箱)期间重复触发会双倍消耗配额并产生并发写。进程内存态
|
|
175
|
+
// (与 reindex-guard/rate-limit 同边界声明:多实例不共享);全量异步化(任务
|
|
176
|
+
// 队列 + 轮询 UI)属架构任务,需产品确认进度/取消交互后另行立项。
|
|
177
|
+
const inFlightArtifactJobs = new Set<string>();
|
|
178
|
+
|
|
173
179
|
export const generateArtifactFn = createServerFn({ method: "POST" })
|
|
174
180
|
.validator(generateArtifactInputSchema)
|
|
175
181
|
.handler(async ({ data }) => {
|
|
@@ -184,6 +190,23 @@ export const generateArtifactFn = createServerFn({ method: "POST" })
|
|
|
184
190
|
throw new Error("AI 未配置,请先前往 AI 设置页配置 API Key");
|
|
185
191
|
}
|
|
186
192
|
|
|
193
|
+
const jobKey = `${data.caseId}:${data.kind}`;
|
|
194
|
+
if (inFlightArtifactJobs.has(jobKey)) {
|
|
195
|
+
throw new Error("该用例的同类产物正在生成中,请稍候");
|
|
196
|
+
}
|
|
197
|
+
inFlightArtifactJobs.add(jobKey);
|
|
198
|
+
try {
|
|
199
|
+
return await runArtifactGeneration(data, userId);
|
|
200
|
+
} finally {
|
|
201
|
+
inFlightArtifactJobs.delete(jobKey);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
async function runArtifactGeneration(
|
|
206
|
+
data: { caseId: string; kind: string; targetSourcePath?: string },
|
|
207
|
+
userId: string,
|
|
208
|
+
): Promise<{ artifact: ReturnType<typeof castArtifact> }> {
|
|
209
|
+
|
|
187
210
|
const prisma = await getPrisma();
|
|
188
211
|
const testCase = await prisma.testCase.findUnique({
|
|
189
212
|
where: { id: data.caseId },
|
|
@@ -321,7 +344,7 @@ export const generateArtifactFn = createServerFn({ method: "POST" })
|
|
|
321
344
|
})) as unknown as ArtifactRow;
|
|
322
345
|
|
|
323
346
|
return { artifact: castArtifact(artifact, testCase.version) };
|
|
324
|
-
|
|
347
|
+
}
|
|
325
348
|
|
|
326
349
|
// ── 采纳 / 拒绝 ──
|
|
327
350
|
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
TESTCASE_ORDER_DIRECTIONS,
|
|
36
36
|
TESTCASE_ORDER_FIELD_MAP,
|
|
37
37
|
TESTCASE_ORDER_KEYS,
|
|
38
|
-
} from "@/
|
|
38
|
+
} from "@/shared/testcase/field-configs";
|
|
39
39
|
import type { TestCaseSummary, TestCaseSteps } from "./types";
|
|
40
40
|
import type { TestCaseAutomation, TestCasePriority, TestCaseState, TestCaseType } from "./constants";
|
|
41
41
|
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
TESTCASE_ORDER_DIRECTIONS,
|
|
38
38
|
TESTCASE_ORDER_FIELD_MAP,
|
|
39
39
|
TESTCASE_ORDER_KEYS,
|
|
40
|
-
} from "@/
|
|
40
|
+
} from "@/shared/testcase/field-configs";
|
|
41
41
|
import { CreateTestCaseInputSchema, UpdateTestCaseInputSchema } from "./schemas";
|
|
42
42
|
import {
|
|
43
43
|
TEST_CASE_AUTOMATION_VALUES,
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
type TestCaseOrderDirection,
|
|
42
42
|
type TestCaseOrderKey,
|
|
43
43
|
type TestCasePageSize,
|
|
44
|
-
} from "@/
|
|
44
|
+
} from "@/shared/testcase/field-configs";
|
|
45
45
|
import type { Prisma } from "@allbluecn/database";
|
|
46
46
|
|
|
47
47
|
function toJson<T>(value: T): Prisma.InputJsonValue {
|
|
@@ -28,7 +28,7 @@ import { getRequest } from "@tanstack/react-start/server";
|
|
|
28
28
|
import { z } from "zod";
|
|
29
29
|
import type { Prisma } from "@allbluecn/database";
|
|
30
30
|
import { requireAuth } from "@/server/auth-helpers";
|
|
31
|
-
import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/
|
|
31
|
+
import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/shared/testcase/field-configs";
|
|
32
32
|
|
|
33
33
|
// 显示选项保留行(任务 20,testcase-display-options.ts 落点)对视图清单
|
|
34
34
|
// 不可见、不可建/改(bug-views.ts NOT_RESERVED 同构收口)。
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
// 测试域共享 DTO 类型(纯类型模块,双端安全):列表/详情 serverFn 返回与客户端组件共用。
|
|
19
19
|
// 日期字段跨 JSON 边界一律 string(ISO),与 bug 列表 DTO castToISO 惯例一致。
|
|
20
|
-
import type { UserBrief } from "@/
|
|
20
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
21
21
|
import type { TestRunSummaryJson } from "@/server/testcase/run-summary";
|
|
22
22
|
import type {
|
|
23
23
|
TestCaseAutomation,
|
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
import type { Prisma } from "@allbluecn/database";
|
|
19
19
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
20
20
|
import type { AvatarConfig } from "@allbluecn/kernel";
|
|
21
|
-
import type { StoryState, StoryPriority } from "@/
|
|
21
|
+
import type { StoryState, StoryPriority } from "@/shared/story/constants";
|
|
22
|
+
import type { StoryDetail } from "@/shared/story/types";
|
|
22
23
|
import type {
|
|
23
24
|
UserBrief,
|
|
24
25
|
ReactionGroup,
|
|
25
26
|
ActivityItem,
|
|
26
|
-
} from "@/
|
|
27
|
+
} from "@/shared/story/types";
|
|
27
28
|
|
|
28
29
|
export const USER_BRIEF_SELECT = {
|
|
29
30
|
id: true,
|
|
@@ -86,7 +87,10 @@ export type StoryListRow = Prisma.StoryGetPayload<{ select: typeof STORY_LIST_SE
|
|
|
86
87
|
|
|
87
88
|
export type StoryListRowLight = Prisma.StoryGetPayload<{ select: typeof STORY_LIST_SELECT_LIGHT }>;
|
|
88
89
|
|
|
89
|
-
|
|
90
|
+
// 显式返回 StoryDetail:STORY_LIST_SELECT 恒含 sequenceId 与 updatedBy(Date/
|
|
91
|
+
// enum string/Json avatar 亦在此单点转换),select 行经此即为客户端完整行类型,
|
|
92
|
+
// 列表/详情/依赖边消费方均无需再 as 强转(S14)。
|
|
93
|
+
export function castStoryUsers<S extends StoryListRow>(s: S): StoryDetail {
|
|
90
94
|
return {
|
|
91
95
|
...s,
|
|
92
96
|
state: s.state as StoryState,
|
|
@@ -15,12 +15,13 @@
|
|
|
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
|
-
// BUG
|
|
19
|
-
//
|
|
18
|
+
// BUG 域类型 + Prisma select 常量(S45 服务端/UI 边界专项迁入 src/shared:
|
|
19
|
+
// serverFn 与 UI 共用 select 常量与 cast 函数)。Prisma 仅 type-only 导入
|
|
20
|
+
// (编译期擦除),运行时零依赖,客户端安全。
|
|
20
21
|
import type { Prisma } from "@allbluecn/database";
|
|
21
22
|
import type { AvatarConfig } from "@allbluecn/kernel";
|
|
22
23
|
import type { BugState, BugSeverity, BugSource } from "@/shared/bug/constants";
|
|
23
|
-
import type { ReactionGroup, UserBrief } from "@/
|
|
24
|
+
import type { ReactionGroup, UserBrief } from "@/shared/story/types";
|
|
24
25
|
|
|
25
26
|
/** 用户 brief select(与 serverFns/story USER_BRIEF_SELECT 字段一致,本地声明避免运行时依赖 server 层) */
|
|
26
27
|
export const BUG_USER_BRIEF_SELECT = {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import { GitPullRequestArrow, CircleFadingArrowUp, Repeat, Repeat2, CalendarPlus2, Hash, MessageCircleCheck, RefreshCcwDot, CircleFadingPlus, CircleArrowUp, CircleArrowRight, CircleArrowDown, CircleSlash, CircleDashed, CircleCheckBig, LoaderCircle, CheckCircle2, XCircle, FilePenLine, FilePlus2, Flag, UserRound, CalendarCheck, Tags, TextInitial, ListTree, ArrowLeftRight, Link2, Paperclip, BookOpen, Unlink, Trash2, BookX, FileX, ArrowRightFromLine, ArrowLeftToLine, ArrowUpFromDot, ListChecks, Bug, type LucideIcon } from "lucide-react";
|
|
19
19
|
import { m } from '@/paraglide/messages.js';
|
|
20
|
-
import type { DependencyEdgeType, DependencyGroup } from "
|
|
20
|
+
import type { DependencyEdgeType, DependencyGroup } from "@/shared/story/types";
|
|
21
21
|
|
|
22
22
|
export type StoryState = "backlog" | "todo" | "in_progress" | "done" | "cancelled";
|
|
23
23
|
export type StoryPriority = "urgent" | "high" | "medium" | "low" | "none";
|
|
@@ -15,7 +15,7 @@
|
|
|
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 type { StoryState, StoryPriority } from "
|
|
18
|
+
import type { StoryState, StoryPriority } from "@/shared/story/constants";
|
|
19
19
|
import type { AvatarConfig } from "@allbluecn/kernel";
|
|
20
20
|
|
|
21
21
|
export interface UserBrief {
|
|
@@ -212,9 +212,3 @@ export interface DependencyGroup {
|
|
|
212
212
|
dependents: DependencyRow[]; // 依赖此需求的(我领先,边 sourceId = 我)
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
// ====== Peek 面板内实体叠加层(用例/BUG 行的面板内打开) ======
|
|
216
|
-
// case 携带列表行数据 + 面板已加载的模块树(实体 peek 属性区解析用);
|
|
217
|
-
// bug 由实体 peek 面板按 id 自取详情。
|
|
218
|
-
export type StoryEntityOverlay =
|
|
219
|
-
| { kind: "case"; item: import("@/server/serverFns/testcase/types").TestCaseSummary; folders: import("@/components/testcase/folder-tree").FolderNodeDto[] }
|
|
220
|
-
| { kind: "bug"; id: string };
|
package/src/types/project.ts
CHANGED
|
@@ -21,11 +21,10 @@ import type { LucideIcon } from "lucide-react";
|
|
|
21
21
|
export type ProjectRole = "owner" | "admin" | "member" | "viewer";
|
|
22
22
|
export type MemberStatus = "active" | "invited" | "suspended";
|
|
23
23
|
|
|
24
|
-
//
|
|
24
|
+
// 用户精简信息(用于成员/活动展示;S41 最小披露——项目域不下发 email)
|
|
25
25
|
export interface ProjectUserBrief {
|
|
26
26
|
id: string;
|
|
27
27
|
username: string;
|
|
28
|
-
email: string;
|
|
29
28
|
avatarConfig?: unknown;
|
|
30
29
|
bgShape?: string | null;
|
|
31
30
|
bgColor?: string | null;
|
|
File without changes
|