@burdenoff/microfe-planmagnet 2026.925.18 → 2026.926.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/generated/wspace-types.d.ts +61 -2
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +90 -79
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +124 -127
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
- package/dist/planmagnet/create/CreateDialogs.js +149 -124
- package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +1 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/NotFoundPage.d.ts +6 -0
- package/dist/planmagnet/pages/NotFoundPage.d.ts.map +1 -0
- package/dist/planmagnet/pages/NotFoundPage.js +18 -0
- package/dist/planmagnet/pages/NotFoundPage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +93 -98
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +72 -79
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +112 -123
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +103 -87
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +92 -98
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +88 -96
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +116 -114
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -88
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +79 -79
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +111 -91
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +117 -97
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +150 -154
- 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 +154 -117
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +75 -31
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +161 -115
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +117 -102
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +147 -147
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.js +77 -67
- package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
- package/dist/planmagnet/roadmaps/planningFocus.d.ts +23 -0
- package/dist/planmagnet/roadmaps/planningFocus.d.ts.map +1 -0
- package/dist/planmagnet/roadmaps/planningFocus.js +76 -0
- package/dist/planmagnet/roadmaps/planningFocus.js.map +1 -0
- package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
- package/dist/planmagnet/sprints/SprintControls.js +48 -29
- package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
- package/dist/planmagnet/sprints/SprintDates.d.ts +37 -0
- package/dist/planmagnet/sprints/SprintDates.d.ts.map +1 -0
- package/dist/planmagnet/sprints/SprintDates.js +114 -0
- package/dist/planmagnet/sprints/SprintDates.js.map +1 -0
- package/dist/planmagnet/utils/email.d.ts +9 -0
- package/dist/planmagnet/utils/email.d.ts.map +1 -0
- package/dist/planmagnet/utils/email.js +15 -0
- package/dist/planmagnet/utils/email.js.map +1 -0
- package/dist/planmagnet/utils/formValidation.d.ts +18 -0
- package/dist/planmagnet/utils/formValidation.d.ts.map +1 -0
- package/dist/planmagnet/utils/formValidation.js +17 -0
- package/dist/planmagnet/utils/formValidation.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
2
|
import { PersonName as n } from "../people/People.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
3
|
+
import { PlanningFocusBadge as r, PlanningFocusSelect as i } from "../roadmaps/planningFocus.js";
|
|
4
|
+
import { useMemo as a, useState as o } from "react";
|
|
5
|
+
import { ArrowLeft as s, Loader2 as c, Package as l, Save as u } from "lucide-react";
|
|
6
|
+
import { useParams as d } from "react-router";
|
|
7
|
+
import { gql as f } from "@apollo/client";
|
|
8
|
+
import { useMutation as p, useQuery as m } from "@apollo/client/react";
|
|
9
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
10
|
+
import { Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, Input as S } from "@burdenoff/fe-libs/ui";
|
|
10
11
|
//#region src/planmagnet/pages/ProductsEditProductPagePage.tsx
|
|
11
|
-
var
|
|
12
|
+
var C = f`
|
|
12
13
|
query GetRoadmapForEdit($id: ID!) {
|
|
13
14
|
planmagnetRoadmap(id: $id) {
|
|
14
15
|
id
|
|
@@ -16,6 +17,7 @@ var x = u`
|
|
|
16
17
|
name
|
|
17
18
|
description
|
|
18
19
|
type
|
|
20
|
+
planningFocus
|
|
19
21
|
isPublic
|
|
20
22
|
ownerId
|
|
21
23
|
createdAt
|
|
@@ -26,233 +28,220 @@ var x = u`
|
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
|
-
`,
|
|
31
|
+
`, w = f`
|
|
30
32
|
mutation UpdateRoadmap($id: ID!, $input: PlanmagnetUpdateRoadmapInput!) {
|
|
31
33
|
planmagnetUpdateRoadmap(id: $id, input: $input) {
|
|
32
34
|
id
|
|
33
35
|
name
|
|
34
36
|
description
|
|
35
37
|
type
|
|
38
|
+
planningFocus
|
|
36
39
|
isPublic
|
|
37
40
|
ownerId
|
|
38
41
|
updatedAt
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
|
-
`,
|
|
44
|
+
`, T = f`
|
|
42
45
|
mutation DeleteRoadmap($id: ID!) {
|
|
43
46
|
planmagnetDeleteRoadmap(id: $id)
|
|
44
47
|
}
|
|
45
48
|
`;
|
|
46
|
-
function
|
|
47
|
-
let { workspaceId:
|
|
48
|
-
variables: { id:
|
|
49
|
-
skip: !
|
|
50
|
-
}), [
|
|
49
|
+
function E() {
|
|
50
|
+
let { workspaceId: f } = e(), E = t(), D = d().id ?? "", { data: O, loading: k, error: A } = m(C, {
|
|
51
|
+
variables: { id: D },
|
|
52
|
+
skip: !D
|
|
53
|
+
}), [j, { loading: M, error: N }] = p(w, { refetchQueries: ["ListRoadmaps", "GetRoadmapForEdit"] }), [P, { loading: F }] = p(T, {
|
|
51
54
|
refetchQueries: ["ListRoadmaps"],
|
|
52
|
-
onCompleted: () =>
|
|
53
|
-
}),
|
|
54
|
-
name:
|
|
55
|
-
description:
|
|
56
|
-
|
|
57
|
-
isPublic:
|
|
58
|
-
}), [
|
|
59
|
-
...
|
|
60
|
-
...
|
|
61
|
-
},
|
|
62
|
-
return
|
|
55
|
+
onCompleted: () => E("/products/products-page")
|
|
56
|
+
}), I = O?.planmagnetRoadmap, L = a(() => ({
|
|
57
|
+
name: I?.name ?? "",
|
|
58
|
+
description: I?.description ?? "",
|
|
59
|
+
planningFocus: I?.planningFocus ?? null,
|
|
60
|
+
isPublic: I?.isPublic ?? !1
|
|
61
|
+
}), [I]), [R, z] = o({}), B = {
|
|
62
|
+
...L,
|
|
63
|
+
...R
|
|
64
|
+
}, V = (e) => z(e);
|
|
65
|
+
return k && !O ? /* @__PURE__ */ h("div", {
|
|
63
66
|
className: "flex items-center justify-center p-12",
|
|
64
|
-
children: /* @__PURE__ */
|
|
65
|
-
}) :
|
|
67
|
+
children: /* @__PURE__ */ h(c, { className: "h-8 w-8 animate-spin text-muted-foreground" })
|
|
68
|
+
}) : A ? /* @__PURE__ */ g("div", {
|
|
66
69
|
className: "p-6 text-destructive",
|
|
67
|
-
children: ["Failed to load product: ",
|
|
68
|
-
}) :
|
|
70
|
+
children: ["Failed to load product: ", A.message]
|
|
71
|
+
}) : I ? /* @__PURE__ */ g("div", {
|
|
69
72
|
className: "space-y-6 p-6",
|
|
70
73
|
children: [
|
|
71
|
-
/* @__PURE__ */
|
|
74
|
+
/* @__PURE__ */ g("div", {
|
|
72
75
|
className: "flex items-center justify-between",
|
|
73
|
-
children: [/* @__PURE__ */
|
|
76
|
+
children: [/* @__PURE__ */ g("div", {
|
|
74
77
|
className: "flex items-center gap-3",
|
|
75
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ h(_, {
|
|
76
79
|
variant: "ghost",
|
|
77
80
|
size: "sm",
|
|
78
|
-
onClick: () =>
|
|
79
|
-
children: /* @__PURE__ */
|
|
80
|
-
}), /* @__PURE__ */
|
|
81
|
+
onClick: () => E("/products/products-page"),
|
|
82
|
+
children: /* @__PURE__ */ h(s, { className: "h-4 w-4" })
|
|
83
|
+
}), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h1", {
|
|
81
84
|
className: "text-2xl font-semibold",
|
|
82
85
|
children: "Edit Product"
|
|
83
|
-
}), /* @__PURE__ */
|
|
86
|
+
}), /* @__PURE__ */ g("p", {
|
|
84
87
|
className: "text-sm text-muted-foreground",
|
|
85
|
-
children: ["Editing ",
|
|
88
|
+
children: ["Editing ", I.name]
|
|
86
89
|
})] })]
|
|
87
|
-
}), /* @__PURE__ */
|
|
90
|
+
}), /* @__PURE__ */ g(_, {
|
|
88
91
|
size: "sm",
|
|
89
92
|
onClick: () => {
|
|
90
|
-
|
|
91
|
-
id:
|
|
93
|
+
j({ variables: {
|
|
94
|
+
id: D,
|
|
92
95
|
input: {
|
|
93
|
-
name:
|
|
94
|
-
description:
|
|
95
|
-
|
|
96
|
-
isPublic:
|
|
96
|
+
name: B.name,
|
|
97
|
+
description: B.description || void 0,
|
|
98
|
+
planningFocus: B.planningFocus,
|
|
99
|
+
isPublic: B.isPublic
|
|
97
100
|
}
|
|
98
101
|
} });
|
|
99
102
|
},
|
|
100
|
-
disabled:
|
|
101
|
-
children: [
|
|
103
|
+
disabled: M,
|
|
104
|
+
children: [M ? /* @__PURE__ */ h(c, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "Save Changes"]
|
|
102
105
|
})]
|
|
103
106
|
}),
|
|
104
|
-
|
|
107
|
+
N && /* @__PURE__ */ g("div", {
|
|
108
|
+
role: "alert",
|
|
105
109
|
className: "p-3 rounded-md bg-destructive/10 text-destructive text-sm",
|
|
106
|
-
children: ["Failed to save: ",
|
|
110
|
+
children: ["Failed to save: ", N.message]
|
|
107
111
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ g("div", {
|
|
109
113
|
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
114
|
+
children: [/* @__PURE__ */ h("div", {
|
|
111
115
|
className: "lg:col-span-2 space-y-6",
|
|
112
|
-
children: /* @__PURE__ */
|
|
116
|
+
children: /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: "Basic Information" }) }), /* @__PURE__ */ g(y, {
|
|
113
117
|
className: "space-y-4",
|
|
114
118
|
children: [
|
|
115
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
116
120
|
className: "text-sm font-medium",
|
|
117
121
|
children: "Product Name"
|
|
118
|
-
}), /* @__PURE__ */
|
|
119
|
-
value:
|
|
120
|
-
onChange: (e) =>
|
|
121
|
-
...
|
|
122
|
+
}), /* @__PURE__ */ h(S, {
|
|
123
|
+
value: B.name,
|
|
124
|
+
onChange: (e) => V({
|
|
125
|
+
...B,
|
|
122
126
|
name: e.target.value
|
|
123
127
|
}),
|
|
124
128
|
className: "mt-1"
|
|
125
129
|
})] }),
|
|
126
|
-
/* @__PURE__ */
|
|
130
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
127
131
|
className: "text-sm font-medium",
|
|
128
132
|
children: "Description"
|
|
129
|
-
}), /* @__PURE__ */
|
|
133
|
+
}), /* @__PURE__ */ h("textarea", {
|
|
130
134
|
className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]",
|
|
131
|
-
value:
|
|
132
|
-
onChange: (e) =>
|
|
133
|
-
...
|
|
135
|
+
value: B.description,
|
|
136
|
+
onChange: (e) => V({
|
|
137
|
+
...B,
|
|
134
138
|
description: e.target.value
|
|
135
139
|
})
|
|
136
140
|
})] }),
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
"SWIMLANE",
|
|
146
|
-
"CUSTOM"
|
|
147
|
-
].map((e) => /* @__PURE__ */ p("button", {
|
|
148
|
-
onClick: () => z({
|
|
149
|
-
...R,
|
|
150
|
-
type: e
|
|
151
|
-
}),
|
|
152
|
-
className: `rounded-md px-3 py-1.5 text-sm capitalize ${R.type === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
|
|
153
|
-
children: e.toLowerCase()
|
|
154
|
-
}, e))
|
|
155
|
-
})] }),
|
|
156
|
-
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
|
|
141
|
+
/* @__PURE__ */ h(i, {
|
|
142
|
+
value: B.planningFocus,
|
|
143
|
+
onChange: (e) => V({
|
|
144
|
+
...B,
|
|
145
|
+
planningFocus: e
|
|
146
|
+
})
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
157
149
|
className: "text-sm font-medium",
|
|
158
150
|
children: "Visibility"
|
|
159
|
-
}), /* @__PURE__ */
|
|
151
|
+
}), /* @__PURE__ */ h("div", {
|
|
160
152
|
className: "mt-1 flex gap-2",
|
|
161
|
-
children: [!1, !0].map((e) => /* @__PURE__ */
|
|
162
|
-
onClick: () =>
|
|
163
|
-
...
|
|
153
|
+
children: [!1, !0].map((e) => /* @__PURE__ */ h("button", {
|
|
154
|
+
onClick: () => V({
|
|
155
|
+
...B,
|
|
164
156
|
isPublic: e
|
|
165
157
|
}),
|
|
166
|
-
className: `rounded-md px-3 py-1.5 text-sm ${
|
|
158
|
+
className: `rounded-md px-3 py-1.5 text-sm ${B.isPublic === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
|
|
167
159
|
children: e ? "Public" : "Private"
|
|
168
160
|
}, String(e)))
|
|
169
161
|
})] })
|
|
170
162
|
]
|
|
171
163
|
})] })
|
|
172
|
-
}), /* @__PURE__ */
|
|
164
|
+
}), /* @__PURE__ */ g("div", {
|
|
173
165
|
className: "space-y-6",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
166
|
+
children: [/* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: "Product Info" }) }), /* @__PURE__ */ g(y, {
|
|
175
167
|
className: "space-y-3 text-sm",
|
|
176
168
|
children: [
|
|
177
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ g("div", {
|
|
178
170
|
className: "flex items-center gap-2",
|
|
179
|
-
children: [/* @__PURE__ */
|
|
171
|
+
children: [/* @__PURE__ */ h(l, { className: "h-4 w-4 text-primary" }), /* @__PURE__ */ h("span", {
|
|
180
172
|
className: "font-medium",
|
|
181
|
-
children:
|
|
173
|
+
children: I.name
|
|
182
174
|
})]
|
|
183
175
|
}),
|
|
184
|
-
/* @__PURE__ */
|
|
176
|
+
/* @__PURE__ */ g("div", {
|
|
185
177
|
className: "flex justify-between",
|
|
186
|
-
children: [/* @__PURE__ */
|
|
178
|
+
children: [/* @__PURE__ */ h("span", {
|
|
187
179
|
className: "text-muted-foreground",
|
|
188
180
|
children: "Items"
|
|
189
|
-
}), /* @__PURE__ */
|
|
181
|
+
}), /* @__PURE__ */ h("span", {
|
|
190
182
|
className: "font-medium",
|
|
191
|
-
children:
|
|
183
|
+
children: I.items?.length ?? 0
|
|
192
184
|
})]
|
|
193
185
|
}),
|
|
194
|
-
/* @__PURE__ */
|
|
186
|
+
/* @__PURE__ */ g("div", {
|
|
195
187
|
className: "flex justify-between",
|
|
196
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ h("span", {
|
|
197
189
|
className: "text-muted-foreground",
|
|
198
|
-
children: "
|
|
199
|
-
}), /* @__PURE__ */
|
|
200
|
-
className: "font-medium capitalize",
|
|
201
|
-
children: P.type.toLowerCase()
|
|
202
|
-
})]
|
|
190
|
+
children: "Planning focus"
|
|
191
|
+
}), /* @__PURE__ */ h(r, { focus: I.planningFocus })]
|
|
203
192
|
}),
|
|
204
|
-
/* @__PURE__ */
|
|
193
|
+
/* @__PURE__ */ g("div", {
|
|
205
194
|
className: "flex justify-between",
|
|
206
|
-
children: [/* @__PURE__ */
|
|
195
|
+
children: [/* @__PURE__ */ h("span", {
|
|
207
196
|
className: "text-muted-foreground",
|
|
208
197
|
children: "Visibility"
|
|
209
|
-
}), /* @__PURE__ */
|
|
198
|
+
}), /* @__PURE__ */ h("span", {
|
|
210
199
|
className: "font-medium",
|
|
211
|
-
children:
|
|
200
|
+
children: I.isPublic ? "Public" : "Private"
|
|
212
201
|
})]
|
|
213
202
|
}),
|
|
214
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ g("div", {
|
|
215
204
|
className: "flex justify-between",
|
|
216
|
-
children: [/* @__PURE__ */
|
|
205
|
+
children: [/* @__PURE__ */ h("span", {
|
|
217
206
|
className: "text-muted-foreground",
|
|
218
207
|
children: "Owner"
|
|
219
|
-
}), /* @__PURE__ */
|
|
208
|
+
}), /* @__PURE__ */ h("span", {
|
|
220
209
|
className: "font-medium",
|
|
221
|
-
children: /* @__PURE__ */
|
|
210
|
+
children: /* @__PURE__ */ h(n, { id: I.ownerId })
|
|
222
211
|
})]
|
|
223
212
|
}),
|
|
224
|
-
/* @__PURE__ */
|
|
213
|
+
/* @__PURE__ */ g("div", {
|
|
225
214
|
className: "flex justify-between",
|
|
226
|
-
children: [/* @__PURE__ */
|
|
215
|
+
children: [/* @__PURE__ */ h("span", {
|
|
227
216
|
className: "text-muted-foreground",
|
|
228
217
|
children: "Created"
|
|
229
|
-
}), /* @__PURE__ */
|
|
218
|
+
}), /* @__PURE__ */ h("span", { children: new Date(I.createdAt).toLocaleDateString() })]
|
|
230
219
|
}),
|
|
231
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ g("div", {
|
|
232
221
|
className: "flex justify-between",
|
|
233
|
-
children: [/* @__PURE__ */
|
|
222
|
+
children: [/* @__PURE__ */ h("span", {
|
|
234
223
|
className: "text-muted-foreground",
|
|
235
224
|
children: "Updated"
|
|
236
|
-
}), /* @__PURE__ */
|
|
225
|
+
}), /* @__PURE__ */ h("span", { children: new Date(I.updatedAt).toLocaleDateString() })]
|
|
237
226
|
})
|
|
238
227
|
]
|
|
239
|
-
})] }), /* @__PURE__ */
|
|
228
|
+
})] }), /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: "Danger Zone" }) }), /* @__PURE__ */ h(y, { children: /* @__PURE__ */ h(_, {
|
|
240
229
|
variant: "destructive",
|
|
241
230
|
size: "sm",
|
|
242
231
|
className: "w-full",
|
|
243
|
-
disabled:
|
|
244
|
-
onClick: () =>
|
|
245
|
-
children:
|
|
232
|
+
disabled: F,
|
|
233
|
+
onClick: () => P({ variables: { id: D } }),
|
|
234
|
+
children: F ? "Archiving..." : "Archive Product"
|
|
246
235
|
}) })] })]
|
|
247
236
|
})]
|
|
248
237
|
})
|
|
249
238
|
]
|
|
250
|
-
}) : /* @__PURE__ */
|
|
239
|
+
}) : /* @__PURE__ */ h("div", {
|
|
251
240
|
className: "p-6 text-muted-foreground",
|
|
252
241
|
children: "No product found."
|
|
253
242
|
});
|
|
254
243
|
}
|
|
255
244
|
//#endregion
|
|
256
|
-
export {
|
|
245
|
+
export { E as ProductsEditProductPagePage };
|
|
257
246
|
|
|
258
247
|
//# sourceMappingURL=ProductsEditProductPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductsEditProductPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsEditProductPagePage.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 {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Button,\n Input,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport { Save, ArrowLeft, Package, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapForEdit($id: ID!) {\n planmagnetRoadmap(id: $id) {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n createdAt\n updatedAt\n items {\n id\n status\n }\n }\n }\n`;\n\nconst UPDATE_ROADMAP = gql`\n mutation UpdateRoadmap($id: ID!, $input: PlanmagnetUpdateRoadmapInput!) {\n planmagnetUpdateRoadmap(id: $id, input: $input) {\n id\n name\n description\n type\n isPublic\n ownerId\n updatedAt\n }\n }\n`;\n\nconst DELETE_ROADMAP = gql`\n mutation DeleteRoadmap($id: ID!) {\n planmagnetDeleteRoadmap(id: $id)\n }\n`;\n\nexport function ProductsEditProductPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const params = useParams<{ id: string }>();\n const roadmapId = 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_ROADMAP, {\n variables: { id: roadmapId },\n skip: !roadmapId,\n });\n\n const [updateRoadmap, { loading: saving, error: saveError }] = useMutation(UPDATE_ROADMAP, {\n refetchQueries: ['ListRoadmaps', 'GetRoadmapForEdit'],\n });\n\n const [deleteRoadmap, { loading: deleting }] = useMutation(DELETE_ROADMAP, {\n refetchQueries: ['ListRoadmaps'],\n onCompleted: () => navigate('/products/products-page'),\n });\n\n const roadmap = data?.planmagnetRoadmap;\n\n const defaultForm = useMemo(\n () => ({\n name: roadmap?.name ?? '',\n description: roadmap?.description ?? '',\n type: roadmap?.type ?? 'TIMELINE',\n isPublic: roadmap?.isPublic ?? false,\n }),\n [roadmap]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [formOverrides, setFormOverrides] = useState<Record<string, any>>({});\n const form = { ...defaultForm, ...formOverrides } as {\n name: string;\n description: string;\n type: string;\n isPublic: boolean;\n };\n const setForm = (val: typeof form) => setFormOverrides(val);\n\n const typeOptions = ['TIMELINE', 'GANTT', 'SWIMLANE', 'CUSTOM'] as const;\n\n const handleSave = () => {\n updateRoadmap({\n variables: {\n id: roadmapId,\n input: {\n name: form.name,\n description: form.description || undefined,\n type: form.type,\n isPublic: form.isPublic,\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 product: {error.message}</div>;\n }\n\n if (!roadmap) {\n return <div className=\"p-6 text-muted-foreground\">No product found.</div>;\n }\n\n return (\n <div className=\"space-y-6 p-6\">\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/products-page')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Product</h1>\n <p className=\"text-sm text-muted-foreground\">Editing {roadmap.name}</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 <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Product 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 <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-[80px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Type</label>\n <div className=\"mt-1 flex gap-2\">\n {typeOptions.map((t) => (\n <button\n key={t}\n onClick={() => setForm({ ...form, type: t })}\n className={`rounded-md px-3 py-1.5 text-sm capitalize ${form.type === t ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {t.toLowerCase()}\n </button>\n ))}\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Visibility</label>\n <div className=\"mt-1 flex gap-2\">\n {[false, true].map((pub) => (\n <button\n key={String(pub)}\n onClick={() => setForm({ ...form, isPublic: pub })}\n className={`rounded-md px-3 py-1.5 text-sm ${form.isPublic === pub ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {pub ? 'Public' : 'Private'}\n </button>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Product Info</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Package className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{roadmap.name}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Items</span>\n <span className=\"font-medium\">{roadmap.items?.length ?? 0}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <span className=\"font-medium capitalize\">{roadmap.type.toLowerCase()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Visibility</span>\n <span className=\"font-medium\">{roadmap.isPublic ? 'Public' : 'Private'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span className=\"font-medium\">\n <PersonName id={roadmap.ownerId} />\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(roadmap.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(roadmap.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Danger Zone</CardTitle>\n </CardHeader>\n <CardContent>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"w-full\"\n disabled={deleting}\n onClick={() => deleteRoadmap({ variables: { id: roadmapId } })}\n >\n {deleting ? 'Archiving...' : 'Archive Product'}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProductsEditProductPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsEditProductPagePage.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 {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Button,\n Input,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport { Save, ArrowLeft, Package, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\nimport {\n PlanningFocusBadge,\n PlanningFocusSelect,\n type PlanningFocus,\n} from '../roadmaps/planningFocus';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapForEdit($id: ID!) {\n planmagnetRoadmap(id: $id) {\n id\n workspaceId\n name\n description\n type\n planningFocus\n isPublic\n ownerId\n createdAt\n updatedAt\n items {\n id\n status\n }\n }\n }\n`;\n\nconst UPDATE_ROADMAP = gql`\n mutation UpdateRoadmap($id: ID!, $input: PlanmagnetUpdateRoadmapInput!) {\n planmagnetUpdateRoadmap(id: $id, input: $input) {\n id\n name\n description\n type\n planningFocus\n isPublic\n ownerId\n updatedAt\n }\n }\n`;\n\nconst DELETE_ROADMAP = gql`\n mutation DeleteRoadmap($id: ID!) {\n planmagnetDeleteRoadmap(id: $id)\n }\n`;\n\nexport function ProductsEditProductPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const params = useParams<{ id: string }>();\n const roadmapId = 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_ROADMAP, {\n variables: { id: roadmapId },\n skip: !roadmapId,\n });\n\n const [updateRoadmap, { loading: saving, error: saveError }] = useMutation(UPDATE_ROADMAP, {\n refetchQueries: ['ListRoadmaps', 'GetRoadmapForEdit'],\n });\n\n const [deleteRoadmap, { loading: deleting }] = useMutation(DELETE_ROADMAP, {\n refetchQueries: ['ListRoadmaps'],\n onCompleted: () => navigate('/products/products-page'),\n });\n\n const roadmap = data?.planmagnetRoadmap;\n\n const defaultForm = useMemo(\n () => ({\n name: roadmap?.name ?? '',\n description: roadmap?.description ?? '',\n planningFocus: (roadmap?.planningFocus ?? null) as PlanningFocus | null,\n isPublic: roadmap?.isPublic ?? false,\n }),\n [roadmap]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [formOverrides, setFormOverrides] = useState<Record<string, any>>({});\n const form = { ...defaultForm, ...formOverrides } as {\n name: string;\n description: string;\n planningFocus: PlanningFocus | null;\n isPublic: boolean;\n };\n const setForm = (val: typeof form) => setFormOverrides(val);\n\n const handleSave = () => {\n updateRoadmap({\n variables: {\n id: roadmapId,\n input: {\n name: form.name,\n description: form.description || undefined,\n // The display is not editable: the page has one layout (BOFF-7934).\n // null clears a focus that was set by mistake.\n planningFocus: form.planningFocus,\n isPublic: form.isPublic,\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 product: {error.message}</div>;\n }\n\n if (!roadmap) {\n return <div className=\"p-6 text-muted-foreground\">No product found.</div>;\n }\n\n return (\n <div className=\"space-y-6 p-6\">\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/products-page')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Product</h1>\n <p className=\"text-sm text-muted-foreground\">Editing {roadmap.name}</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 role=\"alert\" className=\"p-3 rounded-md bg-destructive/10 text-destructive text-sm\">\n Failed to save: {saveError.message}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Product 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 <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-[80px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <PlanningFocusSelect\n value={form.planningFocus}\n onChange={(planningFocus) => setForm({ ...form, planningFocus })}\n />\n <div>\n <label className=\"text-sm font-medium\">Visibility</label>\n <div className=\"mt-1 flex gap-2\">\n {[false, true].map((pub) => (\n <button\n key={String(pub)}\n onClick={() => setForm({ ...form, isPublic: pub })}\n className={`rounded-md px-3 py-1.5 text-sm ${form.isPublic === pub ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {pub ? 'Public' : 'Private'}\n </button>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Product Info</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Package className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{roadmap.name}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Items</span>\n <span className=\"font-medium\">{roadmap.items?.length ?? 0}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Planning focus</span>\n <PlanningFocusBadge focus={roadmap.planningFocus} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Visibility</span>\n <span className=\"font-medium\">{roadmap.isPublic ? 'Public' : 'Private'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span className=\"font-medium\">\n <PersonName id={roadmap.ownerId} />\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(roadmap.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(roadmap.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Danger Zone</CardTitle>\n </CardHeader>\n <CardContent>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"w-full\"\n disabled={deleting}\n onClick={() => deleteRoadmap({ variables: { id: roadmapId } })}\n >\n {deleting ? 'Archiving...' : 'Archive Product'}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductsNewFeaturePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsNewFeaturePagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProductsNewFeaturePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsNewFeaturePagePage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,0BAA0B,4CA0NzC"}
|