@burdenoff/microfe-planmagnet 2026.927.2 → 2026.927.4

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 (106) hide show
  1. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +128 -124
  3. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  4. package/dist/planmagnet/controls/ConfirmButton.d.ts +25 -0
  5. package/dist/planmagnet/controls/ConfirmButton.d.ts.map +1 -0
  6. package/dist/planmagnet/controls/ConfirmButton.js +30 -0
  7. package/dist/planmagnet/controls/ConfirmButton.js.map +1 -0
  8. package/dist/planmagnet/controls/FeatureControls.d.ts +26 -0
  9. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -0
  10. package/dist/planmagnet/controls/FeatureControls.js +318 -0
  11. package/dist/planmagnet/controls/FeatureControls.js.map +1 -0
  12. package/dist/planmagnet/controls/MilestoneControls.d.ts +17 -0
  13. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -0
  14. package/dist/planmagnet/controls/MilestoneControls.js +200 -0
  15. package/dist/planmagnet/controls/MilestoneControls.js.map +1 -0
  16. package/dist/planmagnet/controls/ObjectiveControls.d.ts +31 -0
  17. package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +1 -0
  18. package/dist/planmagnet/controls/ObjectiveControls.js +296 -0
  19. package/dist/planmagnet/controls/ObjectiveControls.js.map +1 -0
  20. package/dist/planmagnet/controls/Pickers.d.ts +26 -0
  21. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -0
  22. package/dist/planmagnet/controls/Pickers.js +171 -0
  23. package/dist/planmagnet/controls/Pickers.js.map +1 -0
  24. package/dist/planmagnet/controls/ProjectControls.d.ts +13 -0
  25. package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -0
  26. package/dist/planmagnet/controls/ProjectControls.js +104 -0
  27. package/dist/planmagnet/controls/ProjectControls.js.map +1 -0
  28. package/dist/planmagnet/controls/ReleaseControls.d.ts +14 -0
  29. package/dist/planmagnet/controls/ReleaseControls.d.ts.map +1 -0
  30. package/dist/planmagnet/controls/ReleaseControls.js +108 -0
  31. package/dist/planmagnet/controls/ReleaseControls.js.map +1 -0
  32. package/dist/planmagnet/controls/WorkItemControls.d.ts +52 -0
  33. package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -0
  34. package/dist/planmagnet/controls/WorkItemControls.js +198 -0
  35. package/dist/planmagnet/controls/WorkItemControls.js.map +1 -0
  36. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  37. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +188 -154
  38. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  39. package/dist/planmagnet/pages/DocsDocsPagePage.js +4 -4
  40. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +63 -56
  42. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +229 -214
  45. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +142 -114
  48. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +134 -105
  51. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +102 -108
  54. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +119 -94
  57. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +97 -90
  60. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +107 -106
  63. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +2 -0
  66. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +150 -111
  69. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +116 -93
  72. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  73. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  74. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +55 -63
  75. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  76. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +4 -4
  77. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  78. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +134 -132
  79. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  80. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  81. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +6 -5
  82. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  83. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
  84. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +167 -116
  85. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  86. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  87. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +139 -107
  88. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  89. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  90. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +205 -158
  91. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  92. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  93. package/dist/planmagnet/pages/TasksTasksPagePage.js +1 -0
  94. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  95. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  96. package/dist/planmagnet/pages/TeamTeamPagePage.js +1 -1
  97. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  98. package/dist/planmagnet/people/People.js +1 -1
  99. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts +34 -0
  100. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +1 -0
  101. package/dist/planmagnet/roadmaps/RoadmapControls.js +301 -0
  102. package/dist/planmagnet/roadmaps/RoadmapControls.js.map +1 -0
  103. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  104. package/dist/planmagnet/sprints/SprintControls.js +194 -215
  105. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  106. package/package.json +1 -1
