@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.
Files changed (170) hide show
  1. package/package.json +239 -30
  2. package/src/components/iteration/auto-schedule-dialog.tsx +150 -0
  3. package/src/components/iteration/burndown-chart.tsx +63 -0
  4. package/src/components/iteration/constants.ts +28 -0
  5. package/src/components/iteration/create-iteration-dialog.tsx +140 -0
  6. package/src/components/iteration/iteration-card.tsx +60 -0
  7. package/src/components/iteration/iteration-editor.tsx +116 -0
  8. package/src/components/iteration/iteration-progress-bar.tsx +44 -0
  9. package/src/components/iteration/iteration-status-badge.tsx +33 -0
  10. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +21 -30
  11. package/src/components/knowledge/knowledge-toolbar.tsx +124 -1
  12. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +2 -2
  13. package/src/components/layout/sidebar-03/nav-workspace.tsx +2 -2
  14. package/src/components/project/create-project-dialog.tsx +44 -57
  15. package/src/components/shared/__tests__/lucide-curated-icons.test.ts +83 -0
  16. package/src/components/shared/__tests__/lucide-icon-data.test.ts +131 -0
  17. package/src/components/shared/__tests__/lucide-icon-picker.test.tsx +197 -0
  18. package/src/components/shared/lucide-icon-picker/curated-icons.ts +478 -0
  19. package/src/components/shared/lucide-icon-picker/icon-data.ts +109 -0
  20. package/src/components/shared/lucide-icon-picker/index.tsx +82 -0
  21. package/src/components/shared/lucide-icon-picker/lucide-icon-by-name.tsx +78 -0
  22. package/src/components/shared/lucide-icon-picker/panel.tsx +163 -0
  23. package/src/components/story/__tests__/constants.test.ts +255 -0
  24. package/src/components/story/ai/story-ai-panel.tsx +23 -15
  25. package/src/components/story/ai/story-ai-preview-list.tsx +19 -0
  26. package/src/components/story/constants.ts +43 -1
  27. package/src/components/story/create-story-dialog.tsx +42 -16
  28. package/src/components/story/detail/__tests__/associated-attachments-panel.test.tsx +114 -0
  29. package/src/components/story/detail/__tests__/categories.test.tsx +62 -0
  30. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +49 -0
  31. package/src/components/story/detail/activity-timeline.tsx +26 -4
  32. package/src/components/story/detail/story-detail-body.tsx +90 -38
  33. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +857 -0
  34. package/src/components/story/detail/story-detail-toolbar/categories.tsx +23 -18
  35. package/src/components/story/detail/story-detail-toolbar/children.tsx +9 -4
  36. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +95 -27
  37. package/src/components/story/detail/story-detail-toolbar.tsx +159 -8
  38. package/src/components/story/detail/story-properties.tsx +21 -4
  39. package/src/components/story/display/__tests__/group-fields.test.ts +107 -0
  40. package/src/components/story/display/group-resolver.tsx +2 -2
  41. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +155 -0
  42. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +155 -0
  43. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +173 -0
  44. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +174 -0
  45. package/src/components/story/inline-editors/dependency-type-select.tsx +180 -0
  46. package/src/components/story/inline-editors/index.ts +2 -1
  47. package/src/components/story/inline-editors/labels-editor.tsx +159 -3
  48. package/src/components/story/inline-editors/story-select-dialog.tsx +41 -63
  49. package/src/components/story/peek-panel.tsx +121 -21
  50. package/src/components/story/relations/__tests__/attachment-manage-dialog.test.tsx +171 -0
  51. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +174 -0
  52. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +93 -0
  53. package/src/components/story/relations/attachment-manage-dialog.tsx +490 -0
  54. package/src/components/story/relations/file-preview.tsx +173 -0
  55. package/src/components/story/relations/format.ts +120 -0
  56. package/src/components/story/relations/general-groups.ts +32 -0
  57. package/src/components/story/relations/knowledge-select-dialog.tsx +403 -0
  58. package/src/components/story/relations/link-manage-dialog.tsx +192 -0
  59. package/src/components/story/relations/story-ref-row.tsx +17 -27
  60. package/src/components/story/story-panel-header.tsx +25 -19
  61. package/src/components/story/story-toolbar.tsx +3 -3
  62. package/src/components/story/transfer-story-popover.tsx +2 -2
  63. package/src/components/story/types.ts +14 -0
  64. package/src/components/story/views/create-view-dialog.tsx +3 -3
  65. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +219 -0
  66. package/src/components/story/views/story-list/group.tsx +1 -1
  67. package/src/components/story/views/story-list/inline-story-creator.tsx +2 -2
  68. package/src/components/story/views/story-list/row.tsx +1 -1
  69. package/src/components/workspace/create-workspace-dialog.tsx +41 -49
  70. package/src/lib/__tests__/project-display-id.test.ts +8 -5
  71. package/src/lib/changelog/sdk-versions.ts +20 -20
  72. package/src/lib/iteration/__tests__/status.test.ts +41 -0
  73. package/src/lib/iteration/status.ts +28 -0
  74. package/src/lib/project-display-id.ts +14 -5
  75. package/src/lib/project-module-meta.ts +77 -0
  76. package/src/lib/story/__tests__/video-embed.test.ts +77 -0
  77. package/src/lib/story/video-embed.ts +59 -0
  78. package/src/lib/utils.d.ts +1 -1
  79. package/src/plugins/.gen-manifest.json +13 -0
  80. package/src/plugins/modules.gen.ts +20 -0
  81. package/src/plugins/plugins.gen.ts +20 -0
  82. package/src/plugins/ui.gen.ts +8 -0
  83. package/src/providers/index.tsx +6 -0
  84. package/src/routeTree.gen.ts +96 -0
  85. package/src/routes/__root.tsx +0 -8
  86. package/src/routes/_nav/inspiration/route.tsx +8 -0
  87. package/src/routes/_nav/knowledge/index.lazy.tsx +2 -2
  88. package/src/routes/_nav/prd/$id/route.tsx +9 -0
  89. package/src/routes/_nav/prd/index.tsx +9 -0
  90. package/src/routes/_nav/prd/route.tsx +8 -0
  91. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +52 -25
  92. package/src/routes/_nav/projects/$projectId/$storyId/route.tsx +6 -3
  93. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +32 -15
  94. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +289 -0
  95. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.tsx +27 -0
  96. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +111 -0
  97. package/src/routes/_nav/projects/$projectId/iterations/index.tsx +24 -0
  98. package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
  99. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +78 -7
  100. package/src/routes/_nav/projects/$projectId/settings/route.tsx +6 -2
  101. package/src/routes/_nav/stories/$storyId/route.lazy.tsx +5 -1
  102. package/src/routes/_nav/stories/$storyId/route.tsx +4 -0
  103. package/src/routes/_nav/tags/$id/route.tsx +8 -0
  104. package/src/routes/_nav/tags/index.tsx +8 -0
  105. package/src/routes/_nav/tags/route.tsx +8 -0
  106. package/src/routes/_nav/tags/settings/route.tsx +9 -0
  107. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +3 -3
  108. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +4 -4
  109. package/src/routes/_nav/workspaces/index.lazy.tsx +3 -3
  110. package/src/routes/api/attachments/$id/content.ts +60 -0
  111. package/src/routes/api/attachments/upload.ts +148 -0
  112. package/src/routes/share/prd/$prdId/route.tsx +10 -0
  113. package/src/server/serverFns/__tests__/project-kb.test.ts +147 -0
  114. package/src/server/serverFns/iteration/__tests__/auto-schedule-core.test.ts +62 -0
  115. package/src/server/serverFns/iteration/__tests__/burndown-core.test.ts +90 -0
  116. package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +211 -0
  117. package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +155 -0
  118. package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +136 -0
  119. package/src/server/serverFns/iteration/auto-schedule-core.ts +54 -0
  120. package/src/server/serverFns/iteration/auto-schedule-internal.ts +88 -0
  121. package/src/server/serverFns/iteration/burndown-core.ts +60 -0
  122. package/src/server/serverFns/iteration/index.ts +22 -0
  123. package/src/server/serverFns/iteration/iteration-auto-schedule.ts +66 -0
  124. package/src/server/serverFns/iteration/iteration-burndown.ts +70 -0
  125. package/src/server/serverFns/iteration/iteration-crud.ts +208 -0
  126. package/src/server/serverFns/iteration/iteration-stories.ts +111 -0
  127. package/src/server/serverFns/iteration/iteration-transfer.ts +42 -0
  128. package/src/server/serverFns/iteration/schemas.ts +58 -0
  129. package/src/server/serverFns/iteration/transfer-internal.ts +62 -0
  130. package/src/server/serverFns/knowledge.ts +50 -4
  131. package/src/server/serverFns/project/module-overview.ts +109 -0
  132. package/src/server/serverFns/project.ts +45 -2
  133. package/src/server/serverFns/story/__tests__/kb-scope.test.ts +56 -0
  134. package/src/server/serverFns/story/__tests__/label-suggest-fn.test.ts +100 -0
  135. package/src/server/serverFns/story/__tests__/labels.test.ts +67 -0
  136. package/src/server/serverFns/story/__tests__/story-assoc.test.ts +222 -0
  137. package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +132 -2
  138. package/src/server/serverFns/story/index.ts +9 -4
  139. package/src/server/serverFns/story/kb-general.ts +39 -0
  140. package/src/server/serverFns/story/kb-scope.ts +52 -0
  141. package/src/server/serverFns/story/link-preview.ts +115 -0
  142. package/src/server/serverFns/story/story-assoc.ts +372 -51
  143. package/src/server/serverFns/story/story-attachments.ts +32 -45
  144. package/src/{components/project/project-icon.tsx → server/serverFns/story/story-crud/label-palette.ts} +16 -19
  145. package/src/server/serverFns/story/story-crud/label-suggest-core.ts +88 -0
  146. package/src/server/serverFns/story/story-crud/label-suggest.ts +38 -0
  147. package/src/{components/knowledge/knowledge-icon.tsx → server/serverFns/story/story-crud/label-upsert.ts} +13 -19
  148. package/src/server/serverFns/story/story-crud/labels.ts +3 -5
  149. package/src/server/serverFns/story/story-crud.ts +53 -6
  150. package/src/server/serverFns/story/story-dependencies.ts +158 -5
  151. package/src/server/serverFns/story/story-links.ts +43 -7
  152. package/src/server/serverFns/story/story-transfer.ts +5 -4
  153. package/src/server/serverFns/story/story-tree.ts +28 -1
  154. package/src/server/serverFns/story/types.ts +38 -0
  155. package/src/styles/globals.css +25 -0
  156. package/src/types/project.ts +5 -5
  157. package/vite.shared.ts +2 -0
  158. package/src/components/project/project-animated-icon.tsx +0 -73
  159. package/src/components/shared/icon-packs/index.ts +0 -1
  160. package/src/components/shared/icon-packs/knowledge.ts +0 -1
  161. package/src/components/shared/icon-packs/prd.ts +0 -1
  162. package/src/components/shared/icon-packs/project.ts +0 -1
  163. package/src/components/shared/icon-picker.tsx +0 -1
  164. package/src/components/story/detail/story-detail-toolbar/attachments.tsx +0 -73
  165. package/src/components/story/detail/story-detail-toolbar/knowledge.tsx +0 -73
  166. package/src/components/story/detail/story-detail-toolbar/links.tsx +0 -73
  167. package/src/components/story/relations/attachments-panel.tsx +0 -179
  168. package/src/components/story/relations/knowledge-panel.tsx +0 -284
  169. package/src/components/story/relations/links-panel.tsx +0 -240
  170. 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 { ProjectIconDisplay } from "@/components/project/project-icon";
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
- projects?: { id: string; name: string; icon: string; displayId?: string | null }[];
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
- {project && (
349
- <Tooltip>
350
- <TooltipTrigger asChild>
351
- <span className="flex cursor-default items-center">
352
- <ProjectIconDisplay name={project.icon} size={16} className="shrink-0 text-muted-foreground" />
353
- </span>
354
- </TooltipTrigger>
355
- <TooltipContent>
356
- <div className="flex flex-col">
357
- <span className="text-[10px] font-medium uppercase tracking-wide text-muted-foreground">{t("detail.belongsTo")}</span>
358
- <span>{project.name}</span>
359
- </div>
360
- </TooltipContent>
361
- </Tooltip>
362
- )}
363
- {identifier && (
364
- <Tooltip>
365
- <TooltipTrigger asChild>
366
- <button
367
- type="button"
368
- onClick={() => {
369
- navigator.clipboard.writeText(identifier)
370
- .then(() => toast.success(t("detail.copied", { identifier })))
371
- .catch(() => toast.error(t("detail.copyFailed")));
372
- }}
373
- className="text-sm font-mono text-muted-foreground hover:text-foreground transition-colors cursor-pointer"
374
- >
375
- {identifier}
376
- </button>
377
- </TooltipTrigger>
378
- <TooltipContent>{t("detail.clickToCopy")}</TooltipContent>
379
- </Tooltip>
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 && !(descContent.markdown ?? "").trim() ? " story-editor-no-placeholder" : ""}`} style={{ "--notion-content-width": "1fr", "--notion-margin-width": "0px" } as React.CSSProperties} onPointerDown={onEditorPointerDown}>
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
- {!isEditorFocused && !(descContent.markdown ?? "").trim() && (
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