@burdenoff/microfe-planmagnet 2026.926.1 → 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/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/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/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/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/ProjectsPlanningEditPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +133 -107
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.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/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/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,12 +1,14 @@
|
|
|
1
|
-
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { throwOnError as n } from "../utils/mutationResult.js";
|
|
3
|
+
import { endBeforeStart as r } from "../utils/formValidation.js";
|
|
4
|
+
import { useState as i } from "react";
|
|
5
|
+
import { FolderKanban as a, Save as o, X as s } from "lucide-react";
|
|
6
|
+
import { gql as c } from "@apollo/client";
|
|
7
|
+
import { useMutation as l } from "@apollo/client/react";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
import { Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, Input as _ } from "@burdenoff/fe-libs/ui";
|
|
8
10
|
//#region src/planmagnet/pages/ProjectsCreateProjectPagePage.tsx
|
|
9
|
-
var
|
|
11
|
+
var v = c`
|
|
10
12
|
mutation CreateProject($input: PlanmagnetCreateProjectInput!) {
|
|
11
13
|
planmagnetCreateProject(input: $input) {
|
|
12
14
|
id
|
|
@@ -23,131 +25,137 @@ var h = a`
|
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
`;
|
|
26
|
-
function
|
|
27
|
-
let { workspaceId:
|
|
28
|
+
function y() {
|
|
29
|
+
let { workspaceId: c, currentUser: y } = e(), [b, x] = i({
|
|
28
30
|
name: "",
|
|
29
31
|
key: "",
|
|
30
32
|
description: "",
|
|
31
33
|
methodology: "SCRUM",
|
|
32
34
|
startDate: "",
|
|
33
35
|
endDate: ""
|
|
34
|
-
}), [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
onCompleted: (e) => {
|
|
41
|
-
b(`Project "${e.createProject.name}" created successfully.`), v({
|
|
42
|
-
name: "",
|
|
43
|
-
key: "",
|
|
44
|
-
description: "",
|
|
45
|
-
methodology: "SCRUM",
|
|
46
|
-
startDate: "",
|
|
47
|
-
endDate: ""
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
return /* @__PURE__ */ c("div", {
|
|
36
|
+
}), [S, C] = i(null), w = t(), [T, E] = i(null), [D, { loading: O }] = l(v, { refetchQueries: [
|
|
37
|
+
"GetProjects",
|
|
38
|
+
"GetActiveProjects",
|
|
39
|
+
"GetDashboardData"
|
|
40
|
+
] }), k = r(b.startDate, b.endDate);
|
|
41
|
+
return /* @__PURE__ */ d("div", {
|
|
52
42
|
className: "space-y-6 p-6 max-w-4xl",
|
|
53
43
|
children: [
|
|
54
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ d("div", {
|
|
55
45
|
className: "flex items-center justify-between",
|
|
56
|
-
children: [/* @__PURE__ */
|
|
46
|
+
children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
|
|
57
47
|
className: "text-2xl font-semibold",
|
|
58
48
|
children: "Create Project"
|
|
59
|
-
}), /* @__PURE__ */
|
|
49
|
+
}), /* @__PURE__ */ u("p", {
|
|
60
50
|
className: "text-sm text-muted-foreground",
|
|
61
51
|
children: "Set up a new project with timeline and budget."
|
|
62
|
-
})] }), /* @__PURE__ */
|
|
52
|
+
})] }), /* @__PURE__ */ d("div", {
|
|
63
53
|
className: "flex gap-2",
|
|
64
|
-
children: [/* @__PURE__ */
|
|
54
|
+
children: [/* @__PURE__ */ d(f, {
|
|
65
55
|
variant: "outline",
|
|
66
56
|
size: "sm",
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
onClick: () => w("/projects/projects-page"),
|
|
58
|
+
children: [/* @__PURE__ */ u(s, { className: "mr-1 h-4 w-4" }), "Cancel"]
|
|
59
|
+
}), /* @__PURE__ */ d(f, {
|
|
69
60
|
size: "sm",
|
|
70
|
-
onClick: () => {
|
|
71
|
-
!
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
61
|
+
onClick: async () => {
|
|
62
|
+
if (!(!b.name || !b.key || k)) {
|
|
63
|
+
E(null), C(null);
|
|
64
|
+
try {
|
|
65
|
+
let e = (await n(D({ variables: { input: {
|
|
66
|
+
name: b.name,
|
|
67
|
+
key: b.key,
|
|
68
|
+
description: b.description || void 0,
|
|
69
|
+
methodology: b.methodology,
|
|
70
|
+
ownerId: y?.id ?? "unknown",
|
|
71
|
+
startDate: b.startDate || void 0,
|
|
72
|
+
endDate: b.endDate || void 0
|
|
73
|
+
} } }))).data?.planmagnetCreateProject;
|
|
74
|
+
C(`Project "${e?.name ?? b.name}" created successfully.`), x({
|
|
75
|
+
name: "",
|
|
76
|
+
key: "",
|
|
77
|
+
description: "",
|
|
78
|
+
methodology: "SCRUM",
|
|
79
|
+
startDate: "",
|
|
80
|
+
endDate: ""
|
|
81
|
+
});
|
|
82
|
+
} catch (e) {
|
|
83
|
+
E(e instanceof Error ? e.message : "The project could not be created.");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
80
86
|
},
|
|
81
|
-
disabled:
|
|
82
|
-
children: [/* @__PURE__ */
|
|
87
|
+
disabled: O || !b.name || !b.key || k,
|
|
88
|
+
children: [/* @__PURE__ */ u(o, { className: "mr-1 h-4 w-4" }), O ? "Creating..." : "Create Project"]
|
|
83
89
|
})]
|
|
84
90
|
})]
|
|
85
91
|
}),
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
S && /* @__PURE__ */ u("div", {
|
|
93
|
+
role: "status",
|
|
94
|
+
className: "p-3 bg-muted text-status-success-text rounded-md text-sm",
|
|
95
|
+
children: S
|
|
89
96
|
}),
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
97
|
+
T && /* @__PURE__ */ u("div", {
|
|
98
|
+
role: "alert",
|
|
99
|
+
className: "p-3 bg-destructive/10 text-destructive rounded-md text-sm",
|
|
100
|
+
children: T
|
|
93
101
|
}),
|
|
94
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, {
|
|
95
103
|
className: "flex items-center gap-2",
|
|
96
|
-
children: [/* @__PURE__ */
|
|
97
|
-
}) }), /* @__PURE__ */
|
|
104
|
+
children: [/* @__PURE__ */ u(a, { className: "h-4 w-4" }), "Project Details"]
|
|
105
|
+
}) }), /* @__PURE__ */ d(m, {
|
|
98
106
|
className: "space-y-4",
|
|
99
107
|
children: [
|
|
100
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
|
|
101
109
|
className: "text-sm font-medium",
|
|
102
110
|
children: "Project Name"
|
|
103
|
-
}), /* @__PURE__ */
|
|
104
|
-
value:
|
|
105
|
-
onChange: (e) =>
|
|
106
|
-
...
|
|
111
|
+
}), /* @__PURE__ */ u(_, {
|
|
112
|
+
value: b.name,
|
|
113
|
+
onChange: (e) => x({
|
|
114
|
+
...b,
|
|
107
115
|
name: e.target.value
|
|
108
116
|
}),
|
|
109
117
|
className: "mt-1",
|
|
110
118
|
placeholder: "e.g. Search Overhaul"
|
|
111
119
|
})] }),
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ d("div", { children: [
|
|
121
|
+
/* @__PURE__ */ u("label", {
|
|
114
122
|
className: "text-sm font-medium",
|
|
115
123
|
children: "Project Key"
|
|
116
124
|
}),
|
|
117
|
-
/* @__PURE__ */
|
|
118
|
-
value:
|
|
119
|
-
onChange: (e) =>
|
|
120
|
-
...
|
|
125
|
+
/* @__PURE__ */ u(_, {
|
|
126
|
+
value: b.key,
|
|
127
|
+
onChange: (e) => x({
|
|
128
|
+
...b,
|
|
121
129
|
key: e.target.value.toUpperCase()
|
|
122
130
|
}),
|
|
123
131
|
className: "mt-1",
|
|
124
132
|
placeholder: "e.g. SRCH"
|
|
125
133
|
}),
|
|
126
|
-
/* @__PURE__ */
|
|
134
|
+
/* @__PURE__ */ u("p", {
|
|
127
135
|
className: "text-xs text-muted-foreground mt-1",
|
|
128
136
|
children: "Used as prefix for work item IDs (e.g. SRCH-123)"
|
|
129
137
|
})
|
|
130
138
|
] }),
|
|
131
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
|
|
132
140
|
className: "text-sm font-medium",
|
|
133
141
|
children: "Description"
|
|
134
|
-
}), /* @__PURE__ */
|
|
142
|
+
}), /* @__PURE__ */ u("textarea", {
|
|
135
143
|
className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]",
|
|
136
|
-
value:
|
|
137
|
-
onChange: (e) =>
|
|
138
|
-
...
|
|
144
|
+
value: b.description,
|
|
145
|
+
onChange: (e) => x({
|
|
146
|
+
...b,
|
|
139
147
|
description: e.target.value
|
|
140
148
|
}),
|
|
141
149
|
placeholder: "Describe the project goals..."
|
|
142
150
|
})] }),
|
|
143
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
|
|
144
152
|
className: "text-sm font-medium",
|
|
145
153
|
children: "Methodology"
|
|
146
|
-
}), /* @__PURE__ */
|
|
154
|
+
}), /* @__PURE__ */ u("select", {
|
|
147
155
|
className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm capitalize",
|
|
148
|
-
value:
|
|
149
|
-
onChange: (e) =>
|
|
150
|
-
...
|
|
156
|
+
value: b.methodology,
|
|
157
|
+
onChange: (e) => x({
|
|
158
|
+
...b,
|
|
151
159
|
methodology: e.target.value
|
|
152
160
|
}),
|
|
153
161
|
children: [
|
|
@@ -157,36 +165,48 @@ function g() {
|
|
|
157
165
|
"HYBRID",
|
|
158
166
|
"AGILE",
|
|
159
167
|
"CUSTOM"
|
|
160
|
-
].map((e) => /* @__PURE__ */
|
|
168
|
+
].map((e) => /* @__PURE__ */ u("option", {
|
|
161
169
|
value: e,
|
|
162
170
|
children: e.toLowerCase()
|
|
163
171
|
}, e))
|
|
164
172
|
})] }),
|
|
165
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ d("div", {
|
|
166
174
|
className: "grid grid-cols-2 gap-4",
|
|
167
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
|
|
176
|
+
htmlFor: "project-start",
|
|
168
177
|
className: "text-sm font-medium",
|
|
169
178
|
children: "Start Date"
|
|
170
|
-
}), /* @__PURE__ */
|
|
179
|
+
}), /* @__PURE__ */ u(_, {
|
|
180
|
+
id: "project-start",
|
|
171
181
|
type: "date",
|
|
172
|
-
value:
|
|
173
|
-
|
|
174
|
-
|
|
182
|
+
value: b.startDate,
|
|
183
|
+
max: b.endDate || void 0,
|
|
184
|
+
onChange: (e) => x({
|
|
185
|
+
...b,
|
|
175
186
|
startDate: e.target.value
|
|
176
187
|
}),
|
|
177
188
|
className: "mt-1"
|
|
178
|
-
})] }), /* @__PURE__ */
|
|
189
|
+
})] }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
|
|
190
|
+
htmlFor: "project-end",
|
|
179
191
|
className: "text-sm font-medium",
|
|
180
192
|
children: "End Date"
|
|
181
|
-
}), /* @__PURE__ */
|
|
193
|
+
}), /* @__PURE__ */ u(_, {
|
|
194
|
+
id: "project-end",
|
|
182
195
|
type: "date",
|
|
183
|
-
value:
|
|
184
|
-
|
|
185
|
-
|
|
196
|
+
value: b.endDate,
|
|
197
|
+
min: b.startDate || void 0,
|
|
198
|
+
onChange: (e) => x({
|
|
199
|
+
...b,
|
|
186
200
|
endDate: e.target.value
|
|
187
201
|
}),
|
|
202
|
+
"aria-invalid": k,
|
|
188
203
|
className: "mt-1"
|
|
189
204
|
})] })]
|
|
205
|
+
}),
|
|
206
|
+
k && /* @__PURE__ */ u("p", {
|
|
207
|
+
role: "alert",
|
|
208
|
+
className: "text-sm text-destructive",
|
|
209
|
+
children: "The end date is before the start date."
|
|
190
210
|
})
|
|
191
211
|
]
|
|
192
212
|
})] })
|
|
@@ -194,6 +214,6 @@ function g() {
|
|
|
194
214
|
});
|
|
195
215
|
}
|
|
196
216
|
//#endregion
|
|
197
|
-
export {
|
|
217
|
+
export { y as ProjectsCreateProjectPagePage };
|
|
198
218
|
|
|
199
219
|
//# sourceMappingURL=ProjectsCreateProjectPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsCreateProjectPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsCreateProjectPagePage.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 } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, FolderKanban } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst CREATE_PROJECT = gql`\n mutation CreateProject($input: PlanmagnetCreateProjectInput!) {\n planmagnetCreateProject(input: $input) {\n id\n name\n key\n description\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n }\n }\n`;\n\nexport function ProjectsCreateProjectPagePage() {\n const { workspaceId, currentUser } = usePlanMagnet();\n\n const [form, setForm] = useState({\n name: '',\n key: '',\n description: '',\n methodology: 'SCRUM',\n startDate: '',\n endDate: '',\n });\n\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const [createProject, { loading: saving, error: saveError }] = useMutation(CREATE_PROJECT, {\n refetchQueries: ['GetProjects', 'GetActiveProjects', 'GetDashboardData'],\n onCompleted: (data) => {\n setSuccessMessage(\n `Project \"${(data as { createProject: { name: string } }).createProject.name}\" created successfully.`\n );\n setForm({\n name: '',\n key: '',\n description: '',\n methodology: 'SCRUM',\n startDate: '',\n endDate: '',\n });\n },\n });\n\n const methodologies = ['SCRUM', 'KANBAN', 'WATERFALL', 'HYBRID', 'AGILE', 'CUSTOM'] as const;\n\n const handleCreate = () => {\n if (!form.name || !form.key) return;\n createProject({\n variables: {\n input: {\n name: form.name,\n key: form.key,\n description: form.description || undefined,\n methodology: form.methodology,\n ownerId: currentUser?.id ?? 'unknown',\n startDate: form.startDate || undefined,\n endDate: form.endDate || undefined,\n },\n },\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 Project</h1>\n <p className=\"text-sm text-muted-foreground\">\n Set up a new project with timeline and budget.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleCreate} disabled={saving || !form.name || !form.key}>\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Creating...' : 'Create Project'}\n </Button>\n </div>\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 className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4\" />\n Project Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Project Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. Search Overhaul\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Project Key</label>\n <Input\n value={form.key}\n onChange={(e) => setForm({ ...form, key: e.target.value.toUpperCase() })}\n className=\"mt-1\"\n placeholder=\"e.g. SRCH\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n Used as prefix for work item IDs (e.g. SRCH-123)\n </p>\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 placeholder=\"Describe the project goals...\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Methodology</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm capitalize\"\n value={form.methodology}\n onChange={(e) => setForm({ ...form, methodology: e.target.value })}\n >\n {methodologies.map((m) => (\n <option key={m} value={m}>\n {m.toLowerCase()}\n </option>\n ))}\n </select>\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 </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectsCreateProjectPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsCreateProjectPagePage.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 } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, FolderKanban } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError } from '../utils/mutationResult';\nimport { endBeforeStart } from '../utils/formValidation';\n\nconst CREATE_PROJECT = gql`\n mutation CreateProject($input: PlanmagnetCreateProjectInput!) {\n planmagnetCreateProject(input: $input) {\n id\n name\n key\n description\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n }\n }\n`;\n\nexport function ProjectsCreateProjectPagePage() {\n const { workspaceId, currentUser } = usePlanMagnet();\n\n const [form, setForm] = useState({\n name: '',\n key: '',\n description: '',\n methodology: 'SCRUM',\n startDate: '',\n endDate: '',\n });\n\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const navigate = usePlanMagnetNavigate();\n const [saveError, setSaveError] = useState<string | null>(null);\n // Success is reported only after the service accepted the project. The old onCompleted read\n // `data.createProject`, but the field is planmagnetCreateProject, so every successful create threw\n // before the message could show; and with errorPolicy 'all' a refused create resolved without error.\n const [createProject, { loading: saving }] = useMutation(CREATE_PROJECT, {\n refetchQueries: ['GetProjects', 'GetActiveProjects', 'GetDashboardData'],\n });\n const invalidDates = endBeforeStart(form.startDate, form.endDate);\n\n const methodologies = ['SCRUM', 'KANBAN', 'WATERFALL', 'HYBRID', 'AGILE', 'CUSTOM'] as const;\n\n const handleCreate = async () => {\n if (!form.name || !form.key || invalidDates) return;\n setSaveError(null);\n setSuccessMessage(null);\n try {\n const result = await throwOnError(\n createProject({\n variables: {\n input: {\n name: form.name,\n key: form.key,\n description: form.description || undefined,\n methodology: form.methodology,\n ownerId: currentUser?.id ?? 'unknown',\n startDate: form.startDate || undefined,\n endDate: form.endDate || undefined,\n },\n },\n })\n );\n const created = (result.data as { planmagnetCreateProject?: { name: string } } | undefined)\n ?.planmagnetCreateProject;\n setSuccessMessage(`Project \"${created?.name ?? form.name}\" created successfully.`);\n setForm({\n name: '',\n key: '',\n description: '',\n methodology: 'SCRUM',\n startDate: '',\n endDate: '',\n });\n } catch (e) {\n setSaveError(e instanceof Error ? e.message : 'The project 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 Project</h1>\n <p className=\"text-sm text-muted-foreground\">\n Set up a new project with timeline and budget.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/projects/projects-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.name || !form.key || invalidDates}\n >\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Creating...' : 'Create Project'}\n </Button>\n </div>\n </div>\n\n {successMessage && (\n <div role=\"status\" className=\"p-3 bg-muted text-status-success-text rounded-md text-sm\">\n {successMessage}\n </div>\n )}\n {saveError && (\n <div role=\"alert\" className=\"p-3 bg-destructive/10 text-destructive rounded-md text-sm\">\n {saveError}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4\" />\n Project Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Project Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. Search Overhaul\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Project Key</label>\n <Input\n value={form.key}\n onChange={(e) => setForm({ ...form, key: e.target.value.toUpperCase() })}\n className=\"mt-1\"\n placeholder=\"e.g. SRCH\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n Used as prefix for work item IDs (e.g. SRCH-123)\n </p>\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 placeholder=\"Describe the project goals...\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Methodology</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm capitalize\"\n value={form.methodology}\n onChange={(e) => setForm({ ...form, methodology: e.target.value })}\n >\n {methodologies.map((m) => (\n <option key={m} value={m}>\n {m.toLowerCase()}\n </option>\n ))}\n </select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"project-start\" className=\"text-sm font-medium\">\n Start Date\n </label>\n <Input\n id=\"project-start\"\n type=\"date\"\n value={form.startDate}\n max={form.endDate || undefined}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label htmlFor=\"project-end\" className=\"text-sm font-medium\">\n End Date\n </label>\n <Input\n id=\"project-end\"\n type=\"date\"\n value={form.endDate}\n min={form.startDate || undefined}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n aria-invalid={invalidDates}\n className=\"mt-1\"\n />\n </div>\n </div>\n {invalidDates && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n The end date is before the start date.\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsEditProjectPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsEditProjectPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProjectsEditProjectPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsEditProjectPagePage.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,2BAA2B,4CA+L1C"}
|