@@ -1,14 +1,16 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
- import { MarkdownEditor as n } from "../../components/MarkdownEditor.js";
3
- import { useMemo as r, useState as i } from "react";
4
- import { ArrowLeft as a, Loader2 as o, Save as s } from "lucide-react";
5
- import { useParams as c } from "react-router";
6
- import { gql as l } from "@apollo/client";
7
- import { useMutation as u, useQuery as d } from "@apollo/client/react";
8
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
- import { Button as m, Card as h, CardContent as g, CardHeader as _, CardTitle as v, Input as y } from "@burdenoff/fe-libs/ui";
2
+ import { throwOnError as n } from "../utils/mutationResult.js";
3
+ import { MarkdownEditor as r } from "../../components/MarkdownEditor.js";
4
+ import { RELEASE_STATUSES as i } from "../controls/ReleaseControls.js";
5
+ import { useMemo as a, useState as o } from "react";
6
+ import { ArrowLeft as s, Loader2 as c, Save as l } from "lucide-react";
7
+ import { useParams as u } from "react-router";
8
+ import { gql as d } from "@apollo/client";
9
+ import { useMutation as f, useQuery as p } from "@apollo/client/react";
10
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
11
+ import { Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, Input as x } from "@burdenoff/fe-libs/ui";
10
12
  //#region src/planmagnet/pages/ProductsEditReleasePagePage.tsx
11
- var b = l`
13
+ var S = d`
12
14
  query GetReleaseForEdit($id: ID!) {
13
15
  planmagnetRelease(id: $id) {
14
16
  id
@@ -23,7 +25,7 @@ var b = l`
23
25
  tags
24
26
  }
25
27
  }
26
- `, x = l`
28
+ `, C = d`
27
29
  mutation UpdateRelease($id: ID!, $input: PlanmagnetUpdateReleaseInput!) {
28
30
  planmagnetUpdateRelease(id: $id, input: $input) {
29
31
  id
@@ -38,167 +40,194 @@ var b = l`
38
40
  }
39
41
  }
