@burdenoff/microfe-planmagnet 2026.927.3 → 2026.927.5

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 (166) hide show
  1. package/dist/generated/global-types.d.ts +9 -1
  2. package/dist/generated/global-types.d.ts.map +1 -1
  3. package/dist/generated/wspace-operations.d.ts +0 -12
  4. package/dist/generated/wspace-operations.d.ts.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  6. package/dist/planmagnet/PlanMagnetRoutes.js +14 -10
  7. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  8. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  9. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +149 -127
  10. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  11. package/dist/planmagnet/controls/FeatureControls.d.ts +26 -0
  12. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -0
  13. package/dist/planmagnet/controls/FeatureControls.js +321 -0
  14. package/dist/planmagnet/controls/FeatureControls.js.map +1 -0
  15. package/dist/planmagnet/controls/FeatureTriage.d.ts +21 -0
  16. package/dist/planmagnet/controls/FeatureTriage.d.ts.map +1 -0
  17. package/dist/planmagnet/controls/FeatureTriage.js +398 -0
  18. package/dist/planmagnet/controls/FeatureTriage.js.map +1 -0
  19. package/dist/planmagnet/controls/MilestoneControls.d.ts +17 -0
  20. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -0
  21. package/dist/planmagnet/controls/MilestoneControls.js +203 -0
  22. package/dist/planmagnet/controls/MilestoneControls.js.map +1 -0
  23. package/dist/planmagnet/controls/ObjectiveControls.d.ts +31 -0
  24. package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +1 -0
  25. package/dist/planmagnet/controls/ObjectiveControls.js +296 -0
  26. package/dist/planmagnet/controls/ObjectiveControls.js.map +1 -0
  27. package/dist/planmagnet/controls/Pickers.d.ts +26 -0
  28. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -0
  29. package/dist/planmagnet/controls/Pickers.js +171 -0
  30. package/dist/planmagnet/controls/Pickers.js.map +1 -0
  31. package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -1
  32. package/dist/planmagnet/controls/ProjectControls.js +47 -44
  33. package/dist/planmagnet/controls/ProjectControls.js.map +1 -1
  34. package/dist/planmagnet/controls/ReleaseControls.d.ts +14 -0
  35. package/dist/planmagnet/controls/ReleaseControls.d.ts.map +1 -0
  36. package/dist/planmagnet/controls/ReleaseControls.js +111 -0
  37. package/dist/planmagnet/controls/ReleaseControls.js.map +1 -0
  38. package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -1
  39. package/dist/planmagnet/controls/WorkItemControls.js +68 -65
  40. package/dist/planmagnet/controls/WorkItemControls.js.map +1 -1
  41. package/dist/planmagnet/hooks/useCounts.d.ts +39 -0
  42. package/dist/planmagnet/hooks/useCounts.d.ts.map +1 -0
  43. package/dist/planmagnet/hooks/useCounts.js +209 -0
  44. package/dist/planmagnet/hooks/useCounts.js.map +1 -0
  45. package/dist/planmagnet/import/exportColumns.d.ts +52 -0
  46. package/dist/planmagnet/import/exportColumns.d.ts.map +1 -0
  47. package/dist/planmagnet/import/exportColumns.js +81 -0
  48. package/dist/planmagnet/import/exportColumns.js.map +1 -0
  49. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +255 -242
  51. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +199 -160
  54. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +190 -153
  57. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +63 -56
  60. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/GoalsGoalsPagePage.js +2 -7
  63. package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +229 -214
  66. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +145 -114
  69. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +134 -105
  72. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -1
  73. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -1
  74. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +97 -117
  75. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -1
  76. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  77. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +169 -110
  78. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  79. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  80. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +117 -103
  81. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  82. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  83. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +119 -94
  84. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  85. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  86. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +4 -8
  87. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  88. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  89. package/dist/planmagnet/pages/ProductsProductsPagePage.js +85 -90
  90. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  91. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  92. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +118 -107
  93. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  94. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  95. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +4 -2
  96. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  97. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -1
  98. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +48 -71
  99. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
  100. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
  101. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +17 -13
  102. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  103. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
  104. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +1 -1
  105. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
  106. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  107. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +55 -63
  108. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  109. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  110. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +11 -8
  111. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  112. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -1
  113. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +1 -1
  114. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -1
  115. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  116. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +152 -139
  117. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  118. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  119. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +75 -74
  120. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  121. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +7 -0
  122. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  123. package/dist/planmagnet/pages/ReportsReportsPagePage.js +39 -201
  124. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  125. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  126. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +118 -99
  127. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  128. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +123 -128
  129. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  130. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  131. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +139 -107
  132. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  133. package/dist/planmagnet/pages/TasksImportPagePage.d.ts +2 -0
  134. package/dist/planmagnet/pages/TasksImportPagePage.d.ts.map +1 -0
  135. package/dist/planmagnet/pages/TasksImportPagePage.js +309 -0
  136. package/dist/planmagnet/pages/TasksImportPagePage.js.map +1 -0
  137. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  138. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +173 -126
  139. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  140. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  141. package/dist/planmagnet/pages/TasksTasksPagePage.js +111 -104
  142. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  143. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  144. package/dist/planmagnet/pages/TeamTeamPagePage.js +99 -177
  145. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  146. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -1
  147. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +8 -4
  148. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -1
  149. package/dist/planmagnet/releases/ReleaseWorkItemsCard.d.ts.map +1 -1
  150. package/dist/planmagnet/releases/ReleaseWorkItemsCard.js +10 -4
  151. package/dist/planmagnet/releases/ReleaseWorkItemsCard.js.map +1 -1
  152. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +1 -1
  153. package/dist/planmagnet/roadmaps/RoadmapControls.js +150 -137
  154. package/dist/planmagnet/roadmaps/RoadmapControls.js.map +1 -1
  155. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  156. package/dist/planmagnet/sprints/SprintControls.js +32 -30
  157. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  158. package/dist/planmagnet/utils/mutationResult.d.ts +10 -0
  159. package/dist/planmagnet/utils/mutationResult.d.ts.map +1 -1
  160. package/dist/planmagnet/utils/mutationResult.js +2 -1
  161. package/dist/planmagnet/utils/mutationResult.js.map +1 -1
  162. package/dist/planmagnet/utils/rowNavigation.d.ts +2 -0
  163. package/dist/planmagnet/utils/rowNavigation.d.ts.map +1 -1
  164. package/dist/planmagnet/utils/rowNavigation.js +9 -8
  165. package/dist/planmagnet/utils/rowNavigation.js.map +1 -1
  166. package/package.json +1 -1
@@ -1,18 +1,19 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { PersonName as n } from "../people/People.js";
3
3
  import { throwOnError as r } from "../utils/mutationResult.js";
