@burdenoff/microfe-planmagnet 2026.830.1 → 2026.923.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +52 -0
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/hooks/useEntityId.d.ts +14 -0
- package/dist/planmagnet/hooks/useEntityId.d.ts.map +1 -0
- package/dist/planmagnet/hooks/useEntityId.js +15 -0
- package/dist/planmagnet/hooks/useEntityId.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +148 -144
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +85 -84
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +95 -91
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +117 -113
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +74 -70
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +21 -17
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +21 -16
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +67 -63
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +61 -56
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +107 -99
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +94 -90
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +46 -41
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +110 -106
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +2 -2
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +2 -2
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js +67 -66
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
- package/dist/planmagnet/utils/rowNavigation.d.ts +29 -0
- package/dist/planmagnet/utils/rowNavigation.d.ts.map +1 -0
- package/dist/planmagnet/utils/rowNavigation.js +20 -0
- package/dist/planmagnet/utils/rowNavigation.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { useEntityId as t } from "../hooks/useEntityId.js";
|
|
3
|
+
import { useMemo as n, useState as r } from "react";
|
|
4
|
+
import { ArrowLeft as i, Save as a } from "lucide-react";
|
|
5
|
+
import { gql as o } from "@apollo/client";
|
|
6
|
+
import { useMutation as s, useQuery as c } from "@apollo/client/react";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
8
|
+
import { Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, Input as g } from "@burdenoff/fe-libs/ui";
|
|
8
9
|
//#region src/planmagnet/pages/ProjectsPlanningEditPagePage.tsx
|
|
9
|
-
var
|
|
10
|
-
query GetSprintForEdit($workspaceId: ID!) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
capacity
|
|
21
|
-
}
|
|
10
|
+
var _ = o`
|
|
11
|
+
query GetSprintForEdit($id: ID!, $workspaceId: ID!) {
|
|
12
|
+
planmagnetSprint(id: $id) {
|
|
13
|
+
id
|
|
14
|
+
name
|
|
15
|
+
projectId
|
|
16
|
+
status
|
|
17
|
+
startDate
|
|
18
|
+
endDate
|
|
19
|
+
goal
|
|
20
|
+
capacity
|
|
22
21
|
}
|
|
23
22
|
planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {
|
|
24
23
|
items {
|
|
@@ -27,7 +26,7 @@ var g = a`
|
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
|
-
`,
|
|
29
|
+
`, v = o`
|
|
31
30
|
mutation UpdateSprint($id: ID!, $input: PlanmagnetUpdateSprintInput!) {
|
|
32
31
|
planmagnetUpdateSprint(id: $id, input: $input) {
|
|
33
32
|
id
|
|
@@ -40,18 +39,24 @@ var g = a`
|
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
`;
|
|
43
|
-
function
|
|
44
|
-
let { workspaceId:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
42
|
+
function y() {
|
|
43
|
+
let { workspaceId: o } = e(), y = t("sprintId"), { data: b, loading: x, error: S } = c(_, {
|
|
44
|
+
variables: {
|
|
45
|
+
id: y,
|
|
46
|
+
workspaceId: o ?? "default"
|
|
47
|
+
},
|
|
48
|
+
skip: !y
|
|
49
|
+
}), [C, w] = r(null), T = b?.planmagnetSprint, E = b?.planmagnetProjects?.items ?? [], D = n(() => ({
|
|
50
|
+
name: T?.name ?? "",
|
|
51
|
+
status: T?.status ?? "PLANNING",
|
|
52
|
+
startDate: T?.startDate ? T.startDate.split("T")[0] : "",
|
|
53
|
+
endDate: T?.endDate ? T.endDate.split("T")[0] : "",
|
|
54
|
+
goal: T?.goal ?? "",
|
|
55
|
+
capacity: T?.capacity?.toString() ?? ""
|
|
56
|
+
}), [T]), [O, k] = r({}), A = {
|
|
57
|
+
...D,
|
|
58
|
+
...O
|
|
59
|
+
}, j = (e) => k(e), [M, { loading: N, error: P }] = s(v, {
|
|
55
60
|
refetchQueries: [
|
|
56
61
|
"GetSprints",
|
|
57
62
|
"GetSprintDetail",
|
|
@@ -59,90 +64,90 @@ function v() {
|
|
|
59
64
|
"GetDashboardData"
|
|
60
65
|
],
|
|
61
66
|
onCompleted: () => {
|
|
62
|
-
|
|
67
|
+
w("Sprint updated successfully.");
|
|
63
68
|
}
|
|
64
69
|
});
|
|
65
|
-
return y ? /* @__PURE__ */
|
|
70
|
+
return y ? x ? /* @__PURE__ */ l("div", {
|
|
66
71
|
className: "flex items-center justify-center p-12",
|
|
67
|
-
children: /* @__PURE__ */
|
|
68
|
-
}) :
|
|
72
|
+
children: /* @__PURE__ */ l("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
73
|
+
}) : S ? /* @__PURE__ */ u("div", {
|
|
69
74
|
className: "p-6 text-red-500",
|
|
70
|
-
children: ["Error loading sprint: ",
|
|
71
|
-
}) :
|
|
75
|
+
children: ["Error loading sprint: ", S.message]
|
|
76
|
+
}) : T ? /* @__PURE__ */ u("div", {
|
|
72
77
|
className: "space-y-6 p-6 max-w-4xl",
|
|
73
78
|
children: [
|
|
74
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ u("div", {
|
|
75
80
|
className: "flex items-center justify-between",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
81
|
+
children: [/* @__PURE__ */ u("div", {
|
|
77
82
|
className: "flex items-center gap-3",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ l(d, {
|
|
79
84
|
variant: "ghost",
|
|
80
85
|
size: "sm",
|
|
81
|
-
children: /* @__PURE__ */
|
|
82
|
-
}), /* @__PURE__ */
|
|
86
|
+
children: /* @__PURE__ */ l(i, { className: "h-4 w-4" })
|
|
87
|
+
}), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
|
|
83
88
|
className: "text-2xl font-semibold",
|
|
84
89
|
children: "Edit Planning Session"
|
|
85
|
-
}), /* @__PURE__ */
|
|
90
|
+
}), /* @__PURE__ */ l("p", {
|
|
86
91
|
className: "text-sm text-muted-foreground",
|
|
87
|
-
children:
|
|
92
|
+
children: T.name
|
|
88
93
|
})] })]
|
|
89
|
-
}), /* @__PURE__ */
|
|
94
|
+
}), /* @__PURE__ */ u(d, {
|
|
90
95
|
size: "sm",
|
|
91
96
|
onClick: () => {
|
|
92
|
-
|
|
93
|
-
id:
|
|
97
|
+
T && M({ variables: {
|
|
98
|
+
id: T.id,
|
|
94
99
|
input: {
|
|
95
|
-
name:
|
|
96
|
-
status:
|
|
97
|
-
startDate:
|
|
98
|
-
endDate:
|
|
99
|
-
goal:
|
|
100
|
-
capacity:
|
|
100
|
+
name: A.name || void 0,
|
|
101
|
+
status: A.status || void 0,
|
|
102
|
+
startDate: A.startDate || void 0,
|
|
103
|
+
endDate: A.endDate || void 0,
|
|
104
|
+
goal: A.goal || void 0,
|
|
105
|
+
capacity: A.capacity ? parseInt(A.capacity, 10) : void 0
|
|
101
106
|
}
|
|
102
107
|
} });
|
|
103
108
|
},
|
|
104
|
-
disabled:
|
|
105
|
-
children: [/* @__PURE__ */
|
|
109
|
+
disabled: N,
|
|
110
|
+
children: [/* @__PURE__ */ l(a, { className: "mr-1 h-4 w-4" }), N ? "Saving..." : "Save Changes"]
|
|
106
111
|
})]
|
|
107
112
|
}),
|
|
108
|
-
|
|
113
|
+
C && /* @__PURE__ */ l("div", {
|
|
109
114
|
className: "p-3 bg-green-50 text-green-800 rounded-md text-sm",
|
|
110
|
-
children:
|
|
115
|
+
children: C
|
|
111
116
|
}),
|
|
112
|
-
|
|
117
|
+
P && /* @__PURE__ */ u("div", {
|
|
113
118
|
className: "p-3 bg-red-50 text-red-800 rounded-md text-sm",
|
|
114
|
-
children: ["Error: ",
|
|
119
|
+
children: ["Error: ", P.message]
|
|
115
120
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Session Details" }) }), /* @__PURE__ */ u(p, {
|
|
117
122
|
className: "space-y-4",
|
|
118
123
|
children: [
|
|
119
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
120
125
|
className: "text-sm font-medium",
|
|
121
126
|
children: "Name"
|
|
122
|
-
}), /* @__PURE__ */
|
|
123
|
-
value:
|
|
124
|
-
onChange: (e) =>
|
|
125
|
-
...
|
|
127
|
+
}), /* @__PURE__ */ l(g, {
|
|
128
|
+
value: A.name,
|
|
129
|
+
onChange: (e) => j({
|
|
130
|
+
...A,
|
|
126
131
|
name: e.target.value
|
|
127
132
|
}),
|
|
128
133
|
className: "mt-1"
|
|
129
134
|
})] }),
|
|
130
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ u("div", {
|
|
131
136
|
className: "grid grid-cols-2 gap-4",
|
|
132
|
-
children: [/* @__PURE__ */
|
|
137
|
+
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
133
138
|
className: "text-sm font-medium",
|
|
134
139
|
children: "Project"
|
|
135
|
-
}), /* @__PURE__ */
|
|
140
|
+
}), /* @__PURE__ */ l("div", {
|
|
136
141
|
className: "mt-1 w-full rounded-md border border-input bg-muted px-3 py-2 text-sm text-muted-foreground",
|
|
137
|
-
children:
|
|
138
|
-
})] }), /* @__PURE__ */
|
|
142
|
+
children: E.find((e) => e.id === T.projectId)?.name ?? T.projectId
|
|
143
|
+
})] }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
139
144
|
className: "text-sm font-medium",
|
|
140
145
|
children: "Status"
|
|
141
|
-
}), /* @__PURE__ */
|
|
146
|
+
}), /* @__PURE__ */ l("select", {
|
|
142
147
|
className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
|
|
143
|
-
value:
|
|
144
|
-
onChange: (e) =>
|
|
145
|
-
...
|
|
148
|
+
value: A.status,
|
|
149
|
+
onChange: (e) => j({
|
|
150
|
+
...A,
|
|
146
151
|
status: e.target.value
|
|
147
152
|
}),
|
|
148
153
|
children: [
|
|
@@ -151,58 +156,58 @@ function v() {
|
|
|
151
156
|
"REVIEW",
|
|
152
157
|
"COMPLETED",
|
|
153
158
|
"CANCELLED"
|
|
154
|
-
].map((e) => /* @__PURE__ */
|
|
159
|
+
].map((e) => /* @__PURE__ */ l("option", {
|
|
155
160
|
value: e,
|
|
156
161
|
children: e.toLowerCase().replace(/_/g, " ")
|
|
157
162
|
}, e))
|
|
158
163
|
})] })]
|
|
159
164
|
}),
|
|
160
|
-
/* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ u("div", {
|
|
161
166
|
className: "grid grid-cols-2 gap-4",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
167
|
+
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
163
168
|
className: "text-sm font-medium",
|
|
164
169
|
children: "Start Date"
|
|
165
|
-
}), /* @__PURE__ */
|
|
170
|
+
}), /* @__PURE__ */ l(g, {
|
|
166
171
|
type: "date",
|
|
167
|
-
value:
|
|
168
|
-
onChange: (e) =>
|
|
169
|
-
...
|
|
172
|
+
value: A.startDate,
|
|
173
|
+
onChange: (e) => j({
|
|
174
|
+
...A,
|
|
170
175
|
startDate: e.target.value
|
|
171
176
|
}),
|
|
172
177
|
className: "mt-1"
|
|
173
|
-
})] }), /* @__PURE__ */
|
|
178
|
+
})] }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
174
179
|
className: "text-sm font-medium",
|
|
175
180
|
children: "End Date"
|
|
176
|
-
}), /* @__PURE__ */
|
|
181
|
+
}), /* @__PURE__ */ l(g, {
|
|
177
182
|
type: "date",
|
|
178
|
-
value:
|
|
179
|
-
onChange: (e) =>
|
|
180
|
-
...
|
|
183
|
+
value: A.endDate,
|
|
184
|
+
onChange: (e) => j({
|
|
185
|
+
...A,
|
|
181
186
|
endDate: e.target.value
|
|
182
187
|
}),
|
|
183
188
|
className: "mt-1"
|
|
184
189
|
})] })]
|
|
185
190
|
}),
|
|
186
|
-
/* @__PURE__ */
|
|
191
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
187
192
|
className: "text-sm font-medium",
|
|
188
193
|
children: "Goal"
|
|
189
|
-
}), /* @__PURE__ */
|
|
194
|
+
}), /* @__PURE__ */ l("textarea", {
|
|
190
195
|
className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[60px]",
|
|
191
|
-
value:
|
|
192
|
-
onChange: (e) =>
|
|
193
|
-
...
|
|
196
|
+
value: A.goal,
|
|
197
|
+
onChange: (e) => j({
|
|
198
|
+
...A,
|
|
194
199
|
goal: e.target.value
|
|
195
200
|
}),
|
|
196
201
|
placeholder: "Sprint goal..."
|
|
197
202
|
})] }),
|
|
198
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
199
204
|
className: "text-sm font-medium",
|
|
200
205
|
children: "Capacity (story points)"
|
|
201
|
-
}), /* @__PURE__ */
|
|
206
|
+
}), /* @__PURE__ */ l(g, {
|
|
202
207
|
type: "number",
|
|
203
|
-
value:
|
|
204
|
-
onChange: (e) =>
|
|
205
|
-
...
|
|
208
|
+
value: A.capacity,
|
|
209
|
+
onChange: (e) => j({
|
|
210
|
+
...A,
|
|
206
211
|
capacity: e.target.value
|
|
207
212
|
}),
|
|
208
213
|
className: "mt-1",
|
|
@@ -211,12 +216,15 @@ function v() {
|
|
|
211
216
|
]
|
|
212
217
|
})] })
|
|
213
218
|
]
|
|
214
|
-
}) : /* @__PURE__ */
|
|
219
|
+
}) : /* @__PURE__ */ l("div", {
|
|
215
220
|
className: "p-6 text-muted-foreground",
|
|
216
221
|
children: "Planning session not found."
|
|
222
|
+
}) : /* @__PURE__ */ l("div", {
|
|
223
|
+
className: "p-6 text-muted-foreground",
|
|
224
|
+
children: "No planning session selected. Open one from the list."
|
|
217
225
|
});
|
|
218
226
|
}
|
|
219
227
|
//#endregion
|
|
220
|
-
export {
|
|
228
|
+
export { y as ProjectsPlanningEditPagePage };
|
|
221
229
|
|
|
222
230
|
//# sourceMappingURL=ProjectsPlanningEditPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsPlanningEditPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsPlanningEditPagePage.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 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_SPRINT_FOR_EDIT = gql`\n query GetSprintForEdit($workspaceId: ID!) {\n planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 1 }) {\n items {\n id\n name\n projectId\n status\n startDate\n endDate\n goal\n capacity\n }\n }\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n }\n }\n`;\n\nconst UPDATE_SPRINT = gql`\n mutation UpdateSprint($id: ID!, $input: PlanmagnetUpdateSprintInput!) {\n planmagnetUpdateSprint(id: $id, input: $input) {\n id\n name\n status\n startDate\n endDate\n goal\n capacity\n }\n }\n`;\n\nexport function ProjectsPlanningEditPagePage() {\n const { workspaceId } = usePlanMagnet();\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_SPRINT_FOR_EDIT, {\n variables: { workspaceId: workspaceId ?? 'default' },\n });\n\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const sprint = data?.planmagnetSprints?.items?.[0];\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const defaultForm = useMemo(\n () => ({\n name: sprint?.name ?? '',\n status: sprint?.status ?? 'PLANNING',\n startDate: sprint?.startDate ? sprint.startDate.split('T')[0] : '',\n endDate: sprint?.endDate ? sprint.endDate.split('T')[0] : '',\n goal: sprint?.goal ?? '',\n capacity: sprint?.capacity?.toString() ?? '',\n }),\n [sprint]\n );\n\n const [formOverrides, setFormOverrides] = useState<Record<string, string>>({});\n const form = { ...defaultForm, ...formOverrides };\n const setForm = (updates: Record<string, string>) => setFormOverrides(updates);\n\n const [updateSprint, { loading: saving, error: saveError }] = useMutation(UPDATE_SPRINT, {\n refetchQueries: ['GetSprints', 'GetSprintDetail', 'GetSprintForEdit', 'GetDashboardData'],\n onCompleted: () => {\n setSuccessMessage('Sprint updated successfully.');\n },\n });\n\n const statuses = ['PLANNING', 'ACTIVE', 'REVIEW', 'COMPLETED', 'CANCELLED'] as const;\n\n const handleSave = () => {\n if (!sprint) return;\n updateSprint({\n variables: {\n id: sprint.id,\n input: {\n name: form.name || undefined,\n status: form.status || undefined,\n startDate: form.startDate || undefined,\n endDate: form.endDate || undefined,\n goal: form.goal || undefined,\n capacity: form.capacity ? parseInt(form.capacity, 10) : undefined,\n },\n },\n });\n };\n\n if (loading)\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 if (error) return <div className=\"p-6 text-red-500\">Error loading sprint: {error.message}</div>;\n if (!sprint) return <div className=\"p-6 text-muted-foreground\">Planning session 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\">\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Planning Session</h1>\n <p className=\"text-sm text-muted-foreground\">{sprint.name}</p>\n </div>\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Saving...' : 'Save Changes'}\n </Button>\n </div>\n\n {successMessage && (\n <div className=\"p-3 bg-green-50 text-green-800 rounded-md text-sm\">{successMessage}</div>\n )}\n {saveError && (\n <div className=\"p-3 bg-red-50 text-red-800 rounded-md text-sm\">\n Error: {saveError.message}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>Session Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\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 className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <div className=\"mt-1 w-full rounded-md border border-input bg-muted px-3 py-2 text-sm text-muted-foreground\">\n {projects.find((p: { id: string; name: string }) => p.id === sprint.projectId)\n ?.name ?? sprint.projectId}\n </div>\n </div>\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}>\n {s.toLowerCase().replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Start Date</label>\n <Input\n type=\"date\"\n value={form.startDate}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">End Date</label>\n <Input\n type=\"date\"\n value={form.endDate}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Goal</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[60px]\"\n value={form.goal}\n onChange={(e) => setForm({ ...form, goal: e.target.value })}\n placeholder=\"Sprint goal...\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Capacity (story points)</label>\n <Input\n type=\"number\"\n value={form.capacity}\n onChange={(e) => setForm({ ...form, capacity: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. 40\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectsPlanningEditPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsPlanningEditPagePage.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 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useEntityId } from '../hooks/useEntityId';\n\nconst GET_SPRINT_FOR_EDIT = gql`\n query GetSprintForEdit($id: ID!, $workspaceId: ID!) {\n planmagnetSprint(id: $id) {\n id\n name\n projectId\n status\n startDate\n endDate\n goal\n capacity\n }\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n }\n }\n`;\n\nconst UPDATE_SPRINT = gql`\n mutation UpdateSprint($id: ID!, $input: PlanmagnetUpdateSprintInput!) {\n planmagnetUpdateSprint(id: $id, input: $input) {\n id\n name\n status\n startDate\n endDate\n goal\n capacity\n }\n }\n`;\n\nexport function ProjectsPlanningEditPagePage() {\n const { workspaceId } = usePlanMagnet();\n const sprintId = useEntityId('sprintId');\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_SPRINT_FOR_EDIT, {\n variables: { id: sprintId, workspaceId: workspaceId ?? 'default' },\n skip: !sprintId,\n });\n\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const sprint = data?.planmagnetSprint;\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const defaultForm = useMemo(\n () => ({\n name: sprint?.name ?? '',\n status: sprint?.status ?? 'PLANNING',\n startDate: sprint?.startDate ? sprint.startDate.split('T')[0] : '',\n endDate: sprint?.endDate ? sprint.endDate.split('T')[0] : '',\n goal: sprint?.goal ?? '',\n capacity: sprint?.capacity?.toString() ?? '',\n }),\n [sprint]\n );\n\n const [formOverrides, setFormOverrides] = useState<Record<string, string>>({});\n const form = { ...defaultForm, ...formOverrides };\n const setForm = (updates: Record<string, string>) => setFormOverrides(updates);\n\n const [updateSprint, { loading: saving, error: saveError }] = useMutation(UPDATE_SPRINT, {\n refetchQueries: ['GetSprints', 'GetSprintDetail', 'GetSprintForEdit', 'GetDashboardData'],\n onCompleted: () => {\n setSuccessMessage('Sprint updated successfully.');\n },\n });\n\n const statuses = ['PLANNING', 'ACTIVE', 'REVIEW', 'COMPLETED', 'CANCELLED'] as const;\n\n const handleSave = () => {\n if (!sprint) return;\n updateSprint({\n variables: {\n id: sprint.id,\n input: {\n name: form.name || undefined,\n status: form.status || undefined,\n startDate: form.startDate || undefined,\n endDate: form.endDate || undefined,\n goal: form.goal || undefined,\n capacity: form.capacity ? parseInt(form.capacity, 10) : undefined,\n },\n },\n });\n };\n\n if (!sprintId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No planning session selected. Open one from the list.\n </div>\n );\n if (loading)\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 if (error) return <div className=\"p-6 text-red-500\">Error loading sprint: {error.message}</div>;\n if (!sprint) return <div className=\"p-6 text-muted-foreground\">Planning session 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\">\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Planning Session</h1>\n <p className=\"text-sm text-muted-foreground\">{sprint.name}</p>\n </div>\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Saving...' : 'Save Changes'}\n </Button>\n </div>\n\n {successMessage && (\n <div className=\"p-3 bg-green-50 text-green-800 rounded-md text-sm\">{successMessage}</div>\n )}\n {saveError && (\n <div className=\"p-3 bg-red-50 text-red-800 rounded-md text-sm\">\n Error: {saveError.message}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>Session Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\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 className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <div className=\"mt-1 w-full rounded-md border border-input bg-muted px-3 py-2 text-sm text-muted-foreground\">\n {projects.find((p: { id: string; name: string }) => p.id === sprint.projectId)\n ?.name ?? sprint.projectId}\n </div>\n </div>\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}>\n {s.toLowerCase().replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Start Date</label>\n <Input\n type=\"date\"\n value={form.startDate}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">End Date</label>\n <Input\n type=\"date\"\n value={form.endDate}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Goal</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[60px]\"\n value={form.goal}\n onChange={(e) => setForm({ ...form, goal: e.target.value })}\n placeholder=\"Sprint goal...\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Capacity (story points)</label>\n <Input\n type=\"number\"\n value={form.capacity}\n onChange={(e) => setForm({ ...form, capacity: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. 40\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsPlanningPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsPlanningPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProjectsPlanningPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsPlanningPagePage.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,wBAAwB,4CA8HvC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { detailPath as n, rowLinkProps as r } from "../utils/rowNavigation.js";
|
|
3
|
+
import { CalendarClock as i, FolderKanban as a } from "lucide-react";
|
|
4
|
+
import { gql as o } from "@apollo/client";
|
|
5
|
+
import { useQuery as s } from "@apollo/client/react";
|
|
6
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
import { Badge as u, Card as d, CardContent as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
|
|
7
8
|
//#region src/planmagnet/pages/ProjectsPlanningPagePage.tsx
|
|
8
|
-
var
|
|
9
|
+
var h = o`
|
|
9
10
|
query GetSprints($workspaceId: ID!) {
|
|
10
11
|
planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 100 }) {
|
|
11
12
|
items {
|
|
@@ -27,109 +28,112 @@ var f = r`
|
|
|
27
28
|
totalCount
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
|
-
`,
|
|
31
|
+
`, g = {
|
|
31
32
|
PLANNING: "bg-blue-100 text-blue-800",
|
|
32
33
|
ACTIVE: "bg-green-100 text-green-800",
|
|
33
34
|
REVIEW: "bg-purple-100 text-purple-800",
|
|
34
35
|
COMPLETED: "bg-gray-100 text-gray-800",
|
|
35
36
|
CANCELLED: "bg-red-100 text-red-800"
|
|
36
37
|
};
|
|
37
|
-
function
|
|
38
|
-
let { workspaceId:
|
|
39
|
-
if (
|
|
38
|
+
function _() {
|
|
39
|
+
let { workspaceId: o } = e(), _ = t(), { data: v, loading: y, error: b } = s(h, { variables: { workspaceId: o ?? "default" } });
|
|
40
|
+
if (y) return /* @__PURE__ */ c("div", {
|
|
40
41
|
className: "flex items-center justify-center p-12",
|
|
41
|
-
children: /* @__PURE__ */
|
|
42
|
+
children: /* @__PURE__ */ c("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
42
43
|
});
|
|
43
|
-
if (
|
|
44
|
+
if (b) return /* @__PURE__ */ l("div", {
|
|
44
45
|
className: "p-6 text-red-500",
|
|
45
|
-
children: ["Error loading planning sessions: ",
|
|
46
|
+
children: ["Error loading planning sessions: ", b.message]
|
|
46
47
|
});
|
|
47
|
-
let
|
|
48
|
-
return /* @__PURE__ */
|
|
48
|
+
let x = v?.planmagnetSprints?.items ?? [];
|
|
49
|
+
return /* @__PURE__ */ l("div", {
|
|
49
50
|
className: "space-y-6 p-6",
|
|
50
51
|
children: [
|
|
51
|
-
/* @__PURE__ */
|
|
52
|
+
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
|
|
52
53
|
className: "text-2xl font-semibold",
|
|
53
54
|
children: "Planning Sessions"
|
|
54
|
-
}), /* @__PURE__ */
|
|
55
|
+
}), /* @__PURE__ */ l("p", {
|
|
55
56
|
className: "text-sm text-muted-foreground",
|
|
56
|
-
children: [
|
|
57
|
+
children: [x.length, " sprints across all projects"]
|
|
57
58
|
})] }),
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
+
/* @__PURE__ */ c("div", {
|
|
59
60
|
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
60
|
-
children:
|
|
61
|
-
let
|
|
62
|
-
return /* @__PURE__ */
|
|
63
|
-
|
|
64
|
-
children: /* @__PURE__ */
|
|
65
|
-
className: "
|
|
66
|
-
children:
|
|
67
|
-
className: "
|
|
68
|
-
children: [/* @__PURE__ */
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
})
|
|
75
|
-
}), /* @__PURE__ */ o(l, {
|
|
76
|
-
className: "space-y-3",
|
|
77
|
-
children: [
|
|
78
|
-
/* @__PURE__ */ o("div", {
|
|
79
|
-
className: "flex gap-2",
|
|
80
|
-
children: [/* @__PURE__ */ a("span", {
|
|
81
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${p[e.status] ?? "bg-gray-100"}`,
|
|
61
|
+
children: x.map((e) => {
|
|
62
|
+
let t = e.workItems.reduce((e, t) => e + (t.storyPoints ?? 0), 0), o = e.capacity ?? 0, s = o > 0 ? Math.round(t / o * 100) : 0;
|
|
63
|
+
return /* @__PURE__ */ l(d, {
|
|
64
|
+
...r(() => _(n("/projects/planning-detail-page", e.id)), e.name),
|
|
65
|
+
children: [/* @__PURE__ */ c(p, {
|
|
66
|
+
className: "pb-2",
|
|
67
|
+
children: /* @__PURE__ */ l("div", {
|
|
68
|
+
className: "flex items-center justify-between",
|
|
69
|
+
children: [/* @__PURE__ */ l(m, {
|
|
70
|
+
className: "text-base flex items-center gap-2",
|
|
71
|
+
children: [/* @__PURE__ */ c(i, { className: "h-4 w-4 text-primary" }), e.name]
|
|
72
|
+
}), /* @__PURE__ */ c(u, {
|
|
73
|
+
variant: e.status === "COMPLETED" ? "default" : "secondary",
|
|
74
|
+
className: "capitalize",
|
|
82
75
|
children: e.status.toLowerCase().replace("_", " ")
|
|
83
|
-
}), /* @__PURE__ */ o("span", {
|
|
84
|
-
className: "text-xs text-muted-foreground flex items-center gap-1",
|
|
85
|
-
children: [/* @__PURE__ */ a(n, { className: "h-3 w-3" }), e.projectId]
|
|
86
76
|
})]
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
77
|
+
})
|
|
78
|
+
}), /* @__PURE__ */ l(f, {
|
|
79
|
+
className: "space-y-3",
|
|
80
|
+
children: [
|
|
81
|
+
/* @__PURE__ */ l("div", {
|
|
82
|
+
className: "flex gap-2",
|
|
83
|
+
children: [/* @__PURE__ */ c("span", {
|
|
84
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${g[e.status] ?? "bg-gray-100"}`,
|
|
85
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
86
|
+
}), /* @__PURE__ */ l("span", {
|
|
87
|
+
className: "text-xs text-muted-foreground flex items-center gap-1",
|
|
88
|
+
children: [/* @__PURE__ */ c(a, { className: "h-3 w-3" }), e.projectId]
|
|
89
|
+
})]
|
|
90
|
+
}),
|
|
91
|
+
e.goal && /* @__PURE__ */ c("p", {
|
|
92
|
+
className: "text-sm text-muted-foreground",
|
|
93
|
+
children: e.goal
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ l("div", {
|
|
96
|
+
className: "flex gap-3 text-xs text-muted-foreground",
|
|
97
|
+
children: [/* @__PURE__ */ l("span", {
|
|
98
|
+
className: "flex items-center gap-1",
|
|
99
|
+
children: [
|
|
100
|
+
/* @__PURE__ */ c(i, { className: "h-3 w-3" }),
|
|
101
|
+
e.startDate ? new Date(e.startDate).toLocaleDateString() : "—",
|
|
102
|
+
" -",
|
|
103
|
+
" ",
|
|
104
|
+
e.endDate ? new Date(e.endDate).toLocaleDateString() : "—"
|
|
105
|
+
]
|
|
106
|
+
}), /* @__PURE__ */ l("span", { children: [e.workItems.length, " work items"] })]
|
|
107
|
+
}),
|
|
108
|
+
o > 0 && /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
|
|
109
|
+
className: "flex justify-between text-xs mb-1",
|
|
110
|
+
children: [/* @__PURE__ */ c("span", {
|
|
111
|
+
className: "text-muted-foreground",
|
|
112
|
+
children: "Capacity"
|
|
113
|
+
}), /* @__PURE__ */ l("span", {
|
|
114
|
+
className: "font-medium",
|
|
115
|
+
children: [
|
|
116
|
+
t,
|
|
117
|
+
"/",
|
|
118
|
+
o,
|
|
119
|
+
" pts (",
|
|
120
|
+
s,
|
|
121
|
+
"%)"
|
|
122
|
+
]
|
|
123
|
+
})]
|
|
124
|
+
}), /* @__PURE__ */ c("div", {
|
|
125
|
+
className: "w-full h-2 rounded-full bg-muted overflow-hidden",
|
|
126
|
+
children: /* @__PURE__ */ c("div", {
|
|
127
|
+
className: `h-full rounded-full ${s > 90 ? "bg-red-400" : "bg-primary"}`,
|
|
128
|
+
style: { width: `${Math.min(s, 100)}%` }
|
|
129
|
+
})
|
|
130
|
+
})] })
|
|
131
|
+
]
|
|
132
|
+
})]
|
|
133
|
+
}, e.id);
|
|
130
134
|
})
|
|
131
135
|
}),
|
|
132
|
-
|
|
136
|
+
x.length === 0 && /* @__PURE__ */ c("p", {
|
|
133
137
|
className: "text-center text-muted-foreground py-8",
|
|
134
138
|
children: "No planning sessions found."
|
|
135
139
|
})
|
|
@@ -137,6 +141,6 @@ function m() {
|
|
|
137
141
|
});
|
|
138
142
|
}
|
|
139
143
|
//#endregion
|
|
140
|
-
export {
|
|
144
|
+
export { _ as ProjectsPlanningPagePage };
|
|
141
145
|
|
|
142
146
|
//# sourceMappingURL=ProjectsPlanningPagePage.js.map
|