@burdenoff/microfe-planmagnet 2026.928.10 → 2026.928.11

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.
@@ -1,15 +1,15 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { throwOnError as n } from "../utils/mutationResult.js";
3
3
  import { AssigneeSelect as r, WORK_ITEM_PRIORITIES as i } from "../controls/WorkItemControls.js";
4
- import { parseIntField as a } from "../utils/formValidation.js";
5
- import { useState as o } from "react";
6
- import { CheckSquare as s, Save as c, X as l } from "lucide-react";
7
- import { gql as u } from "@apollo/client";
8
- import { useMutation as d, useQuery as f } from "@apollo/client/react";
9
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
10
- import { Button as h, Card as g, CardContent as _, CardHeader as v, CardTitle as y, Input as b } from "@burdenoff/fe-libs/ui";
4
+ import { parseEstimateHours as a, parseIntField as o } from "../utils/formValidation.js";
5
+ import { useState as s } from "react";
6
+ import { CheckSquare as c, Save as l, X as u } from "lucide-react";
7
+ import { gql as d } from "@apollo/client";
8
+ import { useMutation as f, useQuery as p } from "@apollo/client/react";
9
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
10
+ import { Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, Input as x } from "@burdenoff/fe-libs/ui";
11
11
  //#region src/planmagnet/pages/TasksCreateTaskPagePage.tsx
12
- var x = u`
12
+ var S = d`
13
13
  mutation CreateWorkItem($input: PlanmagnetCreateWorkItemInput!) {
14
14
  planmagnetCreateWorkItem(input: $input) {
15
15
  id
@@ -25,7 +25,7 @@ var x = u`
25
25
  createdAt
26
26
  }
27
27
  }
28
- `, S = u`
28
+ `, C = d`
29
29
  query GetProjectsForTaskCreate($workspaceId: ID!) {
30
30
  planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {
31
31
  items {
@@ -35,7 +35,7 @@ var x = u`
35
35
  }
36
36
  }
37
37
  }