4
- import { MarkdownEditor as i } from "../../components/MarkdownEditor.js";
5
- import { WORK_ITEM_PRIORITIES as a, WORK_ITEM_STATUSES as o, WorkItemAssigneeSelect as s, WorkItemEnumSelect as c, WorkItemHeaderActions as l } from "../controls/WorkItemControls.js";
6
- import { WorkItemComments as u } from "../comments/WorkItemComments.js";
7
- import { WorkItemActivity as d } from "../comments/WorkItemActivity.js";
8
- import { useState as f } from "react";
9
- import { FileText as p, Plus as m, X as h } from "lucide-react";
10
- import { gql as g } from "@apollo/client";
11
- import { useMutation as _, useQuery as v } from "@apollo/client/react";
12
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
13
- import { Badge as x, Button as S, Card as C, CardContent as w, CardHeader as T, CardTitle as E, Input as D } from "@burdenoff/fe-libs/ui";
4
+ import { DocSearchSelect as i } from "../controls/Pickers.js";
5
+ import { MarkdownEditor as a } from "../../components/MarkdownEditor.js";
6
+ import { WORK_ITEM_PRIORITIES as o, WORK_ITEM_STATUSES as s, WorkItemAssigneeSelect as c, WorkItemEnumSelect as l, WorkItemHeaderActions as u } from "../controls/WorkItemControls.js";
7
+ import { WorkItemComments as d } from "../comments/WorkItemComments.js";
8
+ import { WorkItemActivity as f } from "../comments/WorkItemActivity.js";
9
+ import { useState as p } from "react";
10
+ import { FileText as m, Link2 as h, Plus as g, X as _ } from "lucide-react";
11
+ import { gql as v } from "@apollo/client";
12
+ import { useMutation as y, useQuery as b } from "@apollo/client/react";
13
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
14
+ import { Badge as C, Button as w, Card as T, CardContent as E, CardHeader as D, CardTitle as O, Input as k } from "@burdenoff/fe-libs/ui";
14
15
  //#region src/planmagnet/pages/TasksTaskDetailPagePage.tsx
15
- var O = g`
16
+ var A = v`
16
17
  query GetWorkItemDetail($workItemId: ID!) {
17
18
  planmagnetWorkItem(id: $workItemId) {
18
19
  id
@@ -35,7 +36,7 @@ var O = g`
35
36
  updatedAt
36
37
  }
37
38
  }
38
- `, k = g`
39
+ `, j = v`
39
40
  query GetWorkItemDocs($workItemId: ID!) {
40
41
  planmagnetWorkItemDocs(workItemId: $workItemId) {
41
42
  id
@@ -45,304 +46,350 @@ var O = g`
45
46
  updatedAt
46
47
  }
47
48
  }
48
- `, A = g`
49
+ `, M = v`
49
50
  mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {
50
51
  planmagnetCreateDoc(input: $input) {
51
52
  id
52
53
  }
53
54
  }
54
- `, j = g`
55
+ `, N = v`
55
56
  mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {
56
57
  planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {
57
58
  id
58
59
  }
59
60
  }
60
- `, M = g`
61
+ `, P = v`
61
62
  mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {
62
63
  planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)
63
64
  }
64
- `, N = {
65
+ `, F = {
65
66
  DRAFT: "bg-gray-100 text-gray-800",
66
67
  PUBLISHED: "bg-green-100 text-green-800",
67
68
  ARCHIVED: "bg-gray-100 text-gray-500"
68
69
  };
