@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,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 { lazy, Suspense, useCallback, useEffect, useRef, useState } from "react";
|
|
18
|
+
import React, { lazy, Suspense, useCallback, useEffect, useRef, useState } from "react";
|
|
19
19
|
import { useTranslation } from "react-i18next";
|
|
20
20
|
import {
|
|
21
21
|
ChevronsDownUp,
|
|
@@ -45,7 +45,7 @@ import { EmojiPicker } from "./emoji-picker";
|
|
|
45
45
|
import { StoryAiToolbar } from "../ai/story-ai-toolbar";
|
|
46
46
|
import { useStoryAiModel } from "../ai/use-story-ai-model";
|
|
47
47
|
import { StateEditor, PriorityEditor, AssigneeEditor, DateEditor, LabelsEditor, ParentStoryEditor } from "../inline-editors";
|
|
48
|
-
import {
|
|
48
|
+
import { LucideIconByName } from "@/components/shared/lucide-icon-picker/lucide-icon-by-name";
|
|
49
49
|
import type { Editor } from "@tiptap/react";
|
|
50
50
|
import { StoryProperties } from "./story-properties";
|
|
51
51
|
import { StoryDetailToolbar } from "./story-detail-toolbar";
|
|
@@ -76,12 +76,15 @@ export function StoryDetailBody({
|
|
|
76
76
|
labels,
|
|
77
77
|
stories,
|
|
78
78
|
projects,
|
|
79
|
+
iterations,
|
|
79
80
|
relationsData,
|
|
80
81
|
onRelationsUpdate,
|
|
81
82
|
onAppendActivities,
|
|
82
83
|
onAppendComment,
|
|
83
84
|
onRemoveComment,
|
|
84
85
|
onStoryUpdate,
|
|
86
|
+
onNavigateInPanel,
|
|
87
|
+
breadcrumbItems,
|
|
85
88
|
}: {
|
|
86
89
|
story: StoryDetail;
|
|
87
90
|
users: UserBrief[];
|
|
@@ -97,8 +100,10 @@ export function StoryDetailBody({
|
|
|
97
100
|
labels?: { id: string; name: string; color: string }[];
|
|
98
101
|
/** 所有需求列表(用于父需求选择) */
|
|
99
102
|
stories?: { id: string; identifier: string; name: string; state: StoryState; projectId?: string }[];
|
|
100
|
-
|
|
101
|
-
|
|
103
|
+
/** 所有项目列表(用于父需求选择) */
|
|
104
|
+
projects?: { id: string; name: string; icon: string; displayId?: string | null }[];
|
|
105
|
+
/** 迭代列表(用于迭代选择器) */
|
|
106
|
+
iterations?: import("@/server/serverFns/iteration/schemas").IterationSummary[];
|
|
102
107
|
/** 关联数据(从路由 loader 预加载) */
|
|
103
108
|
relationsData?: RelationsData;
|
|
104
109
|
onRelationsUpdate?: (next: RelationsData | ((prev: RelationsData) => RelationsData)) => void;
|
|
@@ -106,6 +111,9 @@ export function StoryDetailBody({
|
|
|
106
111
|
onAppendComment?: (comment: CommentWithReplies) => void;
|
|
107
112
|
onRemoveComment?: (commentId: string) => void;
|
|
108
113
|
onStoryUpdate?: (s: StoryDetail) => void;
|
|
114
|
+
onNavigateInPanel?: (targetId: string, targetIdentifier?: string, relationKind?: "child" | "dependency") => void;
|
|
115
|
+
/** 内嵌面板导航面包屑(在面板内跳转时替代单层 identifier 显示) */
|
|
116
|
+
breadcrumbItems?: Array<{ identifier?: string; projectId?: string; label: string; onClick?: () => void }>;
|
|
109
117
|
}) {
|
|
110
118
|
const { t } = useTranslation("story");
|
|
111
119
|
const [name, setName] = useState(story.name);
|
|
@@ -125,6 +133,12 @@ export function StoryDetailBody({
|
|
|
125
133
|
const [expanded, setExpanded] = useState(false);
|
|
126
134
|
const [needsTruncation, setNeedsTruncation] = useState(false);
|
|
127
135
|
const [isEditorFocused, setIsEditorFocused] = useState(false);
|
|
136
|
+
// 描述是否为空(跟随编辑器 onChange 实时更新)。不能用 descContent.markdown 判断——
|
|
137
|
+
// 编辑会话期间 onChange 只进 pendingDescRef(防抖保存),descContent 不更新,
|
|
138
|
+
// 否则输入文字后失焦仍会显示「点击添加需求描述」占位并与文字重合
|
|
139
|
+
const [isDescEmpty, setIsDescEmpty] = useState(
|
|
140
|
+
!(parsedDesc.markdown ?? "").trim(),
|
|
141
|
+
);
|
|
128
142
|
const [reactions, setReactions] = useState<ReactionGroup[]>([]);
|
|
129
143
|
const pendingReactionsRef = useRef<Set<string>>(new Set());
|
|
130
144
|
useEffect(() => {
|
|
@@ -291,6 +305,7 @@ export function StoryDetailBody({
|
|
|
291
305
|
// 兜底防抖避免用户长时间不操作也最终落盘(防崩溃丢数据)。
|
|
292
306
|
const handleDescriptionChange = useCallback((content: { html: string; markdown: string }) => {
|
|
293
307
|
pendingDescRef.current = content;
|
|
308
|
+
setIsDescEmpty(!content.markdown.trim());
|
|
294
309
|
if (saveTimerRef.current) clearTimeout(saveTimerRef.current);
|
|
295
310
|
saveTimerRef.current = setTimeout(
|
|
296
311
|
() => flushDescriptionRef.current(),
|
|
@@ -317,6 +332,7 @@ export function StoryDetailBody({
|
|
|
317
332
|
}
|
|
318
333
|
const newContent = { html: newMarkdown, markdown: newMarkdown };
|
|
319
334
|
setDescContent(newContent);
|
|
335
|
+
setIsDescEmpty(!newMarkdown.trim());
|
|
320
336
|
const json = serializeStoryDescription(newMarkdown, newMarkdown);
|
|
321
337
|
lastPersistedRef.current = json;
|
|
322
338
|
updateField("description", json);
|
|
@@ -345,38 +361,62 @@ export function StoryDetailBody({
|
|
|
345
361
|
<div className="flex items-start justify-between gap-4 px-6">
|
|
346
362
|
<div className="flex-1 space-y-4">
|
|
347
363
|
<div className="flex items-center gap-2">
|
|
348
|
-
{
|
|
349
|
-
<
|
|
350
|
-
|
|
351
|
-
<
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
364
|
+
{breadcrumbItems && breadcrumbItems.length > 0 ? (
|
|
365
|
+
<div className="flex items-center gap-1.5 text-sm font-mono text-muted-foreground">
|
|
366
|
+
{breadcrumbItems.map((item, i) => (
|
|
367
|
+
<React.Fragment key={i}>
|
|
368
|
+
{i > 0 && <span className="text-muted-foreground/40 px-1">/</span>}
|
|
369
|
+
<button
|
|
370
|
+
type="button"
|
|
371
|
+
onClick={item.onClick}
|
|
372
|
+
className="inline-flex items-center gap-1 hover:text-foreground transition-colors cursor-pointer"
|
|
373
|
+
>
|
|
374
|
+
<LucideIconByName
|
|
375
|
+
name={projects?.find((p) => p.id === item.projectId)?.icon ?? project?.icon}
|
|
376
|
+
size={16}
|
|
377
|
+
className="shrink-0 text-muted-foreground"
|
|
378
|
+
/>
|
|
379
|
+
{item.identifier}
|
|
380
|
+
</button>
|
|
381
|
+
</React.Fragment>
|
|
382
|
+
))}
|
|
383
|
+
</div>
|
|
384
|
+
) : (
|
|
385
|
+
<>
|
|
386
|
+
{project && (
|
|
387
|
+
<Tooltip>
|
|
388
|
+
<TooltipTrigger asChild>
|
|
389
|
+
<span className="flex cursor-default items-center">
|
|
390
|
+
<LucideIconByName name={project.icon} size={16} className="shrink-0 text-muted-foreground" />
|
|
391
|
+
</span>
|
|
392
|
+
</TooltipTrigger>
|
|
393
|
+
<TooltipContent>
|
|
394
|
+
<div className="flex flex-col">
|
|
395
|
+
<span className="text-[10px] font-medium uppercase tracking-wide text-muted-foreground">{t("detail.belongsTo")}</span>
|
|
396
|
+
<span>{project.name}</span>
|
|
397
|
+
</div>
|
|
398
|
+
</TooltipContent>
|
|
399
|
+
</Tooltip>
|
|
400
|
+
)}
|
|
401
|
+
{identifier && (
|
|
402
|
+
<Tooltip>
|
|
403
|
+
<TooltipTrigger asChild>
|
|
404
|
+
<button
|
|
405
|
+
type="button"
|
|
406
|
+
onClick={() => {
|
|
407
|
+
navigator.clipboard.writeText(identifier)
|
|
408
|
+
.then(() => toast.success(t("detail.copied", { identifier })))
|
|
409
|
+
.catch(() => toast.error(t("detail.copyFailed")));
|
|
410
|
+
}}
|
|
411
|
+
className="text-sm font-mono text-muted-foreground hover:text-foreground transition-colors cursor-pointer"
|
|
412
|
+
>
|
|
413
|
+
{identifier}
|
|
414
|
+
</button>
|
|
415
|
+
</TooltipTrigger>
|
|
416
|
+
<TooltipContent>{t("detail.clickToCopy")}</TooltipContent>
|
|
417
|
+
</Tooltip>
|
|
418
|
+
)}
|
|
419
|
+
</>
|
|
380
420
|
)}
|
|
381
421
|
</div>
|
|
382
422
|
{/* {saving && <span className="text-xs text-muted-foreground">保存中...</span>} */}
|
|
@@ -389,7 +429,7 @@ export function StoryDetailBody({
|
|
|
389
429
|
</div>
|
|
390
430
|
</div>
|
|
391
431
|
{metaBar}
|
|
392
|
-
<div ref={editorContainerRef} className={`relative notion-full-width${!isEditorFocused &&
|
|
432
|
+
<div ref={editorContainerRef} className={`relative notion-full-width${!isEditorFocused && isDescEmpty ? " story-editor-no-placeholder" : ""}`} style={{ "--notion-content-width": "1fr", "--notion-margin-width": "0px" } as React.CSSProperties} onPointerDown={onEditorPointerDown}>
|
|
393
433
|
<div className={!expanded && needsTruncation ? "max-h-[90px] overflow-hidden" : ""}>
|
|
394
434
|
<Suspense fallback={
|
|
395
435
|
<div className="flex flex-col space-y-2 p-3 min-h-24">
|
|
@@ -411,7 +451,7 @@ export function StoryDetailBody({
|
|
|
411
451
|
/>
|
|
412
452
|
</Suspense>
|
|
413
453
|
</div>
|
|
414
|
-
|
|
454
|
+
{!isEditorFocused && isDescEmpty && (
|
|
415
455
|
<div className="pointer-events-none absolute top-3 left-6 text-sm text-muted-foreground select-none">
|
|
416
456
|
{t("create.addDescription")}
|
|
417
457
|
</div>
|
|
@@ -545,9 +585,11 @@ export function StoryDetailBody({
|
|
|
545
585
|
projectId={story.projectId}
|
|
546
586
|
data={relationsData}
|
|
547
587
|
onRefresh={onRelationsUpdate ?? (() => { })}
|
|
588
|
+
onAppendActivities={onAppendActivities}
|
|
548
589
|
users={users}
|
|
549
590
|
projects={projects?.map((p) => ({ ...p, displayId: p.displayId ?? null }))}
|
|
550
591
|
labels={labels}
|
|
592
|
+
onNavigateInPanel={onNavigateInPanel}
|
|
551
593
|
/>
|
|
552
594
|
</div>
|
|
553
595
|
)}
|
|
@@ -555,15 +597,25 @@ export function StoryDetailBody({
|
|
|
555
597
|
<StoryProperties
|
|
556
598
|
story={{
|
|
557
599
|
id: story.id,
|
|
600
|
+
name: story.name,
|
|
601
|
+
description: story.description,
|
|
558
602
|
parentId: story.parentId,
|
|
559
603
|
parent: story.parent,
|
|
560
604
|
labels: story.labels,
|
|
561
605
|
projectId: story.projectId,
|
|
606
|
+
iteration: story.iteration ?? null,
|
|
562
607
|
}}
|
|
563
608
|
labels={labels}
|
|
564
609
|
projects={projects}
|
|
610
|
+
iterations={iterations}
|
|
565
611
|
onParentChange={updateParent}
|
|
566
612
|
onLabelsChange={updateLabels}
|
|
613
|
+
onIterationChange={(it) => {
|
|
614
|
+
if (onStoryUpdate) {
|
|
615
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
616
|
+
onStoryUpdate({ ...story, iteration: it } as any);
|
|
617
|
+
}
|
|
618
|
+
}}
|
|
567
619
|
onActivities={onAppendActivities}
|
|
568
620
|
/>
|
|
569
621
|
|