38
- `, C = u`
38
+ `, w = d`
39
39
  query GetSprintsForTaskCreate($workspaceId: ID!, $projectId: String) {
40
40
  planmagnetSprints(
41
41
  workspaceId: $workspaceId
@@ -49,13 +49,13 @@ var x = u`
49
49
  }
50
50
  }
51
51
  }
52
- `, w = new Set([
52
+ `, T = new Set([
53
53
  "PLANNING",
54
54
  "ACTIVE",
55
55
  "REVIEW"
56
56
  ]);
57
- function T() {
58
- let { workspaceId: u } = e(), [T, E] = o({
57
+ function E() {
58
+ let { workspaceId: d } = e(), [E, D] = s({
59
59
  title: "",
60
60
  description: "",
61
61
  projectId: "",
@@ -65,120 +65,122 @@ function T() {
65
65
  labels: "",
66
66
  sprintId: "",
67
67
  assigneeId: "",
68
- dueDate: ""
69
- }), { data: D, loading: O, error: k, refetch: A } = f(S, {
70
- variables: { workspaceId: u ?? "default" },
71
- skip: !u
72
- }), j = D?.planmagnetProjects?.items ?? [], M = T.projectId || j[0]?.id || "", { data: N, loading: P } = f(C, {
68
+ dueDate: "",
69
+ estimateHours: ""
70
+ }), { data: O, loading: k, error: A, refetch: j } = p(C, {
71
+ variables: { workspaceId: d ?? "default" },
72
+ skip: !d
73
+ }), M = O?.planmagnetProjects?.items ?? [], N = E.projectId || M[0]?.id || "", { data: P, loading: F } = p(w, {
73
74
  variables: {
74
- workspaceId: u ?? "default",
75
- projectId: M
75
+ workspaceId: d ?? "default",
76
+ projectId: N
76
77
  },
77
- skip: !u || !M
78
- }), F = (N?.planmagnetSprints?.items ?? []).filter((e) => w.has(e.status)), I = t(), [L, { loading: R }] = d(x, { refetchQueries: ["GetWorkItems"] }), [z, B] = o(null), V = a(T.storyPoints, { min: 0 });
79
- return /* @__PURE__ */ m("div", {
78
+ skip: !d || !N
79
+ }), I = (P?.planmagnetSprints?.items ?? []).filter((e) => T.has(e.status)), L = t(), [R, { loading: z }] = f(S, { refetchQueries: ["GetWorkItems"] }), [B, V] = s(null), H = o(E.storyPoints, { min: 0 }), U = a(E.estimateHours);
80
+ return /* @__PURE__ */ h("div", {
80
81
  className: "space-y-6 p-6 max-w-4xl",
81
82
  children: [
82
- /* @__PURE__ */ m("div", {
83
+ /* @__PURE__ */ h("div", {
83
84
  className: "flex items-center justify-between",
84
- children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h1", {
85
+ children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
85
86
  className: "text-2xl font-semibold",
86
87
  children: "Create Task"
87
- }), /* @__PURE__ */ p("p", {
88
+ }), /* @__PURE__ */ m("p", {
88
89
  className: "text-sm text-muted-foreground",
89
90
  children: "Add a new task to the project backlog."
90
- })] }), /* @__PURE__ */ m("div", {
91
+ })] }), /* @__PURE__ */ h("div", {
91
92
  className: "flex gap-2",
92
- children: [/* @__PURE__ */ m(h, {
93
+ children: [/* @__PURE__ */ h(g, {
93
94
  variant: "outline",
94
95
  size: "sm",
95
- onClick: () => I("/tasks/tasks-page"),
96
- children: [/* @__PURE__ */ p(l, { className: "mr-1 h-4 w-4" }), "Cancel"]
97
- }), /* @__PURE__ */ m(h, {
96
+ onClick: () => L("/tasks/tasks-page"),
97
+ children: [/* @__PURE__ */ m(u, { className: "mr-1 h-4 w-4" }), "Cancel"]
98
+ }), /* @__PURE__ */ h(g, {
98
99
  size: "sm",
99
100
  onClick: async () => {
100
- if (!(!T.title.trim() || !M || !u || V.invalid)) {
101
- B(null);
101
+ if (!(!E.title.trim() || !N || !d || H.invalid || U.invalid)) {
102
+ V(null);
102
103
  try {
103
- let e = (await n(L({ variables: { input: {
104
- projectId: M,
105
- title: T.title,
106
- description: T.description || void 0,
107
- type: T.type,
108
- priority: T.priority,
109
- storyPoints: V.value,
110
- labels: T.labels ? T.labels.split(",").map((e) => e.trim()).filter(Boolean) : void 0,
111
- sprintId: T.sprintId || void 0,
112
- assigneeId: T.assigneeId || void 0,
113
- dueDate: T.dueDate || void 0
104
+ let e = (await n(R({ variables: { input: {
105
+ projectId: N,
106
+ title: E.title,
107
+ description: E.description || void 0,
108
+ type: E.type,
109
+ priority: E.priority,
110
+ storyPoints: H.value,
111
+ labels: E.labels ? E.labels.split(",").map((e) => e.trim()).filter(Boolean) : void 0,
112
+ sprintId: E.sprintId || void 0,
113
+ assigneeId: E.assigneeId || void 0,
114
+ dueDate: E.dueDate || void 0,
115
+ estimateMinutes: U.minutes
114
116
  } } }))).data?.planmagnetCreateWorkItem?.id;
115
- I(e ? `/tasks/task-detail-page?taskId=${encodeURIComponent(e)}` : "/tasks/tasks-page");
117
+ L(e ? `/tasks/task-detail-page?taskId=${encodeURIComponent(e)}` : "/tasks/tasks-page");
116
118
  } catch (e) {
117
- B(e instanceof Error ? e.message : "The task could not be created.");
119
+ V(e instanceof Error ? e.message : "The task could not be created.");
118
120
  }
119
121
  }
120
122
  },
121
- disabled: R || !T.title.trim() || !M || V.invalid,
122
- children: [/* @__PURE__ */ p(c, { className: "mr-1 h-4 w-4" }), R ? "Creating..." : "Create Task"]
123
+ disabled: z || !E.title.trim() || !N || H.invalid || U.invalid,
124
+ children: [/* @__PURE__ */ m(l, { className: "mr-1 h-4 w-4" }), z ? "Creating..." : "Create Task"]
123
125
  })]
124
126
  })]
125
127
  }),
126
- z && /* @__PURE__ */ p("div", {
128
+ B && /* @__PURE__ */ m("div", {
127
129
  role: "alert",
128
130
  className: "p-3 bg-destructive/10 text-destructive rounded-md text-sm",
129
- children: z
131
+ children: B
130
132
  }),
131
- /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ m(y, {
133
+ /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ h(b, {
132
134
  className: "flex items-center gap-2",
133
- children: [/* @__PURE__ */ p(s, { className: "h-4 w-4" }), "Task Details"]
134
- }) }), /* @__PURE__ */ m(_, {
135
+ children: [/* @__PURE__ */ m(c, { className: "h-4 w-4" }), "Task Details"]
136
+ }) }), /* @__PURE__ */ h(v, {
135
137
  className: "space-y-4",
136
138
  children: [
137
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
139
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
138
140
  className: "text-sm font-medium",
139
141
  children: "Title"
140
- }), /* @__PURE__ */ p(b, {
141
- value: T.title,
142
- onChange: (e) => E({
143
- ...T,
142
+ }), /* @__PURE__ */ m(x, {
143
+ value: E.title,
144
+ onChange: (e) => D({
145
+ ...E,
144
146
  title: e.target.value
145
147
  }),
146
148
  className: "mt-1",
147
149
  placeholder: "e.g. Implement search query parser"
148
150
  })] }),
149
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
151
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
150
152
  className: "text-sm font-medium",
151
153
  children: "Description"
152
- }), /* @__PURE__ */ p("textarea", {
154
+ }), /* @__PURE__ */ m("textarea", {
153
155
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[100px]",
154
- value: T.description,
155
- onChange: (e) => E({
156
- ...T,
156
+ value: E.description,
157
+ onChange: (e) => D({
158
+ ...E,
157
159
  description: e.target.value
158
160
  }),
159
161
  placeholder: "Describe the task requirements..."
160
162
  })] }),
161
- /* @__PURE__ */ m("div", {
163
+ /* @__PURE__ */ h("div", {
162
164
  className: "grid grid-cols-3 gap-4",
163
165
  children: [
164
- /* @__PURE__ */ m("div", { children: [
165
- /* @__PURE__ */ p("label", {
166
+ /* @__PURE__ */ h("div", { children: [
167
+ /* @__PURE__ */ m("label", {
166
168
  className: "text-sm font-medium",
167
169
  children: "Project"
168
170
  }),
169
- /* @__PURE__ */ m("select", {
171
+ /* @__PURE__ */ h("select", {
170
172
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
171
- value: M,
172
- onChange: (e) => E({
173
- ...T,
173
+ value: N,
174
+ onChange: (e) => D({
175
+ ...E,
174
176
  projectId: e.target.value,
175
177
  sprintId: ""
176
178
  }),
177
- children: [j.length === 0 && /* @__PURE__ */ p("option", {
179
+ children: [M.length === 0 && /* @__PURE__ */ m("option", {
178
180
  value: "",
179
181
  disabled: !0,
180
- children: O && !D ? "Loading projects…" : k ? "Projects could not be loaded" : "No projects yet"
181
- }), j.map((e) => /* @__PURE__ */ m("option", {
182
+ children: k && !O ? "Loading projects…" : A ? "Projects could not be loaded" : "No projects yet"
183
+ }), M.map((e) => /* @__PURE__ */ h("option", {
182
184
  value: e.id,
183
185
  children: [
184
186
  e.key,
@@ -187,48 +189,48 @@ function T() {
187
189
  ]
188
190
  }, e.id))]
189
191
  }),
190
- k && /* @__PURE__ */ m("p", {
192
+ A && /* @__PURE__ */ h("p", {
191
193
  role: "alert",
192
194
  className: "mt-1 flex items-center gap-2 text-xs text-destructive",
193
- children: [k.message, /* @__PURE__ */ p(h, {
195
+ children: [A.message, /* @__PURE__ */ m(g, {
194
196
  type: "button",
195
197
  size: "sm",
196
198
  variant: "ghost",
197
199
  className: "h-6 px-2 text-xs",
198
- onClick: () => void A(),
200
+ onClick: () => void j(),
199
201
  children: "Retry"
200
202
  })]
201
203
  }),
202
- !O && !k && D && j.length === 0 && /* @__PURE__ */ p("button", {
204
+ !k && !A && O && M.length === 0 && /* @__PURE__ */ m("button", {
203
205
  type: "button",
204
206
  className: "mt-1 text-xs text-muted-foreground underline",
205
- onClick: () => I("/projects/create-project-page"),
207
+ onClick: () => L("/projects/create-project-page"),
206
208
  children: "Create a project first"
207
209
  })
208
210
  ] }),
209
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
211
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
210
212
  className: "text-sm font-medium",
211
213
  children: "Priority"
212
- }), /* @__PURE__ */ p("select", {
214
+ }), /* @__PURE__ */ m("select", {
213
215
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
214
- value: T.priority,
215
- onChange: (e) => E({
216
- ...T,
216
+ value: E.priority,
217
+ onChange: (e) => D({
218
+ ...E,
217
219
  priority: e.target.value
218
220
  }),
219
- children: i.map((e) => /* @__PURE__ */ p("option", {
221
+ children: i.map((e) => /* @__PURE__ */ m("option", {
220
222
  value: e,
221
223
  children: e.toLowerCase()
222
224
  }, e))
223
225
  })] }),
224
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
226
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
225
227
  className: "text-sm font-medium",
226
228
  children: "Type"
227
- }), /* @__PURE__ */ p("select", {
229
+ }), /* @__PURE__ */ m("select", {
228
230
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
229
- value: T.type,
230
- onChange: (e) => E({
231
- ...T,
231
+ value: E.type,
232
+ onChange: (e) => D({
233
+ ...E,
232
234
  type: e.target.value
233
235
  }),
234
236
  children: [
@@ -237,57 +239,57 @@ function T() {
237
239
  "TASK",
238
240
  "EPIC",
239
241
  "SUB_TASK"
240
- ].map((e) => /* @__PURE__ */ p("option", {
242
+ ].map((e) => /* @__PURE__ */ m("option", {
241
243
  value: e,
242
244
  children: e.toLowerCase().replace("_", " ")
243
245
  }, e))
244
246
  })] })
245
247
  ]
246
248
  }),
247
- /* @__PURE__ */ m("div", {
249
+ /* @__PURE__ */ h("div", {
248
250
  className: "grid grid-cols-3 gap-4",
249
251
  children: [
250
- /* @__PURE__ */ m("div", { children: [
251
- /* @__PURE__ */ p("label", {
252
+ /* @__PURE__ */ h("div", { children: [
253
+ /* @__PURE__ */ m("label", {
252
254
  htmlFor: "task-story-points",
253
255
  className: "text-sm font-medium",
254
256
  children: "Story Points"
255
257
  }),
256
- /* @__PURE__ */ p(b, {
258
+ /* @__PURE__ */ m(x, {
257
259
  id: "task-story-points",
258
260
  type: "number",
259
261
  min: 0,
260
262
  step: 1,
261
- value: T.storyPoints,
262
- onChange: (e) => E({
263
- ...T,
263
+ value: E.storyPoints,
264
+ onChange: (e) => D({
265
+ ...E,
264
266
  storyPoints: e.target.value
265
267
  }),
266
- "aria-invalid": V.invalid,
268
+ "aria-invalid": H.invalid,
267
269
  className: "mt-1"
268
270
  }),
269
- V.invalid && /* @__PURE__ */ p("p", {
271
+ H.invalid && /* @__PURE__ */ m("p", {
270
272
  role: "alert",
271
273
  className: "mt-1 text-xs text-destructive",
272
274
  children: "Story points must be a whole number, 0 or more."
273
275
  })
274
276
  ] }),
275
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
277
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
276
278
  htmlFor: "task-sprint",
277
279
  className: "text-sm font-medium",
278
280
  children: "Sprint"
279
- }), /* @__PURE__ */ m("select", {
281
+ }), /* @__PURE__ */ h("select", {
280
282
  id: "task-sprint",
281
283
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
282
- value: T.sprintId,
283
- onChange: (e) => E({
284
- ...T,
284
+ value: E.sprintId,
285
+ onChange: (e) => D({
286
+ ...E,
285
287
  sprintId: e.target.value
286
288
  }),
287
- children: [/* @__PURE__ */ p("option", {
289
+ children: [/* @__PURE__ */ m("option", {
288
290
  value: "",
289
- children: P && !N ? "Loading sprints…" : "No sprint"
290
- }), F.map((e) => /* @__PURE__ */ m("option", {
291
+ children: F && !P ? "Loading sprints…" : "No sprint"
292
+ }), I.map((e) => /* @__PURE__ */ h("option", {
291
293
  value: e.id,
292
294
  children: [
293
295
  e.name,
@@ -297,42 +299,75 @@ function T() {
297
299
  ]
298
300
  }, e.id))]
299
301
  })] }),
300
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
302
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
301
303
  className: "text-sm font-medium",
302
304
  children: "Due Date"
303
- }), /* @__PURE__ */ p(b, {
305
+ }), /* @__PURE__ */ m(x, {
304
306
  type: "date",
305
- value: T.dueDate,
306
- onChange: (e) => E({
307
- ...T,
307
+ value: E.dueDate,
308
+ onChange: (e) => D({
309
+ ...E,
308
310
  dueDate: e.target.value
309
311
  }),
310
312
  className: "mt-1"
311
313
  })] })
312
314
  ]
313
315
  }),
314
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
316
+ /* @__PURE__ */ m("div", {
317
+ className: "grid grid-cols-3 gap-4",
318
+ children: /* @__PURE__ */ h("div", { children: [
319
+ /* @__PURE__ */ m("label", {
320
+ htmlFor: "task-estimate-hours",
321
+ className: "text-sm font-medium",
322
+ children: "Estimate (hours)"
323
+ }),
324
+ /* @__PURE__ */ m(x, {
325
+ id: "task-estimate-hours",
326
+ type: "number",
327
+ min: 0,
328
+ step: .25,
329
+ value: E.estimateHours,
330
+ onChange: (e) => D({
331
+ ...E,
332
+ estimateHours: e.target.value
333
+ }),
334
+ "aria-invalid": U.invalid,
335
+ "aria-describedby": "task-estimate-hint",
336
+ className: "mt-1"
337
+ }),
338
+ U.invalid ? /* @__PURE__ */ m("p", {
339
+ role: "alert",
340
+ className: "mt-1 text-xs text-destructive",
341
+ children: "The estimate must be a number of hours, 0 or more."
342
+ }) : /* @__PURE__ */ m("p", {
343
+ id: "task-estimate-hint",
344
+ className: "mt-1 text-xs text-muted-foreground",
345
+ children: "Used as the task's duration on the critical path."
346
+ })
347
+ ] })
348
+ }),
349
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
315
350
  htmlFor: "task-assignee",
316
351
  className: "text-sm font-medium",
317
352
  children: "Assignee"
318
- }), /* @__PURE__ */ p("div", {
353
+ }), /* @__PURE__ */ m("div", {
319
354
  className: "mt-1",
320
- children: /* @__PURE__ */ p(r, {
355
+ children: /* @__PURE__ */ m(r, {
321
356
  id: "task-assignee",
322
- value: T.assigneeId,
323
- onChange: (e) => E({
324
- ...T,
357
+ value: E.assigneeId,
358
+ onChange: (e) => D({
359
+ ...E,
325
360
  assigneeId: e
326
361
  })
327
362
  })
328
363
  })] }),
329
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
364
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
330
365
  className: "text-sm font-medium",
331
366
  children: "Labels (comma-separated)"
332
- }), /* @__PURE__ */ p(b, {
333
- value: T.labels,
334
- onChange: (e) => E({
335
- ...T,
367
+ }), /* @__PURE__ */ m(x, {
368
+ value: E.labels,
369
+ onChange: (e) => D({
370
+ ...E,
336
371
  labels: e.target.value
337
372
  }),
338
373
  className: "mt-1",
@@ -344,6 +379,6 @@ function T() {
344
379
  });
345
380
  }
346
381
  //#endregion
347
- export { T as TasksCreateTaskPagePage };
382
+ export { E as TasksCreateTaskPagePage };
348
383
 
349
384
  //# sourceMappingURL=TasksCreateTaskPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TasksCreateTaskPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksCreateTaskPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, CheckSquare } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError } from '../utils/mutationResult';\nimport { parseIntField } from '../utils/formValidation';\nimport { AssigneeSelect, WORK_ITEM_PRIORITIES } from '../controls/WorkItemControls';\n\ninterface PlanmagnetProjectOption {\n id: string;\n name: string;\n key: string;\n}\n\nconst CREATE_WORK_ITEM = gql`\n mutation CreateWorkItem($input: PlanmagnetCreateWorkItemInput!) {\n planmagnetCreateWorkItem(input: $input) {\n id\n title\n type\n status\n priority\n key\n storyPoints\n dueDate\n labels\n sprintId\n createdAt\n }\n }\n`;\n\n// BOFF-4442/4443 live-verify fix: a WorkItem must belong to a real project\n// (PlanmagnetCreateWorkItemInput.projectId is non-null); the form needs the\n// caller's actual projects to choose from rather than a free-text name.\nconst GET_PROJECTS = gql`\n query GetProjectsForTaskCreate($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n key\n }\n }\n }\n`;\n\n// Sprints of the chosen project that can still take work (BOFF-7962: this was a free-text \"Sprint ID\" box — the id\n// was only discoverable from a sprint URL, and a name or another project's id was refused).\nconst GET_SPRINTS = gql`\n query GetSprintsForTaskCreate($workspaceId: ID!, $projectId: String) {\n planmagnetSprints(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n status\n }\n }\n }\n`;\nconst OPEN_SPRINT_STATUSES = new Set(['PLANNING', 'ACTIVE', 'REVIEW']);\n\nexport function TasksCreateTaskPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [form, setForm] = useState({\n title: '',\n description: '',\n projectId: '',\n priority: 'MEDIUM',\n type: 'STORY',\n storyPoints: '5',\n labels: '',\n sprintId: '',\n assigneeId: '',\n dueDate: '',\n });\n\n const {\n data: projectsData,\n loading: projectsLoading,\n error: projectsError,\n refetch: refetchProjects,\n } = useQuery<{ planmagnetProjects?: { items: PlanmagnetProjectOption[] } }>(GET_PROJECTS, {\n variables: { workspaceId: workspaceId ?? 'default' },\n skip: !workspaceId,\n });\n const projects: PlanmagnetProjectOption[] = projectsData?.planmagnetProjects?.items ?? [];\n // Fall back to the first loaded project when the user hasn't picked one\n // yet, without stashing derived state in an effect (avoids the extra\n // render cycle and keeps a single source of truth: `projects`).\n const selectedProjectId = form.projectId || projects[0]?.id || '';\n const { data: sprintsData, loading: sprintsLoading } = useQuery<{\n planmagnetSprints?: { items: { id: string; name: string; status: string }[] };\n }>(GET_SPRINTS, {\n variables: { workspaceId: workspaceId ?? 'default', projectId: selectedProjectId },\n skip: !workspaceId || !selectedProjectId,\n });\n const openSprints = (sprintsData?.planmagnetSprints?.items ?? []).filter((s) =>\n OPEN_SPRINT_STATUSES.has(s.status)\n );\n\n const navigate = usePlanMagnetNavigate();\n const [createWorkItem, { loading: saving }] = useMutation(CREATE_WORK_ITEM, {\n refetchQueries: ['GetWorkItems'],\n });\n const [saveError, setSaveError] = useState<string | null>(null);\n // Story points are a whole number, 0 or more (BOFF-7833: prod accepted -3).\n const storyPoints = parseIntField(form.storyPoints, { min: 0 });\n\n const handleCreate = async () => {\n if (!form.title.trim() || !selectedProjectId || !workspaceId || storyPoints.invalid) return;\n setSaveError(null);\n // Success opens the new task; a refusal shows the service's reason (errorPolicy 'all' resolves refused\n // mutations, so the old code showed nothing either way).\n try {\n const result = await throwOnError(\n createWorkItem({\n variables: {\n input: {\n projectId: selectedProjectId,\n title: form.title,\n description: form.description || undefined,\n type: form.type,\n priority: form.priority,\n storyPoints: storyPoints.value,\n labels: form.labels\n ? form.labels\n .split(',')\n .map((l) => l.trim())\n .filter(Boolean)\n : undefined,\n sprintId: form.sprintId || undefined,\n assigneeId: form.assigneeId || undefined,\n dueDate: form.dueDate || undefined,\n },\n },\n })\n );\n const id = (result.data as { planmagnetCreateWorkItem?: { id: string } } | undefined)\n ?.planmagnetCreateWorkItem?.id;\n navigate(\n id ? `/tasks/task-detail-page?taskId=${encodeURIComponent(id)}` : '/tasks/tasks-page'\n );\n } catch (e) {\n setSaveError(e instanceof Error ? e.message : 'The task could not be created.');\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Create Task</h1>\n <p className=\"text-sm text-muted-foreground\">Add a new task to the project backlog.</p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/tasks/tasks-page')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleCreate}\n disabled={saving || !form.title.trim() || !selectedProjectId || storyPoints.invalid}\n >\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Creating...' : 'Create Task'}\n </Button>\n </div>\n </div>\n {saveError && (\n <div role=\"alert\" className=\"p-3 bg-destructive/10 text-destructive rounded-md text-sm\">\n {saveError}\n </div>\n )}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckSquare className=\"h-4 w-4\" />\n Task Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Title</label>\n <Input\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. Implement search query parser\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Description</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[100px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"Describe the task requirements...\"\n />\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={selectedProjectId}\n // A sprint belongs to one project: changing the project clears the chosen sprint.\n onChange={(e) => setForm({ ...form, projectId: e.target.value, sprintId: '' })}\n >\n {projects.length === 0 && (\n <option value=\"\" disabled>\n {projectsLoading && !projectsData\n ? 'Loading projects…'\n : projectsError\n ? 'Projects could not be loaded'\n : 'No projects yet'}\n </option>\n )}\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.key} — {p.name}\n </option>\n ))}\n </select>\n {/* C2 (BOFF-7833): loading, failure and \"no projects\" are told apart. */}\n {projectsError && (\n <p role=\"alert\" className=\"mt-1 flex items-center gap-2 text-xs text-destructive\">\n {projectsError.message}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => void refetchProjects()}\n >\n Retry\n </Button>\n </p>\n )}\n {!projectsLoading && !projectsError && projectsData && projects.length === 0 && (\n <button\n type=\"button\"\n className=\"mt-1 text-xs text-muted-foreground underline\"\n onClick={() => navigate('/projects/create-project-page')}\n >\n Create a project first\n </button>\n )}\n </div>\n <div>\n <label className=\"text-sm font-medium\">Priority</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.priority}\n onChange={(e) => setForm({ ...form, priority: e.target.value })}\n >\n {WORK_ITEM_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {p.toLowerCase()}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Type</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.type}\n onChange={(e) => setForm({ ...form, type: e.target.value })}\n >\n {['STORY', 'BUG', 'TASK', 'EPIC', 'SUB_TASK'].map((t) => (\n <option key={t} value={t}>\n {t.toLowerCase().replace('_', ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label htmlFor=\"task-story-points\" className=\"text-sm font-medium\">\n Story Points\n </label>\n <Input\n id=\"task-story-points\"\n type=\"number\"\n min={0}\n step={1}\n value={form.storyPoints}\n onChange={(e) => setForm({ ...form, storyPoints: e.target.value })}\n aria-invalid={storyPoints.invalid}\n className=\"mt-1\"\n />\n {storyPoints.invalid && (\n <p role=\"alert\" className=\"mt-1 text-xs text-destructive\">\n Story points must be a whole number, 0 or more.\n </p>\n )}\n </div>\n <div>\n <label htmlFor=\"task-sprint\" className=\"text-sm font-medium\">\n Sprint\n </label>\n <select\n id=\"task-sprint\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.sprintId}\n onChange={(e) => setForm({ ...form, sprintId: e.target.value })}\n >\n <option value=\"\">\n {sprintsLoading && !sprintsData ? 'Loading sprints…' : 'No sprint'}\n </option>\n {openSprints.map((s) => (\n <option key={s.id} value={s.id}>\n {s.name} ({s.status.toLowerCase()})\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Due Date</label>\n <Input\n type=\"date\"\n value={form.dueDate}\n onChange={(e) => setForm({ ...form, dueDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"task-assignee\" className=\"text-sm font-medium\">\n Assignee\n </label>\n <div className=\"mt-1\">\n <AssigneeSelect\n id=\"task-assignee\"\n value={form.assigneeId}\n onChange={(assigneeId) => setForm({ ...form, assigneeId })}\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Labels (comma-separated)</label>\n <Input\n value={form.labels}\n onChange={(e) => setForm({ ...form, labels: e.target.value })}\n className=\"mt-1\"\n placeholder=\"backend, search, performance\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TasksCreateTaskPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksCreateTaskPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, CheckSquare } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError } from '../utils/mutationResult';\nimport { parseEstimateHours, parseIntField } from '../utils/formValidation';\nimport { AssigneeSelect, WORK_ITEM_PRIORITIES } from '../controls/WorkItemControls';\n\ninterface PlanmagnetProjectOption {\n id: string;\n name: string;\n key: string;\n}\n\nconst CREATE_WORK_ITEM = gql`\n mutation CreateWorkItem($input: PlanmagnetCreateWorkItemInput!) {\n planmagnetCreateWorkItem(input: $input) {\n id\n title\n type\n status\n priority\n key\n storyPoints\n dueDate\n labels\n sprintId\n createdAt\n }\n }\n`;\n\n// BOFF-4442/4443 live-verify fix: a WorkItem must belong to a real project\n// (PlanmagnetCreateWorkItemInput.projectId is non-null); the form needs the\n// caller's actual projects to choose from rather than a free-text name.\nconst GET_PROJECTS = gql`\n query GetProjectsForTaskCreate($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n key\n }\n }\n }\n`;\n\n// Sprints of the chosen project that can still take work (BOFF-7962: this was a free-text \"Sprint ID\" box — the id\n// was only discoverable from a sprint URL, and a name or another project's id was refused).\nconst GET_SPRINTS = gql`\n query GetSprintsForTaskCreate($workspaceId: ID!, $projectId: String) {\n planmagnetSprints(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n status\n }\n }\n }\n`;\nconst OPEN_SPRINT_STATUSES = new Set(['PLANNING', 'ACTIVE', 'REVIEW']);\n\nexport function TasksCreateTaskPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [form, setForm] = useState({\n title: '',\n description: '',\n projectId: '',\n priority: 'MEDIUM',\n type: 'STORY',\n storyPoints: '5',\n labels: '',\n sprintId: '',\n assigneeId: '',\n dueDate: '',\n estimateHours: '',\n });\n\n const {\n data: projectsData,\n loading: projectsLoading,\n error: projectsError,\n refetch: refetchProjects,\n } = useQuery<{ planmagnetProjects?: { items: PlanmagnetProjectOption[] } }>(GET_PROJECTS, {\n variables: { workspaceId: workspaceId ?? 'default' },\n skip: !workspaceId,\n });\n const projects: PlanmagnetProjectOption[] = projectsData?.planmagnetProjects?.items ?? [];\n // Fall back to the first loaded project when the user hasn't picked one\n // yet, without stashing derived state in an effect (avoids the extra\n // render cycle and keeps a single source of truth: `projects`).\n const selectedProjectId = form.projectId || projects[0]?.id || '';\n const { data: sprintsData, loading: sprintsLoading } = useQuery<{\n planmagnetSprints?: { items: { id: string; name: string; status: string }[] };\n }>(GET_SPRINTS, {\n variables: { workspaceId: workspaceId ?? 'default', projectId: selectedProjectId },\n skip: !workspaceId || !selectedProjectId,\n });\n const openSprints = (sprintsData?.planmagnetSprints?.items ?? []).filter((s) =>\n OPEN_SPRINT_STATUSES.has(s.status)\n );\n\n const navigate = usePlanMagnetNavigate();\n const [createWorkItem, { loading: saving }] = useMutation(CREATE_WORK_ITEM, {\n refetchQueries: ['GetWorkItems'],\n });\n const [saveError, setSaveError] = useState<string | null>(null);\n // Story points are a whole number, 0 or more (BOFF-7833: prod accepted -3).\n const storyPoints = parseIntField(form.storyPoints, { min: 0 });\n const estimate = parseEstimateHours(form.estimateHours);\n\n const handleCreate = async () => {\n if (\n !form.title.trim() ||\n !selectedProjectId ||\n !workspaceId ||\n storyPoints.invalid ||\n estimate.invalid\n )\n return;\n setSaveError(null);\n // Success opens the new task; a refusal shows the service's reason (errorPolicy 'all' resolves refused\n // mutations, so the old code showed nothing either way).\n try {\n const result = await throwOnError(\n createWorkItem({\n variables: {\n input: {\n projectId: selectedProjectId,\n title: form.title,\n description: form.description || undefined,\n type: form.type,\n priority: form.priority,\n storyPoints: storyPoints.value,\n labels: form.labels\n ? form.labels\n .split(',')\n .map((l) => l.trim())\n .filter(Boolean)\n : undefined,\n sprintId: form.sprintId || undefined,\n assigneeId: form.assigneeId || undefined,\n dueDate: form.dueDate || undefined,\n estimateMinutes: estimate.minutes,\n },\n },\n })\n );\n const id = (result.data as { planmagnetCreateWorkItem?: { id: string } } | undefined)\n ?.planmagnetCreateWorkItem?.id;\n navigate(\n id ? `/tasks/task-detail-page?taskId=${encodeURIComponent(id)}` : '/tasks/tasks-page'\n );\n } catch (e) {\n setSaveError(e instanceof Error ? e.message : 'The task could not be created.');\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Create Task</h1>\n <p className=\"text-sm text-muted-foreground\">Add a new task to the project backlog.</p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/tasks/tasks-page')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleCreate}\n disabled={\n saving ||\n !form.title.trim() ||\n !selectedProjectId ||\n storyPoints.invalid ||\n estimate.invalid\n }\n >\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Creating...' : 'Create Task'}\n </Button>\n </div>\n </div>\n {saveError && (\n <div role=\"alert\" className=\"p-3 bg-destructive/10 text-destructive rounded-md text-sm\">\n {saveError}\n </div>\n )}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckSquare className=\"h-4 w-4\" />\n Task Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Title</label>\n <Input\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. Implement search query parser\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Description</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[100px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"Describe the task requirements...\"\n />\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={selectedProjectId}\n // A sprint belongs to one project: changing the project clears the chosen sprint.\n onChange={(e) => setForm({ ...form, projectId: e.target.value, sprintId: '' })}\n >\n {projects.length === 0 && (\n <option value=\"\" disabled>\n {projectsLoading && !projectsData\n ? 'Loading projects…'\n : projectsError\n ? 'Projects could not be loaded'\n : 'No projects yet'}\n </option>\n )}\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.key} — {p.name}\n </option>\n ))}\n </select>\n {/* C2 (BOFF-7833): loading, failure and \"no projects\" are told apart. */}\n {projectsError && (\n <p role=\"alert\" className=\"mt-1 flex items-center gap-2 text-xs text-destructive\">\n {projectsError.message}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => void refetchProjects()}\n >\n Retry\n </Button>\n </p>\n )}\n {!projectsLoading && !projectsError && projectsData && projects.length === 0 && (\n <button\n type=\"button\"\n className=\"mt-1 text-xs text-muted-foreground underline\"\n onClick={() => navigate('/projects/create-project-page')}\n >\n Create a project first\n </button>\n )}\n </div>\n <div>\n <label className=\"text-sm font-medium\">Priority</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.priority}\n onChange={(e) => setForm({ ...form, priority: e.target.value })}\n >\n {WORK_ITEM_PRIORITIES.map((p) => (\n <option key={p} value={p}>\n {p.toLowerCase()}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Type</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.type}\n onChange={(e) => setForm({ ...form, type: e.target.value })}\n >\n {['STORY', 'BUG', 'TASK', 'EPIC', 'SUB_TASK'].map((t) => (\n <option key={t} value={t}>\n {t.toLowerCase().replace('_', ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label htmlFor=\"task-story-points\" className=\"text-sm font-medium\">\n Story Points\n </label>\n <Input\n id=\"task-story-points\"\n type=\"number\"\n min={0}\n step={1}\n value={form.storyPoints}\n onChange={(e) => setForm({ ...form, storyPoints: e.target.value })}\n aria-invalid={storyPoints.invalid}\n className=\"mt-1\"\n />\n {storyPoints.invalid && (\n <p role=\"alert\" className=\"mt-1 text-xs text-destructive\">\n Story points must be a whole number, 0 or more.\n </p>\n )}\n </div>\n <div>\n <label htmlFor=\"task-sprint\" className=\"text-sm font-medium\">\n Sprint\n </label>\n <select\n id=\"task-sprint\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.sprintId}\n onChange={(e) => setForm({ ...form, sprintId: e.target.value })}\n >\n <option value=\"\">\n {sprintsLoading && !sprintsData ? 'Loading sprints…' : 'No sprint'}\n </option>\n {openSprints.map((s) => (\n <option key={s.id} value={s.id}>\n {s.name} ({s.status.toLowerCase()})\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Due Date</label>\n <Input\n type=\"date\"\n value={form.dueDate}\n onChange={(e) => setForm({ ...form, dueDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label htmlFor=\"task-estimate-hours\" className=\"text-sm font-medium\">\n Estimate (hours)\n </label>\n <Input\n id=\"task-estimate-hours\"\n type=\"number\"\n min={0}\n step={0.25}\n value={form.estimateHours}\n onChange={(e) => setForm({ ...form, estimateHours: e.target.value })}\n aria-invalid={estimate.invalid}\n aria-describedby=\"task-estimate-hint\"\n className=\"mt-1\"\n />\n {estimate.invalid ? (\n <p role=\"alert\" className=\"mt-1 text-xs text-destructive\">\n The estimate must be a number of hours, 0 or more.\n </p>\n ) : (\n <p id=\"task-estimate-hint\" className=\"mt-1 text-xs text-muted-foreground\">\n Used as the task&apos;s duration on the critical path.\n </p>\n )}\n </div>\n </div>\n <div>\n <label htmlFor=\"task-assignee\" className=\"text-sm font-medium\">\n Assignee\n </label>\n <div className=\"mt-1\">\n <AssigneeSelect\n id=\"task-assignee\"\n value={form.assigneeId}\n onChange={(assigneeId) => setForm({ ...form, assigneeId })}\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Labels (comma-separated)</label>\n <Input\n value={form.labels}\n onChange={(e) => setForm({ ...form, labels: e.target.value })}\n className=\"mt-1\"\n placeholder=\"backend, search, performance\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TasksEditTaskPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksEditTaskPagePage.tsx"],"names":[],"mappings":"AAiEA,wBAAgB,qBAAqB,4CAoPpC"}
1
+ {"version":3,"file":"TasksEditTaskPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksEditTaskPagePage.tsx"],"names":[],"mappings":"AAoEA,wBAAgB,qBAAqB,4CAsRpC"}