69
- function P({ workItemId: e }) {
70
- let n = t(), [a, o] = f(!1), [s, c] = f(""), [l, u] = f(""), { data: d, loading: g, error: x, refetch: O } = v(k, {
70
+ function I({ workItemId: e }) {
71
+ let n = t(), [o, s] = p(!1), [c, l] = p(!1), [u, d] = p(""), [f, v] = p(""), [C, A] = p(""), { data: I, loading: L, error: R, refetch: z } = b(j, {
71
72
  variables: { workItemId: e },
72
73
  skip: !e
73
- }), [P, { loading: F }] = _(A), [I] = _(j), [L, { loading: R }] = _(M), [z, B] = f(null), V = d?.planmagnetWorkItemDocs ?? [], H = async () => {
74
- if (!(!s.trim() || !l.trim())) {
75
- B(null);
74
+ }), [B, { loading: V }] = y(M), [H, { loading: U }] = y(N), [W, { loading: G }] = y(P), [K, q] = p(null), J = I?.planmagnetWorkItemDocs ?? [], Y = async () => {
75
+ if (!(!f.trim() || !C.trim())) {
76
+ q(null);
76
77
  try {
77
- let t = (await r(P({ variables: { input: {
78
- title: s.trim(),
79
- content: l.trim()
78
+ let t = (await r(B({ variables: { input: {
79
+ title: f.trim(),
80
+ content: C.trim()
80
81
  } } }))).data?.planmagnetCreateDoc?.id;
81
- t && await r(I({ variables: {
82
+ t && await r(H({ variables: {
82
83
  docId: t,
83
84
  workItemId: e
84
85
  } }));
85
86
  } catch (e) {
86
- B(e instanceof Error ? e.message : "The doc could not be saved.");
87
+ q(e instanceof Error ? e.message : "The doc could not be saved.");
87
88
  return;
88
89
  }
89
- c(""), u(""), o(!1), O();
90
+ v(""), A(""), s(!1), z();
90
91
  }
91
- }, U = async (t) => {
92
- B(null);
92
+ }, X = async () => {
93
+ if (u) {
94
+ q(null);
95
+ try {
96
+ await r(H({ variables: {
97
+ docId: u,
98
+ workItemId: e
99
+ } }));
100
+ } catch (e) {
101
+ q(e instanceof Error ? e.message : "The doc could not be linked.");
102
+ return;
103
+ }
104
+ d(""), l(!1), z();
105
+ }
106
+ }, Z = async (t) => {
107
+ q(null);
93
108
  try {
94
- await r(L({ variables: {
109
+ await r(W({ variables: {
95
110
  docId: t,
96
111
  workItemId: e
97
112
  } }));
98
113
  } catch (e) {
99
- B(e instanceof Error ? e.message : "The doc could not be unlinked.");
114
+ q(e instanceof Error ? e.message : "The doc could not be unlinked.");
100
115
  return;
101
116
  }
102
- O();
117
+ z();
103
118
  };
104
- return /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ b(T, {
119
+ return /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ S(D, {
105
120
  className: "flex flex-row items-center justify-between space-y-0",
106
- children: [/* @__PURE__ */ y(E, { children: "Linked Docs" }), !a && /* @__PURE__ */ b(S, {
107
- size: "sm",
108
- variant: "outline",
109
- onClick: () => o(!0),
110
- children: [/* @__PURE__ */ y(m, { className: "h-4 w-4 mr-1" }), "New Doc"]
121
+ children: [/* @__PURE__ */ x(O, { children: "Linked Docs" }), !o && !c && /* @__PURE__ */ S("div", {
122
+ className: "flex gap-2",
123
+ children: [/* @__PURE__ */ S(w, {
124
+ size: "sm",
125
+ variant: "outline",
126
+ onClick: () => l(!0),
127
+ children: [/* @__PURE__ */ x(h, { className: "h-4 w-4 mr-1" }), "Link existing doc"]
128
+ }), /* @__PURE__ */ S(w, {
129
+ size: "sm",
130
+ variant: "outline",
131
+ onClick: () => s(!0),
132
+ children: [/* @__PURE__ */ x(g, { className: "h-4 w-4 mr-1" }), "New Doc"]
133
+ })]
111
134
  })]
112
- }), /* @__PURE__ */ b(w, {
135
+ }), /* @__PURE__ */ S(E, {
113
136
  className: "space-y-4",
114
137
  children: [
115
- a && /* @__PURE__ */ b("div", {
138
+ c && /* @__PURE__ */ S("div", {
139
+ className: "space-y-2 rounded-md border border-input p-3",
140
+ children: [/* @__PURE__ */ x(i, {
141
+ id: "task-link-doc",
142
+ value: u,
143
+ onChange: d,
144
+ exclude: J.map((e) => e.id)
145
+ }), /* @__PURE__ */ S("div", {
146
+ className: "flex gap-2 justify-end",
147
+ children: [/* @__PURE__ */ x(w, {
148
+ size: "sm",
149
+ variant: "ghost",
150
+ onClick: () => {
151
+ l(!1), d("");
152
+ },
153
+ children: "Cancel"
154
+ }), /* @__PURE__ */ x(w, {
155
+ size: "sm",
156
+ disabled: !u || U,
157
+ onClick: X,
158
+ children: U ? "Linking..." : "Link"
159
+ })]
160
+ })]
161
+ }),
162
+ o && /* @__PURE__ */ S("div", {
116
163
  className: "space-y-3 rounded-md border border-input p-3",
117
164
  children: [
118
- /* @__PURE__ */ y(D, {
165
+ /* @__PURE__ */ x(k, {
119
166
  placeholder: "Doc title",
120
- value: s,
121
- onChange: (e) => c(e.target.value)
167
+ value: f,
168
+ onChange: (e) => v(e.target.value)
122
169
  }),
123
- /* @__PURE__ */ y(i, {
124
- value: l,
125
- onChange: u,
170
+ /* @__PURE__ */ x(a, {
171
+ value: C,
172
+ onChange: A,
126
173
  placeholder: "Write the spec/doc content...",
127
174
  minHeight: 140
128
175
  }),
129
- /* @__PURE__ */ b("div", {
176
+ /* @__PURE__ */ S("div", {
130
177
  className: "flex gap-2 justify-end",
131
- children: [/* @__PURE__ */ y(S, {
178
+ children: [/* @__PURE__ */ x(w, {
132
179
  size: "sm",
133
180
  variant: "ghost",
134
181
  onClick: () => {
135
- o(!1), c(""), u("");
182
+ s(!1), v(""), A("");
136
183
  },
137
184
  children: "Cancel"
138
- }), /* @__PURE__ */ y(S, {
185
+ }), /* @__PURE__ */ x(w, {
139
186
  size: "sm",
140
- disabled: F || !s.trim() || !l.trim(),
141
- onClick: H,
142
- children: F ? "Creating..." : "Create & Link"
187
+ disabled: V || !f.trim() || !C.trim(),
188
+ onClick: Y,
189
+ children: V ? "Creating..." : "Create & Link"
143
190
  })]
144
191
  })
145
192
  ]
146
193
  }),
147
- g && /* @__PURE__ */ y("p", {
194
+ L && /* @__PURE__ */ x("p", {
148
195
  className: "text-sm text-muted-foreground",
149
196
  children: "Loading docs..."
150
197
  }),
151
- x && /* @__PURE__ */ b("p", {
198
+ R && /* @__PURE__ */ S("p", {
152
199
  className: "text-sm text-red-500",
153
- children: ["Error: ", x.message]
200
+ children: ["Error: ", R.message]
154
201
  }),
155
- z && /* @__PURE__ */ y("p", {
202
+ K && /* @__PURE__ */ x("p", {
156
203
  role: "alert",
157
204
  className: "text-sm text-destructive",
158
- children: z
205
+ children: K
159
206
  }),
160
- !g && !x && V.length === 0 && !a && /* @__PURE__ */ y("p", {
207
+ !L && !R && J.length === 0 && !o && !c && /* @__PURE__ */ x("p", {
161
208
  className: "text-sm text-muted-foreground",
162
209
  children: "No docs linked to this work item yet."
163
210
  }),
164
- V.map((e) => /* @__PURE__ */ b("div", {
211
+ J.map((e) => /* @__PURE__ */ S("div", {
165
212
  className: "flex items-center justify-between gap-3 rounded-md border border-input p-3",
166
- children: [/* @__PURE__ */ b("div", {
213
+ children: [/* @__PURE__ */ S("div", {
167
214
  className: "flex items-center gap-2 min-w-0",
168
- children: [/* @__PURE__ */ y(p, { className: "h-4 w-4 text-muted-foreground shrink-0" }), /* @__PURE__ */ b("div", {
215
+ children: [/* @__PURE__ */ x(m, { className: "h-4 w-4 text-muted-foreground shrink-0" }), /* @__PURE__ */ S("div", {
169
216
  className: "min-w-0",
170
- children: [/* @__PURE__ */ y("button", {
217
+ children: [/* @__PURE__ */ x("button", {
171
218
  type: "button",
172
219
  className: "block max-w-full truncate text-left text-sm font-medium hover:underline",
173
220
  onClick: () => n(`/docs/doc-detail-page?docId=${encodeURIComponent(e.id)}`),
174
221
  children: e.title
175
- }), /* @__PURE__ */ b("p", {
222
+ }), /* @__PURE__ */ S("p", {
176
223
  className: "text-xs text-muted-foreground",
177
224
  children: ["v", e.version]
178
225
  })]
179
226
  })]
180
- }), /* @__PURE__ */ b("div", {
227
+ }), /* @__PURE__ */ S("div", {
181
228
  className: "flex items-center gap-2 shrink-0",
182
- children: [/* @__PURE__ */ y("span", {
183
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${N[e.status] ?? ""}`,
229
+ children: [/* @__PURE__ */ x("span", {
230
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${F[e.status] ?? ""}`,
184
231
  children: e.status.toLowerCase()
185
- }), /* @__PURE__ */ y(S, {
232
+ }), /* @__PURE__ */ x(w, {
186
233
  size: "icon",
187
234
  variant: "ghost",
188
- disabled: R,
189
- onClick: () => U(e.id),
235
+ disabled: G,
236
+ onClick: () => Z(e.id),
190
237
  "aria-label": `Unlink ${e.title}`,
191
- children: /* @__PURE__ */ y(h, { className: "h-4 w-4" })
238
+ children: /* @__PURE__ */ x(_, { className: "h-4 w-4" })
192
239
  })]
193
240
  })]
194
241
  }, e.id))
195
242
  ]
196
243
  })] });
197
244
  }
198
- function F() {
199
- let { workspaceId: t } = e(), r = new URLSearchParams(window.location.search).get("taskId") ?? "", { data: i, loading: f, error: p } = v(O, {
245
+ function L() {
246
+ let { workspaceId: t } = e(), r = new URLSearchParams(window.location.search).get("taskId") ?? "", { data: i, loading: a, error: p } = b(A, {
200
247
  variables: { workItemId: r },
201
248
  skip: !t || !r
202
249
  });
203
- if (f && !i) return /* @__PURE__ */ y("div", {
250
+ if (a && !i) return /* @__PURE__ */ x("div", {
204
251
  className: "flex items-center justify-center p-12",
205
- children: /* @__PURE__ */ y("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
252
+ children: /* @__PURE__ */ x("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
206
253
  });
207
- if (p) return /* @__PURE__ */ b("div", {
254
+ if (p) return /* @__PURE__ */ S("div", {
208
255
  className: "p-6 text-red-500",
209
256
  children: ["Error: ", p.message]
210
257
  });
211
258
  let m = i?.planmagnetWorkItem;
212
- return m ? /* @__PURE__ */ b("div", {
259
+ return m ? /* @__PURE__ */ S("div", {
213
260
  className: "space-y-6 p-6",
214
- children: [/* @__PURE__ */ b("div", {
261
+ children: [/* @__PURE__ */ S("div", {
215
262
  className: "flex items-start justify-between gap-4",
216
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h1", {
263
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
217
264
  className: "text-2xl font-semibold",
218
265
  children: m.title
219
- }), /* @__PURE__ */ b("p", {
266
+ }), /* @__PURE__ */ S("p", {
220
267
  className: "text-sm text-muted-foreground",
221
268
  children: [
222
269
  m.key,
223
270
  " · ",
224
271
  m.type.toLowerCase()
225
272
  ]
226
- })] }), /* @__PURE__ */ y(l, {
273
+ })] }), /* @__PURE__ */ x(u, {
227
274
  workItemId: m.id,
228
275
  title: m.title
229
276
  })]
230
- }), /* @__PURE__ */ b("div", {
277
+ }), /* @__PURE__ */ S("div", {
231
278
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
232
- children: [/* @__PURE__ */ b("div", {
279
+ children: [/* @__PURE__ */ S("div", {
233
280
  className: "lg:col-span-2 space-y-6",
234
281
  children: [
235
- /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(T, { children: /* @__PURE__ */ y(E, { children: "Description" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("p", {
282
+ /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "Description" }) }), /* @__PURE__ */ x(E, { children: /* @__PURE__ */ x("p", {
236
283
  className: "text-sm",
237
284
  children: m.description ?? "No description provided."
238
285
  }) })] }),
239
- /* @__PURE__ */ y(P, { workItemId: m.id }),
240
- /* @__PURE__ */ y(u, { workItemId: m.id }),
241
- /* @__PURE__ */ y(d, { workItemId: m.id })
286
+ /* @__PURE__ */ x(I, { workItemId: m.id }),
287
+ /* @__PURE__ */ x(d, { workItemId: m.id }),
288
+ /* @__PURE__ */ x(f, { workItemId: m.id })
242
289
  ]
243
- }), /* @__PURE__ */ y("div", {
290
+ }), /* @__PURE__ */ x("div", {
244
291
  className: "space-y-6",
245
- children: /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(T, { children: /* @__PURE__ */ y(E, { children: "Details" }) }), /* @__PURE__ */ b(w, {
292
+ children: /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "Details" }) }), /* @__PURE__ */ S(E, {
246
293
  className: "space-y-3 text-sm",
247
294
  children: [
248
- /* @__PURE__ */ b("div", {
295
+ /* @__PURE__ */ S("div", {
249
296
  className: "flex items-start justify-between gap-2",
250
- children: [/* @__PURE__ */ y("span", {
297
+ children: [/* @__PURE__ */ x("span", {
251
298
  className: "text-muted-foreground",
252
299
  children: "Status"
253
- }), /* @__PURE__ */ y(c, {
300
+ }), /* @__PURE__ */ x(l, {
254
301
  workItemId: m.id,
255
302
  field: "status",
256
303
  value: m.status,
257
- options: o,
304
+ options: s,
258
305
  label: "Status"
259
306
  })]
260
307
  }),
261
- /* @__PURE__ */ b("div", {
308
+ /* @__PURE__ */ S("div", {
262
309
  className: "flex items-start justify-between gap-2",
263
- children: [/* @__PURE__ */ y("span", {
310
+ children: [/* @__PURE__ */ x("span", {
264
311
  className: "text-muted-foreground",
265
312
  children: "Priority"
266
- }), /* @__PURE__ */ y(c, {
313
+ }), /* @__PURE__ */ x(l, {
267
314
  workItemId: m.id,
268
315
  field: "priority",
269
316
  value: m.priority,
270
- options: a,
317
+ options: o,
271
318
  label: "Priority"
272
319
  })]
273
320
  }),
274
- /* @__PURE__ */ b("div", {
321
+ /* @__PURE__ */ S("div", {
275
322
  className: "flex justify-between",
276
- children: [/* @__PURE__ */ y("span", {
323
+ children: [/* @__PURE__ */ x("span", {
277
324
  className: "text-muted-foreground",
278
325
  children: "Type"
279
- }), /* @__PURE__ */ y(x, {
326
+ }), /* @__PURE__ */ x(C, {
280
327
  variant: "outline",
281
328
  className: "capitalize",
282
329
  children: m.type.toLowerCase()
283
330
  })]
284
331
  }),
285
- /* @__PURE__ */ b("div", {
332
+ /* @__PURE__ */ S("div", {
286
333
  className: "flex justify-between",
287
- children: [/* @__PURE__ */ y("span", {
334
+ children: [/* @__PURE__ */ x("span", {
288
335
  className: "text-muted-foreground",
289
336
  children: "Story Points"
290
- }), /* @__PURE__ */ y("span", {
337
+ }), /* @__PURE__ */ x("span", {
291
338
  className: "font-medium",
292
339
  children: m.storyPoints ?? 0
293
340
  })]
294
341
  }),
295
- /* @__PURE__ */ b("div", {
342
+ /* @__PURE__ */ S("div", {
296
343
  className: "flex items-start justify-between gap-2",
297
- children: [/* @__PURE__ */ y("span", {
344
+ children: [/* @__PURE__ */ x("span", {
298
345
  className: "text-muted-foreground",
299
346
  children: "Assignee"
300
- }), /* @__PURE__ */ y(s, {
347
+ }), /* @__PURE__ */ x(c, {
301
348
  workItemId: m.id,
302
349
  assigneeId: m.assigneeId
303
350
  })]
304
351
  }),
305
- /* @__PURE__ */ b("div", {
352
+ /* @__PURE__ */ S("div", {
306
353
  className: "flex justify-between",
307
- children: [/* @__PURE__ */ y("span", {
354
+ children: [/* @__PURE__ */ x("span", {
308
355
  className: "text-muted-foreground",
309
356
  children: "Reporter"
310
- }), /* @__PURE__ */ y(n, { id: m.reporterId ?? m.createdBy })]
357
+ }), /* @__PURE__ */ x(n, { id: m.reporterId ?? m.createdBy })]
311
358
  }),
312
- /* @__PURE__ */ b("div", {
359
+ /* @__PURE__ */ S("div", {
313
360
  className: "flex justify-between",
314
- children: [/* @__PURE__ */ y("span", {
361
+ children: [/* @__PURE__ */ x("span", {
315
362
  className: "text-muted-foreground",
316
363
  children: "Key"
317
- }), /* @__PURE__ */ y("span", { children: m.key })]
364
+ }), /* @__PURE__ */ x("span", { children: m.key })]
318
365
  }),
319
- /* @__PURE__ */ b("div", {
366
+ /* @__PURE__ */ S("div", {
320
367
  className: "flex justify-between",
321
- children: [/* @__PURE__ */ y("span", {
368
+ children: [/* @__PURE__ */ x("span", {
322
369
  className: "text-muted-foreground",
323
370
  children: "Due Date"
324
- }), /* @__PURE__ */ y("span", { children: m.dueDate ?? "Not set" })]
371
+ }), /* @__PURE__ */ x("span", { children: m.dueDate ?? "Not set" })]
325
372
  }),
326
- /* @__PURE__ */ b("div", {
373
+ /* @__PURE__ */ S("div", {
327
374
  className: "flex justify-between",
328
- children: [/* @__PURE__ */ y("span", {
375
+ children: [/* @__PURE__ */ x("span", {
329
376
  className: "text-muted-foreground",
330
377
  children: "Created"
331
- }), /* @__PURE__ */ y("span", { children: m.createdAt })]
378
+ }), /* @__PURE__ */ x("span", { children: m.createdAt })]
332
379
  }),
333
- /* @__PURE__ */ b("div", {
380
+ /* @__PURE__ */ S("div", {
334
381
  className: "flex justify-between",
335
- children: [/* @__PURE__ */ y("span", {
382
+ children: [/* @__PURE__ */ x("span", {
336
383
  className: "text-muted-foreground",
337
384
  children: "Updated"
338
- }), /* @__PURE__ */ y("span", { children: m.updatedAt })]
385
+ }), /* @__PURE__ */ x("span", { children: m.updatedAt })]
339
386
  }),
340
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("span", {
387
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("span", {
341
388
  className: "text-muted-foreground text-xs",
342
389
  children: "Labels"
343
- }), /* @__PURE__ */ y("div", {
390
+ }), /* @__PURE__ */ x("div", {
344
391
  className: "flex gap-1 mt-1 flex-wrap",
345
- children: (m.labels ?? []).map((e) => /* @__PURE__ */ y("span", {
392
+ children: (m.labels ?? []).map((e) => /* @__PURE__ */ x("span", {
346
393
  className: "text-xs px-2 py-0.5 rounded bg-muted",
347
394
  children: e
348
395
  }, e))
@@ -351,12 +398,12 @@ function F() {
351
398
  })] })
352
399
  })]
353
400
  })]
354
- }) : /* @__PURE__ */ y("div", {
401
+ }) : /* @__PURE__ */ x("div", {
355
402
  className: "p-6 text-muted-foreground",
356
403
  children: "Task not found."
357
404
  });
358
405
  }
359
406
  //#endregion
360
- export { F as TasksTaskDetailPagePage };
407
+ export { L as TasksTaskDetailPagePage };
361
408
 
362
409
  //# sourceMappingURL=TasksTaskDetailPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TasksTaskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { throwOnError } from '../utils/mutationResult';\nimport { WorkItemComments } from '../comments/WorkItemComments';\nimport { WorkItemActivity } from '../comments/WorkItemActivity';\nimport { PersonName } from '../people/People';\nimport {\n WORK_ITEM_PRIORITIES,\n WORK_ITEM_STATUSES,\n WorkItemAssigneeSelect,\n WorkItemEnumSelect,\n WorkItemHeaderActions,\n} from '../controls/WorkItemControls';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Button,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus, X } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEM = gql`\n query GetWorkItemDetail($workItemId: ID!) {\n planmagnetWorkItem(id: $workItemId) {\n id\n title\n description\n type\n status\n priority\n key\n assigneeId\n reporterId\n createdBy\n sprintId\n storyPoints\n estimateMinutes\n dueDate\n labels\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nconst GET_WORK_ITEM_DOCS = gql`\n query GetWorkItemDocs($workItemId: ID!) {\n planmagnetWorkItemDocs(workItemId: $workItemId) {\n id\n title\n status\n version\n updatedAt\n }\n }\n`;\n\nconst CREATE_DOC = gql`\n mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {\n planmagnetCreateDoc(input: $input) {\n id\n }\n }\n`;\n\nconst LINK_DOC_TO_WORK_ITEM = gql`\n mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {\n id\n }\n }\n`;\n\nconst UNLINK_DOC_FROM_WORK_ITEM = gql`\n mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n description: string | null;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n createdBy: string;\n sprintId: string | null;\n storyPoints: number | null;\n estimateMinutes: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\ninterface WorkItemDocNode {\n id: string;\n title: string;\n status: string;\n version: number;\n updatedAt: string;\n}\n\nconst docStatusColor: Record<string, string> = {\n DRAFT: 'bg-gray-100 text-gray-800',\n PUBLISHED: 'bg-green-100 text-green-800',\n ARCHIVED: 'bg-gray-100 text-gray-500',\n};\n\n/**\n * Linked-docs panel (BOFF-4443): create a doc and link it to this work item\n * in one action, view currently-linked docs, and unlink one. Reads/writes go\n * through the real planmagnetWorkItemDocs / planmagnetCreateDoc /\n * planmagnetLinkDocToWorkItem / planmagnetUnlinkDocFromWorkItem GraphQL\n * fields — no fabricated data. Full doc editing (revisions, revert) lives on\n * a dedicated doc detail view; this panel is scoped to linking.\n */\nfunction LinkedDocsPanel({ workItemId }: { workItemId: string }) {\n const navigate = usePlanMagnetNavigate();\n const [isComposing, setIsComposing] = useState(false);\n const [newTitle, setNewTitle] = useState('');\n const [newContent, setNewContent] = useState('');\n\n const { data, loading, error, refetch } = useQuery<{\n planmagnetWorkItemDocs: WorkItemDocNode[];\n }>(GET_WORK_ITEM_DOCS, {\n variables: { workItemId },\n skip: !workItemId,\n });\n\n const [createDoc, { loading: creating }] = useMutation(CREATE_DOC);\n const [linkDoc] = useMutation(LINK_DOC_TO_WORK_ITEM);\n const [unlinkDoc, { loading: unlinking }] = useMutation(UNLINK_DOC_FROM_WORK_ITEM);\n // A refused mutation resolves with { error } (fe-libs errorPolicy 'all');\n // the composer used to clear itself as if the doc had been saved.\n const [actionError, setActionError] = useState<string | null>(null);\n\n const docs = data?.planmagnetWorkItemDocs ?? [];\n\n const handleCreateAndLink = async () => {\n if (!newTitle.trim() || !newContent.trim()) return;\n setActionError(null);\n try {\n const result = await throwOnError(\n createDoc({ variables: { input: { title: newTitle.trim(), content: newContent.trim() } } })\n );\n const docId = result.data?.planmagnetCreateDoc?.id;\n if (docId) {\n await throwOnError(linkDoc({ variables: { docId, workItemId } }));\n }\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be saved.');\n return;\n }\n setNewTitle('');\n setNewContent('');\n setIsComposing(false);\n void refetch();\n };\n\n const handleUnlink = async (docId: string) => {\n setActionError(null);\n try {\n await throwOnError(unlinkDoc({ variables: { docId, workItemId } }));\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be unlinked.');\n return;\n }\n void refetch();\n };\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle>Linked Docs</CardTitle>\n {!isComposing && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setIsComposing(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Doc\n </Button>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isComposing && (\n <div className=\"space-y-3 rounded-md border border-input p-3\">\n <Input\n placeholder=\"Doc title\"\n value={newTitle}\n onChange={(e) => setNewTitle(e.target.value)}\n />\n <MarkdownEditor\n value={newContent}\n onChange={setNewContent}\n placeholder=\"Write the spec/doc content...\"\n minHeight={140}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setIsComposing(false);\n setNewTitle('');\n setNewContent('');\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n disabled={creating || !newTitle.trim() || !newContent.trim()}\n onClick={handleCreateAndLink}\n >\n {creating ? 'Creating...' : 'Create & Link'}\n </Button>\n </div>\n </div>\n )}\n\n {loading && <p className=\"text-sm text-muted-foreground\">Loading docs...</p>}\n {error && <p className=\"text-sm text-red-500\">Error: {error.message}</p>}\n {actionError && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {actionError}\n </p>\n )}\n {!loading && !error && docs.length === 0 && !isComposing && (\n <p className=\"text-sm text-muted-foreground\">No docs linked to this work item yet.</p>\n )}\n {docs.map((doc) => (\n <div\n key={doc.id}\n className=\"flex items-center justify-between gap-3 rounded-md border border-input p-3\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0\">\n <button\n type=\"button\"\n className=\"block max-w-full truncate text-left text-sm font-medium hover:underline\"\n onClick={() =>\n navigate(`/docs/doc-detail-page?docId=${encodeURIComponent(doc.id)}`)\n }\n >\n {doc.title}\n </button>\n <p className=\"text-xs text-muted-foreground\">v{doc.version}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${docStatusColor[doc.status] ?? ''}`}\n >\n {doc.status.toLowerCase()}\n </span>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n disabled={unlinking}\n onClick={() => handleUnlink(doc.id)}\n aria-label={`Unlink ${doc.title}`}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\nexport function TasksTaskDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n // In a real app, workItemId comes from route params.\n const workItemId = new URLSearchParams(window.location.search).get('taskId') ?? '';\n\n const { data, loading, error } = useQuery<{\n planmagnetWorkItem: WorkItemNode;\n }>(GET_WORK_ITEM, {\n variables: { workItemId },\n skip: !workspaceId || !workItemId,\n });\n\n // Only before the first load: a refetch must not blank the page (it\n\n // unmounts every component on it and loses their state).\n\n if (loading && !data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const task = data?.planmagnetWorkItem;\n if (!task) return <div className=\"p-6 text-muted-foreground\">Task not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{task.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {task.key} &middot; {task.type.toLowerCase()}\n </p>\n </div>\n <WorkItemHeaderActions workItemId={task.id} title={task.title} />\n </div>\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{task.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n <LinkedDocsPanel workItemId={task.id} />\n <WorkItemComments workItemId={task.id} />\n <WorkItemActivity workItemId={task.id} />\n </div>\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-muted-foreground\">Status</span>\n <WorkItemEnumSelect\n workItemId={task.id}\n field=\"status\"\n value={task.status}\n options={WORK_ITEM_STATUSES}\n label=\"Status\"\n />\n </div>\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-muted-foreground\">Priority</span>\n <WorkItemEnumSelect\n workItemId={task.id}\n field=\"priority\"\n value={task.priority}\n options={WORK_ITEM_PRIORITIES}\n label=\"Priority\"\n />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {task.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Story Points</span>\n <span className=\"font-medium\">{task.storyPoints ?? 0}</span>\n </div>\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-muted-foreground\">Assignee</span>\n {/* Members by name (BOFF-7946); choosing one assigns the task (BOFF-7938). */}\n <WorkItemAssigneeSelect workItemId={task.id} assigneeId={task.assigneeId} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reporter</span>\n {/* No PlanMagnet form sets reporterId, so a UI-created task has none; its creator reported it. */}\n <PersonName id={task.reporterId ?? task.createdBy} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span>{task.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Due Date</span>\n <span>{task.dueDate ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{task.createdAt}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{task.updatedAt}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground text-xs\">Labels</span>\n <div className=\"flex gap-1 mt-1 flex-wrap\">\n {(task.labels ?? []).map((l) => (\n <span key={l} className=\"text-xs px-2 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA6BA,IAAM,IAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;GAyBnB,IAAqB,CAAG;;;;;;;;;;GAYxB,IAAa,CAAG;;;;;;GAQhB,IAAwB,CAAG;;;;;;GAQ3B,IAA4B,CAAG;;;;GAmC/B,IAAyC;CAC7C,OAAO;CACP,WAAW;CACX,UAAU;CACX;AAUD,SAAS,EAAgB,EAAE,iBAAsC;CAC/D,IAAM,IAAW,GAAuB,EAClC,CAAC,GAAa,KAAkB,EAAS,GAAM,EAC/C,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAY,KAAiB,EAAS,GAAG,EAE1C,EAAE,SAAM,YAAS,UAAO,eAAY,EAEvC,GAAoB;EACrB,WAAW,EAAE,eAAY;EACzB,MAAM,CAAC;EACR,CAAC,EAEI,CAAC,GAAW,EAAE,SAAS,OAAc,EAAY,EAAW,EAC5D,CAAC,KAAW,EAAY,EAAsB,EAC9C,CAAC,GAAW,EAAE,SAAS,OAAe,EAAY,EAA0B,EAG5E,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAE7D,IAAO,GAAM,0BAA0B,EAAE,EAEzC,IAAsB,YAAY;AAClC,SAAC,EAAS,MAAM,IAAI,CAAC,EAAW,MAAM,GAC1C;KAAe,KAAK;AACpB,OAAI;IAIF,IAAM,KAHS,MAAM,EACnB,EAAU,EAAE,WAAW,EAAE,OAAO;KAAE,OAAO,EAAS,MAAM;KAAE,SAAS,EAAW,MAAM;KAAE,EAAE,EAAE,CAAC,CAC5F,EACoB,MAAM,qBAAqB;AAChD,IAAI,KACF,MAAM,EAAa,EAAQ,EAAE,WAAW;KAAE;KAAO;KAAY,EAAE,CAAC,CAAC;YAE5D,GAAG;AACV,MAAe,aAAa,QAAQ,EAAE,UAAU,8BAA8B;AAC9E;;AAKG,GAHL,EAAY,GAAG,EACf,EAAc,GAAG,EACjB,EAAe,GAAM,EAChB,GAAS;;IAGV,IAAe,OAAO,MAAkB;AAC5C,IAAe,KAAK;AACpB,MAAI;AACF,SAAM,EAAa,EAAU,EAAE,WAAW;IAAE;IAAO;IAAY,EAAE,CAAC,CAAC;WAC5D,GAAG;AACV,KAAe,aAAa,QAAQ,EAAE,UAAU,iCAAiC;AACjF;;AAEG,KAAS;;AAGhB,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAY,WAAU;YAAtB,CACE,kBAAC,GAAD,EAAA,UAAW,eAAuB,CAAA,EACjC,CAAC,KACA,kBAAC,GAAD;GAAQ,MAAK;GAAK,SAAQ;GAAU,eAAe,EAAe,GAAK;aAAvE,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,UAE1B;KAEA;KACb,kBAAC,GAAD;EAAa,WAAU;YAAvB;GACG,KACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAY,EAAE,OAAO,MAAM;MAC5C,CAAA;KACF,kBAAC,GAAD;MACE,OAAO;MACP,UAAU;MACV,aAAY;MACZ,WAAW;MACX,CAAA;KACF,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,eAAe;AAGb,QAFA,EAAe,GAAM,EACrB,EAAY,GAAG,EACf,EAAc,GAAG;;iBAEpB;OAEQ,CAAA,EACT,kBAAC,GAAD;OACE,MAAK;OACL,UAAU,KAAY,CAAC,EAAS,MAAM,IAAI,CAAC,EAAW,MAAM;OAC5D,SAAS;iBAER,IAAW,gBAAgB;OACrB,CAAA,CACL;;KACF;;GAGP,KAAW,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAmB,CAAA;GAC3E,KAAS,kBAAC,KAAD;IAAG,WAAU;cAAb,CAAoC,WAAQ,EAAM,QAAY;;GACvE,KACC,kBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;cACvB;IACC,CAAA;GAEL,CAAC,KAAW,CAAC,KAAS,EAAK,WAAW,KAAK,CAAC,KAC3C,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAyC,CAAA;GAEvF,EAAK,KAAK,MACT,kBAAC,OAAD;IAEE,WAAU;cAFZ,CAIE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAU,WAAU,0CAA2C,CAAA,EAC/D,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,eACE,EAAS,+BAA+B,mBAAmB,EAAI,GAAG,GAAG;iBAGtE,EAAI;OACE,CAAA,EACT,kBAAC,KAAD;OAAG,WAAU;iBAAb,CAA6C,KAAE,EAAI,QAAY;SAC3D;QACF;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD;MACE,WAAW,+CAA+C,EAAe,EAAI,WAAW;gBAEvF,EAAI,OAAO,aAAa;MACpB,CAAA,EACP,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,UAAU;MACV,eAAe,EAAa,EAAI,GAAG;MACnC,cAAY,UAAU,EAAI;gBAE1B,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;MAClB,CAAA,CACL;OACF;MAlCC,EAAI,GAkCL,CACN;GACU;IACT,EAAA,CAAA;;AAIX,SAAgB,IAA0B;CACxC,IAAM,EAAE,mBAAgB,GAAe,EAGjC,IAAa,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAAC,IAAI,SAAS,IAAI,IAE1E,EAAE,SAAM,YAAS,aAAU,EAE9B,GAAe;EAChB,WAAW,EAAE,eAAY;EACzB,MAAM,CAAC,KAAe,CAAC;EACxB,CAAC;AAMF,KAAI,KAAW,CAAC,EACd,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAO,GAAM;AAGnB,QAFK,IAGH,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAA0B,EAAK;IAAW,CAAA,EACxD,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG,EAAK;KAAI;KAAW,EAAK,KAAK,aAAa;KAC1C;MACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAuB,YAAY,EAAK;IAAI,OAAO,EAAK;IAAS,CAAA,CAC7D;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,eAAuB,CAAA,EACvB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,KAAD;MAAG,WAAU;gBAAW,EAAK,eAAe;MAA+B,CAAA,EAC/D,CAAA,CACT,EAAA,CAAA;KACP,kBAAC,GAAD,EAAiB,YAAY,EAAK,IAAM,CAAA;KACxC,kBAAC,GAAD,EAAkB,YAAY,EAAK,IAAM,CAAA;KACzC,kBAAC,GAAD,EAAkB,YAAY,EAAK,IAAM,CAAA;KACrC;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,WAAmB,CAAA,EACnB,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eAAvB;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAa,CAAA,EACrD,kBAAC,GAAD;QACE,YAAY,EAAK;QACjB,OAAM;QACN,OAAO,EAAK;QACZ,SAAS;QACT,OAAM;QACN,CAAA,CACE;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAe,CAAA,EACvD,kBAAC,GAAD;QACE,YAAY,EAAK;QACjB,OAAM;QACN,OAAO,EAAK;QACZ,SAAS;QACT,OAAM;QACN,CAAA,CACE;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAW,CAAA,EACnD,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAK,KAAK,aAAa;QAClB,CAAA,CACJ;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAmB,CAAA,EAC3D,kBAAC,QAAD;QAAM,WAAU;kBAAe,EAAK,eAAe;QAAS,CAAA,CACxD;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAe,CAAA,EAEvD,kBAAC,GAAD;QAAwB,YAAY,EAAK;QAAI,YAAY,EAAK;QAAc,CAAA,CACxE;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAe,CAAA,EAEvD,kBAAC,GAAD,EAAY,IAAI,EAAK,cAAc,EAAK,WAAa,CAAA,CACjD;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAU,CAAA,EAClD,kBAAC,QAAD,EAAA,UAAO,EAAK,KAAW,CAAA,CACnB;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAe,CAAA,EACvD,kBAAC,QAAD,EAAA,UAAO,EAAK,WAAW,WAAiB,CAAA,CACpC;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAc,CAAA,EACtD,kBAAC,QAAD,EAAA,UAAO,EAAK,WAAiB,CAAA,CACzB;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAc,CAAA,EACtD,kBAAC,QAAD,EAAA,UAAO,EAAK,WAAiB,CAAA,CACzB;;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAgC;OAAa,CAAA,EAC7D,kBAAC,OAAD;OAAK,WAAU;kBACX,EAAK,UAAU,EAAE,EAAE,KAAK,MACxB,kBAAC,QAAD;QAAc,WAAU;kBACrB;QACI,EAFI,EAEJ,CACP;OACE,CAAA,CACF,EAAA,CAAA;MACM;OACT,EAAA,CAAA;IACH,CAAA,CACF;KACF;MAvGU,kBAAC,OAAD;EAAK,WAAU;YAA4B;EAAqB,CAAA"}
1
+ {"version":3,"file":"TasksTaskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { throwOnError } from '../utils/mutationResult';\nimport { WorkItemComments } from '../comments/WorkItemComments';\nimport { WorkItemActivity } from '../comments/WorkItemActivity';\nimport { PersonName } from '../people/People';\nimport { DocSearchSelect } from '../controls/Pickers';\nimport {\n WORK_ITEM_PRIORITIES,\n WORK_ITEM_STATUSES,\n WorkItemAssigneeSelect,\n WorkItemEnumSelect,\n WorkItemHeaderActions,\n} from '../controls/WorkItemControls';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Button,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Link2, Plus, X } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEM = gql`\n query GetWorkItemDetail($workItemId: ID!) {\n planmagnetWorkItem(id: $workItemId) {\n id\n title\n description\n type\n status\n priority\n key\n assigneeId\n reporterId\n createdBy\n sprintId\n storyPoints\n estimateMinutes\n dueDate\n labels\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nconst GET_WORK_ITEM_DOCS = gql`\n query GetWorkItemDocs($workItemId: ID!) {\n planmagnetWorkItemDocs(workItemId: $workItemId) {\n id\n title\n status\n version\n updatedAt\n }\n }\n`;\n\nconst CREATE_DOC = gql`\n mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {\n planmagnetCreateDoc(input: $input) {\n id\n }\n }\n`;\n\nconst LINK_DOC_TO_WORK_ITEM = gql`\n mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {\n id\n }\n }\n`;\n\nconst UNLINK_DOC_FROM_WORK_ITEM = gql`\n mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n description: string | null;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n createdBy: string;\n sprintId: string | null;\n storyPoints: number | null;\n estimateMinutes: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\ninterface WorkItemDocNode {\n id: string;\n title: string;\n status: string;\n version: number;\n updatedAt: string;\n}\n\nconst docStatusColor: Record<string, string> = {\n DRAFT: 'bg-gray-100 text-gray-800',\n PUBLISHED: 'bg-green-100 text-green-800',\n ARCHIVED: 'bg-gray-100 text-gray-500',\n};\n\n/**\n * Linked-docs panel (BOFF-4443): create a doc and link it to this work item\n * in one action, view currently-linked docs, and unlink one. Reads/writes go\n * through the real planmagnetWorkItemDocs / planmagnetCreateDoc /\n * planmagnetLinkDocToWorkItem / planmagnetUnlinkDocFromWorkItem GraphQL\n * fields — no fabricated data. Full doc editing (revisions, revert) lives on\n * a dedicated doc detail view; this panel is scoped to linking.\n */\nfunction LinkedDocsPanel({ workItemId }: { workItemId: string }) {\n const navigate = usePlanMagnetNavigate();\n const [isComposing, setIsComposing] = useState(false);\n // BOFF-7961: only \"New Doc\" existed, so a doc written on the Docs page could never be linked to a task.\n const [isLinking, setIsLinking] = useState(false);\n const [existingDocId, setExistingDocId] = useState('');\n const [newTitle, setNewTitle] = useState('');\n const [newContent, setNewContent] = useState('');\n\n const { data, loading, error, refetch } = useQuery<{\n planmagnetWorkItemDocs: WorkItemDocNode[];\n }>(GET_WORK_ITEM_DOCS, {\n variables: { workItemId },\n skip: !workItemId,\n });\n\n const [createDoc, { loading: creating }] = useMutation(CREATE_DOC);\n const [linkDoc, { loading: linking }] = useMutation(LINK_DOC_TO_WORK_ITEM);\n const [unlinkDoc, { loading: unlinking }] = useMutation(UNLINK_DOC_FROM_WORK_ITEM);\n // A refused mutation resolves with { error } (fe-libs errorPolicy 'all');\n // the composer used to clear itself as if the doc had been saved.\n const [actionError, setActionError] = useState<string | null>(null);\n\n const docs = data?.planmagnetWorkItemDocs ?? [];\n\n const handleCreateAndLink = async () => {\n if (!newTitle.trim() || !newContent.trim()) return;\n setActionError(null);\n try {\n const result = await throwOnError(\n createDoc({ variables: { input: { title: newTitle.trim(), content: newContent.trim() } } })\n );\n const docId = result.data?.planmagnetCreateDoc?.id;\n if (docId) {\n await throwOnError(linkDoc({ variables: { docId, workItemId } }));\n }\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be saved.');\n return;\n }\n setNewTitle('');\n setNewContent('');\n setIsComposing(false);\n void refetch();\n };\n\n const handleLinkExisting = async () => {\n if (!existingDocId) return;\n setActionError(null);\n try {\n await throwOnError(linkDoc({ variables: { docId: existingDocId, workItemId } }));\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be linked.');\n return;\n }\n setExistingDocId('');\n setIsLinking(false);\n void refetch();\n };\n\n const handleUnlink = async (docId: string) => {\n setActionError(null);\n try {\n await throwOnError(unlinkDoc({ variables: { docId, workItemId } }));\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be unlinked.');\n return;\n }\n void refetch();\n };\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle>Linked Docs</CardTitle>\n {!isComposing && !isLinking && (\n <div className=\"flex gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => setIsLinking(true)}>\n <Link2 className=\"h-4 w-4 mr-1\" />\n Link existing doc\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setIsComposing(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Doc\n </Button>\n </div>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isLinking && (\n <div className=\"space-y-2 rounded-md border border-input p-3\">\n <DocSearchSelect\n id=\"task-link-doc\"\n value={existingDocId}\n onChange={setExistingDocId}\n exclude={docs.map((d) => d.id)}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setIsLinking(false);\n setExistingDocId('');\n }}\n >\n Cancel\n </Button>\n <Button size=\"sm\" disabled={!existingDocId || linking} onClick={handleLinkExisting}>\n {linking ? 'Linking...' : 'Link'}\n </Button>\n </div>\n </div>\n )}\n {isComposing && (\n <div className=\"space-y-3 rounded-md border border-input p-3\">\n <Input\n placeholder=\"Doc title\"\n value={newTitle}\n onChange={(e) => setNewTitle(e.target.value)}\n />\n <MarkdownEditor\n value={newContent}\n onChange={setNewContent}\n placeholder=\"Write the spec/doc content...\"\n minHeight={140}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setIsComposing(false);\n setNewTitle('');\n setNewContent('');\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n disabled={creating || !newTitle.trim() || !newContent.trim()}\n onClick={handleCreateAndLink}\n >\n {creating ? 'Creating...' : 'Create & Link'}\n </Button>\n </div>\n </div>\n )}\n\n {loading && <p className=\"text-sm text-muted-foreground\">Loading docs...</p>}\n {error && <p className=\"text-sm text-red-500\">Error: {error.message}</p>}\n {actionError && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {actionError}\n </p>\n )}\n {!loading && !error && docs.length === 0 && !isComposing && !isLinking && (\n <p className=\"text-sm text-muted-foreground\">No docs linked to this work item yet.</p>\n )}\n {docs.map((doc) => (\n <div\n key={doc.id}\n className=\"flex items-center justify-between gap-3 rounded-md border border-input p-3\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0\">\n <button\n type=\"button\"\n className=\"block max-w-full truncate text-left text-sm font-medium hover:underline\"\n onClick={() =>\n navigate(`/docs/doc-detail-page?docId=${encodeURIComponent(doc.id)}`)\n }\n >\n {doc.title}\n </button>\n <p className=\"text-xs text-muted-foreground\">v{doc.version}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${docStatusColor[doc.status] ?? ''}`}\n >\n {doc.status.toLowerCase()}\n </span>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n disabled={unlinking}\n onClick={() => handleUnlink(doc.id)}\n aria-label={`Unlink ${doc.title}`}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\nexport function TasksTaskDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n // In a real app, workItemId comes from route params.\n const workItemId = new URLSearchParams(window.location.search).get('taskId') ?? '';\n\n const { data, loading, error } = useQuery<{\n planmagnetWorkItem: WorkItemNode;\n }>(GET_WORK_ITEM, {\n variables: { workItemId },\n skip: !workspaceId || !workItemId,\n });\n\n // Only before the first load: a refetch must not blank the page (it\n\n // unmounts every component on it and loses their state).\n\n if (loading && !data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const task = data?.planmagnetWorkItem;\n if (!task) return <div className=\"p-6 text-muted-foreground\">Task not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{task.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {task.key} &middot; {task.type.toLowerCase()}\n </p>\n </div>\n <WorkItemHeaderActions workItemId={task.id} title={task.title} />\n </div>\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{task.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n <LinkedDocsPanel workItemId={task.id} />\n <WorkItemComments workItemId={task.id} />\n <WorkItemActivity workItemId={task.id} />\n </div>\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-muted-foreground\">Status</span>\n <WorkItemEnumSelect\n workItemId={task.id}\n field=\"status\"\n value={task.status}\n options={WORK_ITEM_STATUSES}\n label=\"Status\"\n />\n </div>\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-muted-foreground\">Priority</span>\n <WorkItemEnumSelect\n workItemId={task.id}\n field=\"priority\"\n value={task.priority}\n options={WORK_ITEM_PRIORITIES}\n label=\"Priority\"\n />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {task.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Story Points</span>\n <span className=\"font-medium\">{task.storyPoints ?? 0}</span>\n </div>\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-muted-foreground\">Assignee</span>\n {/* Members by name (BOFF-7946); choosing one assigns the task (BOFF-7938). */}\n <WorkItemAssigneeSelect workItemId={task.id} assigneeId={task.assigneeId} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reporter</span>\n {/* No PlanMagnet form sets reporterId, so a UI-created task has none; its creator reported it. */}\n <PersonName id={task.reporterId ?? task.createdBy} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span>{task.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Due Date</span>\n <span>{task.dueDate ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{task.createdAt}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{task.updatedAt}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground text-xs\">Labels</span>\n <div className=\"flex gap-1 mt-1 flex-wrap\">\n {(task.labels ?? []).map((l) => (\n <span key={l} className=\"text-xs px-2 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"AAyIA,wBAAgB,kBAAkB,4CAqPjC"}
1
+ {"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"AAyIA,wBAAgB,kBAAkB,4CAgQjC"}