40
42
  `;
41
- function S() {
42
- let { workspaceId: l } = e(), S = t(), C = c().id ?? "", { data: w, loading: T, error: E } = d(b, {
43
- variables: { id: C },
44
- skip: !C
45
- }), [D, { loading: O, error: k }] = u(x, { refetchQueries: ["ListReleases", "GetReleaseForEdit"] }), A = w?.planmagnetRelease, j = r(() => ({
46
- version: A?.version ?? "",
47
- name: A?.name ?? "",
48
- description: A?.description ?? "",
49
- status: A?.status ?? "DRAFT",
50
- plannedDate: A?.plannedDate ? new Date(A.plannedDate).toISOString().split("T")[0] : "",
51
- releaseNotes: A?.releaseNotes ?? "",
52
- tags: A?.tags?.join(", ") ?? ""
53
- }), [A]), [M, N] = i({}), P = {
54
- ...j,
55
- ...M
56
- }, F = (e) => N(e);
57
- return T && !w ? /* @__PURE__ */ f("div", {
43
+ function w() {
44
+ let { workspaceId: d } = e(), w = t(), T = u().id ?? "", { data: E, loading: D, error: O } = p(S, {
45
+ variables: { id: T },
46
+ skip: !T
47
+ }), [k, { loading: A }] = f(C, {
48
+ refetchQueries: [
49
+ "ListReleases",
50
+ "GetReleaseForEdit",
51
+ "GetRelease",
52
+ "ReleaseReadiness"
53
+ ],
54
+ awaitRefetchQueries: !0
55
+ }), [j, M] = o(null), [N, P] = o(!1), F = E?.planmagnetRelease, I = a(() => ({
56
+ version: F?.version ?? "",
57
+ name: F?.name ?? "",
58
+ description: F?.description ?? "",
59
+ status: F?.status ?? "DRAFT",
60
+ plannedDate: F?.plannedDate ? new Date(F.plannedDate).toISOString().split("T")[0] : "",
61
+ releaseNotes: F?.releaseNotes ?? "",
62
+ tags: F?.tags?.join(", ") ?? ""
63
+ }), [F]), [L, R] = o({}), z = {
64
+ ...I,
65
+ ...L
66
+ }, B = (e) => R(e), V = i.includes(z.status) ? i : [z.status, ...i];
67
+ return D && !E ? /* @__PURE__ */ m("div", {
58
68
  className: "flex items-center justify-center p-12",
59
- children: /* @__PURE__ */ f(o, { className: "h-8 w-8 animate-spin text-muted-foreground" })
60
- }) : E ? /* @__PURE__ */ p("div", {
69
+ children: /* @__PURE__ */ m(c, { className: "h-8 w-8 animate-spin text-muted-foreground" })
70
+ }) : O ? /* @__PURE__ */ h("div", {
61
71
  className: "p-6 text-destructive",
62
- children: ["Failed to load release: ", E.message]
63
- }) : A ? /* @__PURE__ */ p("div", {
72
+ children: ["Failed to load release: ", O.message]
73
+ }) : F ? /* @__PURE__ */ h("div", {
64
74
  className: "space-y-6 p-6 max-w-4xl",
65
75
  children: [
66
- /* @__PURE__ */ p("div", {
76
+ /* @__PURE__ */ h("div", {
67
77
  className: "flex items-center justify-between",
68
- children: [/* @__PURE__ */ p("div", {
78
+ children: [/* @__PURE__ */ h("div", {
69
79
  className: "flex items-center gap-3",
70
- children: [/* @__PURE__ */ f(m, {
80
+ children: [/* @__PURE__ */ m(g, {
71
81
  variant: "ghost",
72
82
  size: "sm",
73
- onClick: () => S("/products/releases-page"),
74
- children: /* @__PURE__ */ f(a, { className: "h-4 w-4" })
75
- }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
83
+ onClick: () => w("/products/releases-page"),
84
+ children: /* @__PURE__ */ m(s, { className: "h-4 w-4" })
85
+ }), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
76
86
  className: "text-2xl font-semibold",
77
87
  children: "Edit Release"
78
- }), /* @__PURE__ */ p("p", {
88
+ }), /* @__PURE__ */ h("p", {
79
89
  className: "text-sm text-muted-foreground",
80
90
  children: [
81
- A.version,
91
+ F.version,
82
92
  " - ",
83
- A.name
93
+ F.name
84
94
  ]
85
95
  })] })]
86
- }), /* @__PURE__ */ p(m, {
96
+ }), /* @__PURE__ */ h(g, {
87
97
  size: "sm",
88
- onClick: () => {
89
- D({ variables: {
90
- id: C,
91
- input: {
92
- version: P.version || void 0,
93
- name: P.name || void 0,
94
- description: P.description || void 0,
95
- status: P.status || void 0,
96
- plannedDate: P.plannedDate || void 0,
97
- releaseNotes: P.releaseNotes || void 0,
98
- tags: P.tags ? P.tags.split(",").map((e) => e.trim()).filter(Boolean) : void 0
99
- }
100
- } });
98
+ onClick: async () => {
99
+ if (!z.version.trim() || !z.name.trim()) {
100
+ M("Version and name are required.");
101
+ return;
102
+ }
103
+ let e = (e) => e.split(",").map((e) => e.trim()).filter(Boolean), t = {
104
+ version: z.version.trim(),
105
+ name: z.name.trim(),
106
+ description: z.description.trim() || null,
107
+ status: z.status,
108
+ plannedDate: z.plannedDate || null,
109
+ releaseNotes: z.releaseNotes.trim() ? z.releaseNotes : null,
110
+ tags: e(z.tags)
111
+ }, r = {
112
+ version: I.version,
113
+ name: I.name,
114
+ description: I.description.trim() || null,
115
+ status: I.status,
116
+ plannedDate: I.plannedDate || null,
117
+ releaseNotes: I.releaseNotes.trim() ? I.releaseNotes : null,
118
+ tags: e(I.tags)
119
+ }, i = Object.fromEntries(Object.entries(t).filter(([e, t]) => JSON.stringify(t) !== JSON.stringify(r[e])));
120
+ if (M(null), P(!1), Object.keys(i).length === 0) {
121
+ P(!0);
122
+ return;
123
+ }
124
+ try {
125
+ await n(k({ variables: {
126
+ id: T,
127
+ input: i
128
+ } })), P(!0);
129
+ } catch (e) {
130
+ M(e instanceof Error ? e.message : "The release could not be saved.");
131
+ }
101
132
  },
102
- disabled: O,
103
- children: [O ? /* @__PURE__ */ f(o, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ f(s, { className: "mr-1 h-4 w-4" }), "Save Changes"]
133
+ disabled: A,
134
+ children: [A ? /* @__PURE__ */ m(c, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ m(l, { className: "mr-1 h-4 w-4" }), "Save Changes"]
104
135
  })]
105
136
  }),
106
- k && /* @__PURE__ */ p("div", {
137
+ N && /* @__PURE__ */ m("div", {
138
+ role: "status",
139
+ className: "p-3 bg-muted text-status-success-text rounded-md text-sm",
140
+ children: "Changes saved."
141
+ }),
142
+ j && /* @__PURE__ */ m("div", {
143
+ role: "alert",
107
144
  className: "p-3 rounded-md bg-destructive/10 text-destructive text-sm",
108
- children: ["Failed to save: ", k.message]
145
+ children: j
109
146
  }),
110
- /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ f(v, { children: "Release Details" }) }), /* @__PURE__ */ p(g, {
147
+ /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ m(b, { children: "Release Details" }) }), /* @__PURE__ */ h(v, {
111
148
  className: "space-y-4",
112
149
  children: [
113
- /* @__PURE__ */ p("div", {
150
+ /* @__PURE__ */ h("div", {
114
151
  className: "grid grid-cols-2 gap-4",
115
- children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
152
+ children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
116
153
  className: "text-sm font-medium",
117
154
  children: "Version"
118
- }), /* @__PURE__ */ f(y, {
119
- value: P.version,
120
- onChange: (e) => F({
121
- ...P,
155
+ }), /* @__PURE__ */ m(x, {
156
+ value: z.version,
157
+ onChange: (e) => B({
158
+ ...z,
122
159
  version: e.target.value
123
160
  }),
124
161
  className: "mt-1",
125
162
  placeholder: "v1.0.0"
126
- })] }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
163
+ })] }), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
127
164
  className: "text-sm font-medium",
128
165
  children: "Name"
129
- }), /* @__PURE__ */ f(y, {
130
- value: P.name,
131
- onChange: (e) => F({
132
- ...P,
166
+ }), /* @__PURE__ */ m(x, {
167
+ value: z.name,
168
+ onChange: (e) => B({
169
+ ...z,
133
170
  name: e.target.value
134
171
  }),
135
172
  className: "mt-1"
136
173
  })] })]
137
174
  }),
138
- /* @__PURE__ */ f(n, {
175
+ /* @__PURE__ */ m(r, {
139
176
  label: "Description",
140
- value: P.description,
141
- onChange: (e) => F({
142
- ...P,
177
+ value: z.description,
178
+ onChange: (e) => B({
179
+ ...z,
143
180
  description: e
144
181
  }),
145
182
  minHeight: 80
146
183
  }),
147
- /* @__PURE__ */ p("div", {
184
+ /* @__PURE__ */ h("div", {
148
185
  className: "grid grid-cols-2 gap-4",
149
- children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
186
+ children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
150
187
  className: "text-sm font-medium",
151
188
  children: "Status"
152
- }), /* @__PURE__ */ f("select", {
189
+ }), /* @__PURE__ */ m("select", {
153
190
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
154
- value: P.status,
155
- onChange: (e) => F({
156
- ...P,
191
+ value: z.status,
192
+ onChange: (e) => B({
193
+ ...z,
157
194
  status: e.target.value
158
195
  }),
159
- children: [
160
- "DRAFT",
161
- "PLANNING",
162
- "IN_PROGRESS",
163
- "READY",
164
- "RELEASED",
165
- "CANCELLED",
166
- "ROLLED_BACK"
167
- ].map((e) => /* @__PURE__ */ f("option", {
196
+ children: V.map((e) => /* @__PURE__ */ m("option", {
168
197
  value: e,
169
198
  className: "capitalize",
170
199
  children: e.toLowerCase().replace("_", " ")
171
200
  }, e))
172
- })] }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
201
+ })] }), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
173
202
  className: "text-sm font-medium",
174
203
  children: "Planned Date"
175
- }), /* @__PURE__ */ f(y, {
204
+ }), /* @__PURE__ */ m(x, {
176
205
  type: "date",
177
- value: P.plannedDate,
178
- onChange: (e) => F({
179
- ...P,
206
+ value: z.plannedDate,
207
+ onChange: (e) => B({
208
+ ...z,
180
209
  plannedDate: e.target.value
181
210
  }),
182
211
  className: "mt-1"
183
212
  })] })]
184
213
  }),
185
- /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
214
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
186
215
  className: "text-sm font-medium",
187
216
  children: "Tags (comma-separated)"
188
- }), /* @__PURE__ */ f(y, {
189
- value: P.tags,
190
- onChange: (e) => F({
191
- ...P,
217
+ }), /* @__PURE__ */ m(x, {
218
+ value: z.tags,
219
+ onChange: (e) => B({
220
+ ...z,
192
221
  tags: e.target.value
193
222
  }),
194
223
  className: "mt-1",
195
224
  placeholder: "e.g. critical, security, performance"
196
225
  })] }),
197
- /* @__PURE__ */ f(n, {
226
+ /* @__PURE__ */ m(r, {
198
227
  label: "Release Notes",
199
- value: P.releaseNotes,
200
- onChange: (e) => F({
201
- ...P,
228
+ value: z.releaseNotes,
229
+ onChange: (e) => B({
230
+ ...z,
202
231
  releaseNotes: e
203
232
  }),
204
233
  placeholder: "Describe what changed in this release...",
@@ -207,12 +236,12 @@ function S() {
207
236
  ]
208
237
  })] })
209
238
  ]
210
- }) : /* @__PURE__ */ f("div", {
239
+ }) : /* @__PURE__ */ m("div", {
211
240
  className: "p-6 text-muted-foreground",
212
241
  children: "Release not found."
213
242
  });
214
243
  }
215
244
  //#endregion
216
- export { S as ProductsEditReleasePagePage };
245
+ export { w as ProductsEditReleasePagePage };
217
246
 
218
247
  //# sourceMappingURL=ProductsEditReleasePagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsEditReleasePagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsEditReleasePagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState, useMemo } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery, useMutation } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, ArrowLeft, Loader2 } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\n\nconst GET_RELEASE = gql`\n query GetReleaseForEdit($id: ID!) {\n planmagnetRelease(id: $id) {\n id\n name\n description\n version\n status\n plannedDate\n releasedAt\n releaseNotes\n ownerId\n tags\n }\n }\n`;\n\nconst UPDATE_RELEASE = gql`\n mutation UpdateRelease($id: ID!, $input: PlanmagnetUpdateReleaseInput!) {\n planmagnetUpdateRelease(id: $id, input: $input) {\n id\n name\n description\n version\n status\n plannedDate\n releaseNotes\n tags\n updatedAt\n }\n }\n`;\n\nexport function ProductsEditReleasePagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const params = useParams<{ id: string }>();\n const releaseId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_RELEASE, {\n variables: { id: releaseId },\n skip: !releaseId,\n });\n\n const [updateRelease, { loading: saving, error: saveError }] = useMutation(UPDATE_RELEASE, {\n refetchQueries: ['ListReleases', 'GetReleaseForEdit'],\n });\n\n const release = data?.planmagnetRelease;\n\n const defaultForm = useMemo(\n () => ({\n version: release?.version ?? '',\n name: release?.name ?? '',\n description: release?.description ?? '',\n status: release?.status ?? 'DRAFT',\n plannedDate: release?.plannedDate\n ? new Date(release.plannedDate).toISOString().split('T')[0]\n : '',\n releaseNotes: release?.releaseNotes ?? '',\n tags: release?.tags?.join(', ') ?? '',\n }),\n [release]\n );\n\n const [formOverrides, setFormOverrides] = useState<Record<string, string>>({});\n const form = { ...defaultForm, ...formOverrides };\n const setForm = (val: Record<string, string>) => setFormOverrides(val);\n\n const statuses = [\n 'DRAFT',\n 'PLANNING',\n 'IN_PROGRESS',\n 'READY',\n 'RELEASED',\n 'CANCELLED',\n 'ROLLED_BACK',\n ] as const;\n\n const handleSave = () => {\n updateRelease({\n variables: {\n id: releaseId,\n input: {\n version: form.version || undefined,\n name: form.name || undefined,\n description: form.description || undefined,\n status: form.status || undefined,\n plannedDate: form.plannedDate || undefined,\n releaseNotes: form.releaseNotes || undefined,\n tags: form.tags\n ? form.tags\n .split(',')\n .map((t: string) => t.trim())\n .filter(Boolean)\n : undefined,\n },\n },\n });\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 <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-destructive\">Failed to load release: {error.message}</div>;\n }\n\n if (!release) return <div className=\"p-6 text-muted-foreground\">Release not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate('/products/releases-page')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Release</h1>\n <p className=\"text-sm text-muted-foreground\">\n {release.version} - {release.name}\n </p>\n </div>\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>\n {saving ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-1 h-4 w-4\" />\n )}\n Save Changes\n </Button>\n </div>\n\n {saveError && (\n <div className=\"p-3 rounded-md bg-destructive/10 text-destructive text-sm\">\n Failed to save: {saveError.message}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>Release Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Version</label>\n <Input\n value={form.version}\n onChange={(e) => setForm({ ...form, version: e.target.value })}\n className=\"mt-1\"\n placeholder=\"v1.0.0\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <MarkdownEditor\n label=\"Description\"\n value={form.description}\n onChange={(value) => setForm({ ...form, description: value })}\n minHeight={80}\n />\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Status</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.status}\n onChange={(e) => setForm({ ...form, status: e.target.value })}\n >\n {statuses.map((s) => (\n <option key={s} value={s} className=\"capitalize\">\n {s.toLowerCase().replace('_', ' ')}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Planned Date</label>\n <Input\n type=\"date\"\n value={form.plannedDate}\n onChange={(e) => setForm({ ...form, plannedDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Tags (comma-separated)</label>\n <Input\n value={form.tags}\n onChange={(e) => setForm({ ...form, tags: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. critical, security, performance\"\n />\n </div>\n <MarkdownEditor\n label=\"Release Notes\"\n value={form.releaseNotes}\n onChange={(value) => setForm({ ...form, releaseNotes: value })}\n placeholder=\"Describe what changed in this release...\"\n minHeight={120}\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProductsEditReleasePagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsEditReleasePagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState, useMemo } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery, useMutation } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, ArrowLeft, Loader2 } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { throwOnError } from '../utils/mutationResult';\nimport { RELEASE_STATUSES } from '../controls/ReleaseControls';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\n\nconst GET_RELEASE = gql`\n query GetReleaseForEdit($id: ID!) {\n planmagnetRelease(id: $id) {\n id\n name\n description\n version\n status\n plannedDate\n releasedAt\n releaseNotes\n ownerId\n tags\n }\n }\n`;\n\nconst UPDATE_RELEASE = gql`\n mutation UpdateRelease($id: ID!, $input: PlanmagnetUpdateReleaseInput!) {\n planmagnetUpdateRelease(id: $id, input: $input) {\n id\n name\n description\n version\n status\n plannedDate\n releaseNotes\n tags\n updatedAt\n }\n }\n`;\n\nexport function ProductsEditReleasePagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const params = useParams<{ id: string }>();\n const releaseId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_RELEASE, {\n variables: { id: releaseId },\n skip: !releaseId,\n });\n\n const [updateRelease, { loading: saving }] = useMutation(UPDATE_RELEASE, {\n refetchQueries: ['ListReleases', 'GetReleaseForEdit', 'GetRelease', 'ReleaseReadiness'],\n awaitRefetchQueries: true,\n });\n const [saveError, setSaveError] = useState<string | null>(null);\n const [saved, setSaved] = useState(false);\n\n const release = data?.planmagnetRelease;\n\n const defaultForm = useMemo(\n () => ({\n version: release?.version ?? '',\n name: release?.name ?? '',\n description: release?.description ?? '',\n status: release?.status ?? 'DRAFT',\n plannedDate: release?.plannedDate\n ? new Date(release.plannedDate).toISOString().split('T')[0]\n : '',\n releaseNotes: release?.releaseNotes ?? '',\n tags: release?.tags?.join(', ') ?? '',\n }),\n [release]\n );\n\n const [formOverrides, setFormOverrides] = useState<Record<string, string>>({});\n const form = { ...defaultForm, ...formOverrides };\n const setForm = (val: Record<string, string>) => setFormOverrides(val);\n\n // Every ReleaseStatus: STAGING was missing, so a staging release showed as \"draft\" (BOFF-7985).\n const statuses = (RELEASE_STATUSES as readonly string[]).includes(form.status)\n ? RELEASE_STATUSES\n : [form.status, ...RELEASE_STATUSES];\n\n // BOFF-7979: only changed fields are sent, an emptied optional field is cleared (it used to be omitted, so the\n // old value stayed), and success is confirmed.\n const handleSave = async () => {\n if (!form.version.trim() || !form.name.trim()) {\n setSaveError('Version and name are required.');\n return;\n }\n const tagList = (v: string) =>\n v\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n const next: Record<string, unknown> = {\n version: form.version.trim(),\n name: form.name.trim(),\n description: form.description.trim() || null,\n status: form.status,\n plannedDate: form.plannedDate || null,\n releaseNotes: form.releaseNotes.trim() ? form.releaseNotes : null,\n tags: tagList(form.tags),\n };\n const before: Record<string, unknown> = {\n version: defaultForm.version,\n name: defaultForm.name,\n description: defaultForm.description.trim() || null,\n status: defaultForm.status,\n plannedDate: defaultForm.plannedDate || null,\n releaseNotes: defaultForm.releaseNotes.trim() ? defaultForm.releaseNotes : null,\n tags: tagList(defaultForm.tags),\n };\n const input = Object.fromEntries(\n Object.entries(next).filter(([k, v]) => JSON.stringify(v) !== JSON.stringify(before[k]))\n );\n setSaveError(null);\n setSaved(false);\n if (Object.keys(input).length === 0) {\n setSaved(true);\n return;\n }\n try {\n await throwOnError(updateRelease({ variables: { id: releaseId, input } }));\n setSaved(true);\n } catch (e) {\n setSaveError(e instanceof Error ? e.message : 'The release could not be saved.');\n }\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 <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-destructive\">Failed to load release: {error.message}</div>;\n }\n\n if (!release) return <div className=\"p-6 text-muted-foreground\">Release not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate('/products/releases-page')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Release</h1>\n <p className=\"text-sm text-muted-foreground\">\n {release.version} - {release.name}\n </p>\n </div>\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>\n {saving ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-1 h-4 w-4\" />\n )}\n Save Changes\n </Button>\n </div>\n\n {saved && (\n <div role=\"status\" className=\"p-3 bg-muted text-status-success-text rounded-md text-sm\">\n Changes saved.\n </div>\n )}\n {saveError && (\n <div role=\"alert\" className=\"p-3 rounded-md bg-destructive/10 text-destructive text-sm\">\n {saveError}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>Release Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Version</label>\n <Input\n value={form.version}\n onChange={(e) => setForm({ ...form, version: e.target.value })}\n className=\"mt-1\"\n placeholder=\"v1.0.0\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <MarkdownEditor\n label=\"Description\"\n value={form.description}\n onChange={(value) => setForm({ ...form, description: value })}\n minHeight={80}\n />\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Status</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.status}\n onChange={(e) => setForm({ ...form, status: e.target.value })}\n >\n {statuses.map((s) => (\n <option key={s} value={s} className=\"capitalize\">\n {s.toLowerCase().replace('_', ' ')}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Planned Date</label>\n <Input\n type=\"date\"\n value={form.plannedDate}\n onChange={(e) => setForm({ ...form, plannedDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Tags (comma-separated)</label>\n <Input\n value={form.tags}\n onChange={(e) => setForm({ ...form, tags: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. critical, security, performance\"\n />\n </div>\n <MarkdownEditor\n label=\"Release Notes\"\n value={form.releaseNotes}\n onChange={(value) => setForm({ ...form, releaseNotes: value })}\n placeholder=\"Describe what changed in this release...\"\n minHeight={120}\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsFeatureDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsFeatureDetailPagePage.tsx"],"names":[],"mappings":"AA4DA,wBAAgB,6BAA6B,4CAqN5C"}
1
+ {"version":3,"file":"ProductsFeatureDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsFeatureDetailPagePage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,6BAA6B,4CA6M5C"}