@allbluecn/web-app 0.19.4 → 0.20.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/LICENSE +661 -0
- package/package.json +35 -37
- package/public/fonts/Trap-font/Trap-Black.otf +0 -0
- package/public/fonts/Trap-font/Trap-Bold.otf +0 -0
- package/public/fonts/Trap-font/Trap-ExtraBold.otf +0 -0
- package/public/fonts/Trap-font/Trap-Light.otf +0 -0
- package/public/fonts/Trap-font/Trap-Medium.otf +0 -0
- package/public/fonts/Trap-font/Trap-Regular.otf +0 -0
- package/public/fonts/Trap-font/Trap-SemiBold.otf +0 -0
- package/public/fonts/buttersans-Rounded.otf +0 -0
- 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 +1 -1
- 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 +2 -1
- 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/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/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/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 +2 -2
- 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/associated-attachments-panel.tsx +2 -2
- package/src/components/story/detail/story-detail-toolbar/children.tsx +1 -1
- package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +3 -3
- 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 +2 -2
- package/src/components/story/display/order-resolver.ts +2 -2
- package/src/components/story/display/types.ts +1 -1
- package/src/components/story/display/use-grouped-stories.ts +1 -1
- package/src/components/story/display/use-paged-story-groups.ts +2 -2
- 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 +3 -3
- 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/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 +2 -2
- package/src/components/story/views/story-list/group.tsx +2 -2
- package/src/components/story/views/story-list/index.tsx +2 -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 +1 -1
- package/src/components/testcase/__tests__/toolbar.test.tsx +1 -1
- package/src/components/testcase/create-testcase-dialog.tsx +1 -1
- 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/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/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/.gitignore +3 -0
- package/src/paraglide/.prettierignore +3 -0
- package/src/paraglide/README.md +162 -0
- package/src/paraglide/messages/_index.js +88192 -0
- package/src/paraglide/messages/en.js +28230 -0
- package/src/paraglide/messages/zh.js +28228 -0
- package/src/paraglide/messages.js +4 -0
- package/src/paraglide/registry.js +46 -0
- package/src/paraglide/runtime.js +2311 -0
- package/src/paraglide/server.js +294 -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/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__/update-bug-guard.test.ts +1 -1
- package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +1 -1
- 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 +3 -3
- 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 +1 -1
- 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/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/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 +1 -1
- package/src/server/serverFns/story/story-groups.ts +1 -1
- package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +1 -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 +2 -2
- 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/{components/testcase/display → shared/testcase}/field-configs.ts +0 -0
|
@@ -42,14 +42,14 @@ import type {
|
|
|
42
42
|
TestCaseDisplayProperty,
|
|
43
43
|
TestCaseGroupKey,
|
|
44
44
|
TestCaseOrderKey,
|
|
45
|
-
} from "
|
|
45
|
+
} from "@/shared/testcase/field-configs";
|
|
46
46
|
import {
|
|
47
47
|
DEFAULT_TESTCASE_DISPLAY_OPTIONS,
|
|
48
48
|
TESTCASE_DISPLAY_PROPERTIES,
|
|
49
49
|
TESTCASE_GROUP_KEYS,
|
|
50
50
|
TESTCASE_ORDER_KEYS,
|
|
51
51
|
TESTCASE_PAGE_SIZE_OPTIONS,
|
|
52
|
-
} from "
|
|
52
|
+
} from "@/shared/testcase/field-configs";
|
|
53
53
|
|
|
54
54
|
/** 分组维度标签(testcase_display_ 域文案,照 bug display/constants 裁剪) */
|
|
55
55
|
const GROUP_LABELS: Record<TestCaseGroupKey, () => string> = {
|
|
@@ -69,7 +69,7 @@ import type {
|
|
|
69
69
|
FilterUserLike,
|
|
70
70
|
} from "@/components/shared-kit/list-kit/filters";
|
|
71
71
|
import { cn } from "@/lib/utils";
|
|
72
|
-
import type { UserBrief } from "@/
|
|
72
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
73
73
|
|
|
74
74
|
export { serializeFilters, deserializeFilters, OPERATOR_LABELS, generateConditionId } from "@/components/shared-kit/list-kit/filters";
|
|
75
75
|
export type { FilterOperator, FilterFieldType };
|
|
@@ -22,7 +22,7 @@ import { Check, CircleUser, Search } from "lucide-react";
|
|
|
22
22
|
import { Input } from "@/components/ui/input";
|
|
23
23
|
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
|
|
24
24
|
import { UserAvatar } from "@/components/shared-kit";
|
|
25
|
-
import type { UserBrief } from "@/
|
|
25
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
26
26
|
import { cn } from "@/lib/utils";
|
|
27
27
|
import { m } from "@/paraglide/messages.js";
|
|
28
28
|
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
import { updateTestCaseFn } from "@/server/serverFns/testcase/testcase-crud";
|
|
41
41
|
import type { TestCaseAutomation, TestCasePriority, TestCaseState, TestCaseType } from "@/server/serverFns/testcase/constants";
|
|
42
42
|
import type { TestCaseSteps, TestCaseSummary } from "@/server/serverFns/testcase/types";
|
|
43
|
-
import type { UserBrief } from "@/
|
|
43
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
44
44
|
import type { FolderNodeDto } from "../folder-tree";
|
|
45
45
|
import { PriorityEditor } from "../inline-editors/priority-editor";
|
|
46
46
|
import { StateEditor } from "../inline-editors/state-editor";
|
|
@@ -27,7 +27,7 @@ import { ChevronDown, ChevronRight } from "lucide-react";
|
|
|
27
27
|
import { InfiniteScrollSentinel } from "@/components/infinite-scroll-sentinel";
|
|
28
28
|
import type { TestCaseState, TestCasePriority } from "@/server/serverFns/testcase/constants";
|
|
29
29
|
import type { TestCaseSummary } from "@/server/serverFns/testcase/types";
|
|
30
|
-
import type { UserBrief } from "@/
|
|
30
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
31
31
|
import type { FolderNodeDto } from "../folder-tree";
|
|
32
32
|
import { priorityLabel, stateLabel } from "../filters";
|
|
33
33
|
import { CaseRow } from "./case-row";
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
updateFilterViewFn,
|
|
54
54
|
} from "@/server/serverFns/testcase/testcase-filter-views";
|
|
55
55
|
import type { TestCaseSummary } from "@/server/serverFns/testcase/types";
|
|
56
|
-
import type { UserBrief } from "@/
|
|
56
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
57
57
|
import { GroupedList, groupKeyOf, type TestCaseGroupInfo } from "./list/grouped-list";
|
|
58
58
|
import { computeMove, canMove } from "@/components/shared-kit/list-kit/move";
|
|
59
59
|
import { TestCaseBoardView } from "./views/board-view";
|
|
@@ -62,7 +62,7 @@ import { manualOrderSwitchPatch } from "@/components/shared-kit/list-kit/kanban/
|
|
|
62
62
|
import { toast } from "@/components/ui/toast";
|
|
63
63
|
import { TestCasePeekPanel, type PeekMode } from "./peek-panel";
|
|
64
64
|
import { useTestcaseDisplayOptions } from "./display/use-testcase-display-options";
|
|
65
|
-
import type { TestCaseGroupKey } from "
|
|
65
|
+
import type { TestCaseGroupKey } from "@/shared/testcase/field-configs";
|
|
66
66
|
import { CreateViewDialog, type CreateViewDialogPayload } from "./views/create-view-dialog";
|
|
67
67
|
import { CreateTestCaseDialog } from "./create-testcase-dialog";
|
|
68
68
|
import { TestCaseBatchToolbar } from "./views/batch-toolbar";
|
|
@@ -26,10 +26,10 @@ import { useCallback, useState } from "react";
|
|
|
26
26
|
import { Bug as BugIcon } from "lucide-react";
|
|
27
27
|
import { Button } from "@/components/ui/button";
|
|
28
28
|
import { CreateBugDialog, type CreateBugDialogDefaults } from "@/components/bug/create-bug-dialog";
|
|
29
|
-
import type { ReproduceSteps } from "@/
|
|
29
|
+
import type { ReproduceSteps } from "@/shared/bug/types";
|
|
30
30
|
import { listUsersBriefFn, listLabelsFn } from "@/server/serverFns/story";
|
|
31
31
|
import { listProjectsBriefFn } from "@/server/serverFns/project";
|
|
32
|
-
import type { UserBrief } from "@/
|
|
32
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
33
33
|
import type {
|
|
34
34
|
RunCaseExecutionDetail,
|
|
35
35
|
RunCaseSummary,
|
|
@@ -72,11 +72,11 @@ import {
|
|
|
72
72
|
import { toast } from "@/components/ui/toast";
|
|
73
73
|
import { toastError } from "@/lib/toast-error";
|
|
74
74
|
import type { FolderNodeDto } from "./folder-tree";
|
|
75
|
-
import type { UserBrief } from "@/
|
|
75
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
76
76
|
import { ViewSelectorButton } from "./views/view-selector-button";
|
|
77
77
|
import { ViewSwitcher } from "./views/view-switcher";
|
|
78
78
|
import { TestCaseDisplayDropdown } from "./display/display-dropdown";
|
|
79
|
-
import type { TestCaseDisplayOptions } from "
|
|
79
|
+
import type { TestCaseDisplayOptions } from "@/shared/testcase/field-configs";
|
|
80
80
|
import type { TestCaseSavedView, TestCaseViewType } from "./views/view-types";
|
|
81
81
|
import { m } from "@/paraglide/messages.js";
|
|
82
82
|
import { getLocale } from "@/paraglide/runtime.js";
|
|
@@ -37,7 +37,7 @@ import { PriorityEditor } from "../inline-editors/priority-editor";
|
|
|
37
37
|
import { AssigneeEditor } from "../inline-editors/assignee-editor";
|
|
38
38
|
import { FolderEditor } from "../inline-editors/folder-editor";
|
|
39
39
|
import type { FolderNodeDto } from "../folder-tree";
|
|
40
|
-
import type { UserBrief } from "@/
|
|
40
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
41
41
|
import { toastError } from "@/lib/toast-error";
|
|
42
42
|
import { cn } from "@/lib/utils";
|
|
43
43
|
import { m } from "@/paraglide/messages.js";
|
|
@@ -44,7 +44,7 @@ import type {
|
|
|
44
44
|
TestCaseType,
|
|
45
45
|
} from "@/server/serverFns/testcase/constants";
|
|
46
46
|
import type { TestCaseSummary } from "@/server/serverFns/testcase/types";
|
|
47
|
-
import type { UserBrief } from "@/
|
|
47
|
+
import type { UserBrief } from "@/shared/story/types";
|
|
48
48
|
import type { FolderNodeDto } from "../folder-tree";
|
|
49
49
|
import type { TestCaseUpdatePatch } from "../list/case-row";
|
|
50
50
|
import { PriorityEditor } from "../inline-editors/priority-editor";
|
|
@@ -56,7 +56,7 @@ import {
|
|
|
56
56
|
TEST_CASE_TYPE_META,
|
|
57
57
|
} from "../constants";
|
|
58
58
|
import { priorityLabel, stateLabel, typeLabel } from "../filters";
|
|
59
|
-
import type { TestCaseDisplayProperty } from "
|
|
59
|
+
import type { TestCaseDisplayProperty } from "@/shared/testcase/field-configs";
|
|
60
60
|
import {
|
|
61
61
|
KanbanBoardView,
|
|
62
62
|
type ColumnTint,
|
|
@@ -96,14 +96,14 @@ export const SDK_GROUPS: SdkGroup[] = [
|
|
|
96
96
|
"items": [
|
|
97
97
|
{
|
|
98
98
|
"name": "@allbluecn/web-app",
|
|
99
|
-
"version": "v0.
|
|
99
|
+
"version": "v0.20.0",
|
|
100
100
|
"lastUpdate": "Oct 28, 2026",
|
|
101
101
|
"source": "apps/web/package.json",
|
|
102
102
|
"docsUrl": "https://github.com/allbluecn/allblue"
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
"name": "@allbluecn/kernel",
|
|
106
|
-
"version": "v0.10.
|
|
106
|
+
"version": "v0.10.2",
|
|
107
107
|
"lastUpdate": "Oct 28, 2026",
|
|
108
108
|
"source": "packages/kernel/package.json",
|
|
109
109
|
"docsUrl": "https://github.com/allbluecn/allblue"
|
|
@@ -20,7 +20,8 @@ import { queryCollectionOptions } from '@tanstack/query-db-collection'
|
|
|
20
20
|
import { listKnowledgeFn } from '@/server/serverFns/knowledge'
|
|
21
21
|
import { getQueryClient } from '@/lib/query-client-seam'
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
import { KNOWLEDGE_BASES_QUERY_KEY } from "@/lib/collections/query-keys"
|
|
24
|
+
export { KNOWLEDGE_BASES_QUERY_KEY }
|
|
24
25
|
|
|
25
26
|
export const knowledgeBasesCollection = createCollection(
|
|
26
27
|
queryCollectionOptions({
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// AllBlue - 理想之海
|
|
3
|
+
// Copyright (C) 2026 AllBlue Contributors
|
|
4
|
+
|
|
5
|
+
// React Query key 常量(零依赖纯模块)。
|
|
6
|
+
//
|
|
7
|
+
// 为什么单独成文件:collection 模块在**模块作用域**执行
|
|
8
|
+
// `createCollection({ ... queryClient: getQueryClient() })`,而 getQueryClient()
|
|
9
|
+
// 在 SSR 未注入时 fail-fast(防跨请求缓存串染)。路由文件(如 _nav/route.tsx)
|
|
10
|
+
// 只需要 key 常量做 prefetch,却值引入 collection 模块 → SSR 模块初始化阶段
|
|
11
|
+
// 就触发 getQueryClient(),早于 router.tsx 的 setQueryClient,全站 500。
|
|
12
|
+
// 消费方一律从本模块取 key;collection 模块转 re-export 保持兼容。
|
|
13
|
+
export const WORKSPACES_QUERY_KEY = ['workspaces'] as const
|
|
14
|
+
export const KNOWLEDGE_BASES_QUERY_KEY = ['knowledge-bases'] as const
|
|
15
|
+
export const PROJECTS_QUERY_KEY = ['projects'] as const
|
|
16
|
+
export const LABELS_QUERY_KEY = ['labels'] as const
|
|
17
|
+
export const USERS_BRIEF_QUERY_KEY = ['users-brief'] as const
|
|
18
|
+
export const BOOKMARK_CATEGORIES_QUERY_KEY = ['bookmark-categories'] as const
|
|
@@ -21,7 +21,8 @@ import { listUsersBriefFn } from '@/server/serverFns/story/story-crud/user-brief
|
|
|
21
21
|
import { getQueryClient } from '@/lib/query-client-seam'
|
|
22
22
|
|
|
23
23
|
// 缓存失效方 import 常量而非硬编码字符串(knowledge-bases/workspaces 同口径)
|
|
24
|
-
|
|
24
|
+
import { USERS_BRIEF_QUERY_KEY } from "@/lib/collections/query-keys"
|
|
25
|
+
export { USERS_BRIEF_QUERY_KEY }
|
|
25
26
|
|
|
26
27
|
export const usersBriefCollection = createCollection(
|
|
27
28
|
queryCollectionOptions({
|
|
@@ -20,7 +20,8 @@ import { queryCollectionOptions } from '@tanstack/query-db-collection'
|
|
|
20
20
|
import { listPinnedWorkspacesBriefFn } from '@/server/serverFns/workspace'
|
|
21
21
|
import { getQueryClient } from '@/lib/query-client-seam'
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
import { WORKSPACES_QUERY_KEY } from "@/lib/collections/query-keys"
|
|
24
|
+
export { WORKSPACES_QUERY_KEY }
|
|
24
25
|
|
|
25
26
|
export const workspacesCollection = createCollection(
|
|
26
27
|
queryCollectionOptions({
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import { describe, it, expect } from "vitest";
|
|
19
|
-
import type { ActivityItem } from "@/
|
|
19
|
+
import type { ActivityItem } from "@/shared/story/types";
|
|
20
20
|
import { groupActivities, ACTIVITY_MERGE_WINDOW_MS } from "../activity-grouper";
|
|
21
21
|
|
|
22
22
|
const baseUser = { id: "u1", username: "alice", email: "a@x", avatarConfig: null, bgShape: null, bgColor: null };
|
|
@@ -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 { ActivityItem } from "@/
|
|
18
|
+
import type { ActivityItem } from "@/shared/story/types";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* 活动记录合并窗口:3 分钟内同 user + 同 action 视为「同一次操作的连续行为」。
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Paraglide JS Compiled Output
|
|
2
|
+
|
|
3
|
+
> Auto-generated i18n message functions. Import `messages.js` to use translated strings.
|
|
4
|
+
|
|
5
|
+
Compiled from: `/Users/urmynami/HelloAI/AllBlue-Workspace/AllBlue/apps/web/project.inlang`
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## What is this folder?
|
|
9
|
+
|
|
10
|
+
This folder contains compiled [Paraglide JS](https://github.com/opral/paraglide-js) output. Paraglide JS compiles your translation messages into tree-shakeable JavaScript functions.
|
|
11
|
+
|
|
12
|
+
## At a glance
|
|
13
|
+
|
|
14
|
+
Purpose:
|
|
15
|
+
- This folder stores compiled i18n message functions.
|
|
16
|
+
- Source translations live outside this folder in your inlang project.
|
|
17
|
+
|
|
18
|
+
Safe to import:
|
|
19
|
+
- `messages.js` — all message functions
|
|
20
|
+
- `runtime.js` — locale utilities
|
|
21
|
+
- `server.js` — server-side middleware
|
|
22
|
+
|
|
23
|
+
Do not edit:
|
|
24
|
+
- All files in this folder are auto-generated.
|
|
25
|
+
- Changes will be overwritten on next compilation.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
paraglide/
|
|
29
|
+
├── messages.js # Message exports (import this)
|
|
30
|
+
├── messages/ # Individual message functions
|
|
31
|
+
├── runtime.js # Locale detection & configuration
|
|
32
|
+
├── registry.js # Formatting utilities (plural, number, datetime, relativetime)
|
|
33
|
+
├── server.js # Server-side middleware
|
|
34
|
+
└── .gitignore # Marks folder as generated
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
import * as m from "./paraglide/messages.js";
|
|
41
|
+
|
|
42
|
+
// Messages are functions that return localized strings
|
|
43
|
+
m.hello_world(); // "Hello, World!" (in current locale)
|
|
44
|
+
m.greeting({ name: "Sam" }); // "Hello, Sam!"
|
|
45
|
+
|
|
46
|
+
// Override locale per-call
|
|
47
|
+
m.hello_world({}, { locale: "de" }); // "Hallo, Welt!"
|
|
48
|
+
m.greeting({ name: "Sam" }, { locale: "de" }); // "Hallo, Sam!"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Runtime API
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
import { getLocale, getTextDirection, setLocale, locales, baseLocale } from "./paraglide/runtime.js";
|
|
55
|
+
|
|
56
|
+
getLocale(); // Current locale, e.g., "en"
|
|
57
|
+
getTextDirection(); // "ltr" | "rtl" for current locale
|
|
58
|
+
setLocale("de"); // Set locale
|
|
59
|
+
locales; // Available locales, e.g., ["en", "de", "fr"]
|
|
60
|
+
baseLocale; // Default locale, e.g., "en"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Strategy
|
|
64
|
+
|
|
65
|
+
The strategy determines how the current locale is detected and persisted:
|
|
66
|
+
|
|
67
|
+
- **Cookie**: Stores locale preference in a cookie.
|
|
68
|
+
- **URL**: Derives locale from URL patterns (e.g., `/en/about`, `en.example.com`).
|
|
69
|
+
- **GlobalVariable**: Uses a global variable (client-side only).
|
|
70
|
+
- **BaseLocale**: Always returns the base locale.
|
|
71
|
+
|
|
72
|
+
Strategies can be combined. The order defines precedence:
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
await compile({
|
|
76
|
+
project: "./project.inlang",
|
|
77
|
+
outdir: "./src/paraglide",
|
|
78
|
+
strategy: ["url", "cookie", "baseLocale"],
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
See the [strategy documentation](https://paraglidejs.com/strategy) for details.
|
|
83
|
+
|
|
84
|
+
## Markup (Rich Text)
|
|
85
|
+
|
|
86
|
+
Messages can contain markup tags for bold, links, and other inline elements. Translators control where tags appear; developers control how they render.
|
|
87
|
+
|
|
88
|
+
Important:
|
|
89
|
+
- Tag names are app-defined. There is no built-in list of HTML tags.
|
|
90
|
+
- `{#b}...{/b}` does not automatically render as `<b>...</b>`.
|
|
91
|
+
- Renderers/snippets are looked up by the same tag name used in the message.
|
|
92
|
+
|
|
93
|
+
### Message syntax
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"cta": "{#link to=|/docs| rel=$relationship @track}Read the docs{/link}",
|
|
98
|
+
"welcome": "{#b}Hi {name}{/b}{#icon/}"
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- `{#tagName}` opens a tag, `{/tagName}` closes it.
|
|
103
|
+
- `{#tagName/}` creates a standalone tag.
|
|
104
|
+
- Options: `to=|/docs|` or `rel=$relationship` (accessed via `options.*`).
|
|
105
|
+
- Attributes: `@track` or `@variant=|hero|` (accessed via `attributes.*`).
|
|
106
|
+
|
|
107
|
+
This is the default inlang message syntax. Paraglide's message format is plugin-based — you can use [ICU MessageFormat 1](https://inlang.com/m/p7c8m1d2/plugin-inlang-icu-messageformat-1), [i18next](https://inlang.com/m/3i8bor92/plugin-inlang-i18next), or other [plugins](https://inlang.com/c/plugins) instead.
|
|
108
|
+
|
|
109
|
+
### Rendering markup
|
|
110
|
+
|
|
111
|
+
Calling the message function still returns **plain text** (markup stripped):
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
m.cta({ relationship: "noopener" }); // "Read the docs"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
To render markup, use the framework adapter or the low-level `parts()` API:
|
|
118
|
+
|
|
119
|
+
```js
|
|
120
|
+
const parts = m.cta.parts({ relationship: "noopener" });
|
|
121
|
+
// [
|
|
122
|
+
// { type: "markup-start", name: "link", options: { to: "/docs", rel: "noopener" }, attributes: { track: true } },
|
|
123
|
+
// { type: "text", value: "Read the docs" },
|
|
124
|
+
// { type: "markup-end", name: "link" }
|
|
125
|
+
// ]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Framework adapters provide a `<ParaglideMessage>` component that accepts markup renderers:
|
|
129
|
+
|
|
130
|
+
- `@inlang/paraglide-js-react`
|
|
131
|
+
- `@inlang/paraglide-js-vue`
|
|
132
|
+
- `@inlang/paraglide-js-svelte`
|
|
133
|
+
- `@inlang/paraglide-js-solid`
|
|
134
|
+
|
|
135
|
+
```jsx
|
|
136
|
+
import { ParaglideMessage } from "@inlang/paraglide-js-react"; // or -vue, -svelte, -solid
|
|
137
|
+
|
|
138
|
+
<ParaglideMessage
|
|
139
|
+
message={m.welcome}
|
|
140
|
+
inputs={{ name: "Ada" }}
|
|
141
|
+
markup={{
|
|
142
|
+
b: ({ children }) => <b>{children}</b>,
|
|
143
|
+
icon: () => <span aria-hidden="true" className="icon-wave" />,
|
|
144
|
+
}}
|
|
145
|
+
/>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The available renderer/snippet names come from the message itself. You can inspect them through `message.parts()`, and TypeScript uses the same names to type-check your markup renderers.
|
|
149
|
+
|
|
150
|
+
See the [markup documentation](https://paraglidejs.com/markup) for details.
|
|
151
|
+
|
|
152
|
+
## Key concepts
|
|
153
|
+
|
|
154
|
+
- **Tree-shakeable**: Each message is a function, enabling [up to 70% smaller i18n bundle sizes](https://paraglidejs.com/benchmark) than traditional i18n libraries.
|
|
155
|
+
- **Typesafe**: Full TypeScript/JSDoc support with autocomplete.
|
|
156
|
+
- **Variants**: Messages can have variants for pluralization, gender, etc.
|
|
157
|
+
- **Fallbacks**: Missing translations fall back to the base locale.
|
|
158
|
+
|
|
159
|
+
## Links
|
|
160
|
+
|
|
161
|
+
- [Paraglide JS Documentation](https://paraglidejs.com)
|
|
162
|
+
- [Source Repository](https://github.com/opral/paraglide-js)
|