@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.
Files changed (49) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +90 -79
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoutes.js +124 -127
  6. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  7. package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
  8. package/dist/planmagnet/create/CreateDialogs.js +149 -124
  9. package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
  10. package/dist/planmagnet/pages/NotFoundPage.d.ts +6 -0
  11. package/dist/planmagnet/pages/NotFoundPage.d.ts.map +1 -0
  12. package/dist/planmagnet/pages/NotFoundPage.js +18 -0
  13. package/dist/planmagnet/pages/NotFoundPage.js.map +1 -0
  14. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  15. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +103 -87
  16. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  17. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -1
  18. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +111 -91
  19. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  20. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  21. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +117 -97
  22. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  23. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
  24. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +133 -107
  25. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
  26. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
  27. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +161 -115
  28. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  29. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  30. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +117 -102
  31. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  32. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -1
  33. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +147 -147
  34. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -1
  35. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  36. package/dist/planmagnet/pages/TeamTeamPagePage.js +77 -67
  37. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  38. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  39. package/dist/planmagnet/sprints/SprintControls.js +48 -29
  40. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  41. package/dist/planmagnet/utils/email.d.ts +9 -0
  42. package/dist/planmagnet/utils/email.d.ts.map +1 -0
  43. package/dist/planmagnet/utils/email.js +15 -0
  44. package/dist/planmagnet/utils/email.js.map +1 -0
  45. package/dist/planmagnet/utils/formValidation.d.ts +18 -0
  46. package/dist/planmagnet/utils/formValidation.d.ts.map +1 -0
  47. package/dist/planmagnet/utils/formValidation.js +17 -0
  48. package/dist/planmagnet/utils/formValidation.js.map +1 -0
  49. package/package.json +1 -1
@@ -1,12 +1,14 @@
1
- import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { useState as t } from "react";
3
- import { FolderKanban as n, Save as r, X as i } from "lucide-react";
4
- import { gql as a } from "@apollo/client";
5
- import { useMutation as o } from "@apollo/client/react";
6
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
- import { Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, Input as m } from "@burdenoff/fe-libs/ui";
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 h = a`
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 g() {
27
- let { workspaceId: a, currentUser: g } = e(), [_, v] = t({
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
- }), [y, b] = t(null), [x, { loading: S, error: C }] = o(h, {
35
- refetchQueries: [
36
- "GetProjects",
37
- "GetActiveProjects",
38
- "GetDashboardData"
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__ */ c("div", {
44
+ /* @__PURE__ */ d("div", {
55
45
  className: "flex items-center justify-between",
56
- children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h1", {
46
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
57
47
  className: "text-2xl font-semibold",
58
48
  children: "Create Project"
59
- }), /* @__PURE__ */ s("p", {
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__ */ c("div", {
52
+ })] }), /* @__PURE__ */ d("div", {
63
53
  className: "flex gap-2",
64
- children: [/* @__PURE__ */ c(l, {
54
+ children: [/* @__PURE__ */ d(f, {
65
55
  variant: "outline",
66
56
  size: "sm",
67
- children: [/* @__PURE__ */ s(i, { className: "mr-1 h-4 w-4" }), "Cancel"]
68
- }), /* @__PURE__ */ c(l, {
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
- !_.name || !_.key || x({ variables: { input: {
72
- name: _.name,
73
- key: _.key,
74
- description: _.description || void 0,
75
- methodology: _.methodology,
76
- ownerId: g?.id ?? "unknown",
77
- startDate: _.startDate || void 0,
78
- endDate: _.endDate || void 0
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: S || !_.name || !_.key,
82
- children: [/* @__PURE__ */ s(r, { className: "mr-1 h-4 w-4" }), S ? "Creating..." : "Create Project"]
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
- y && /* @__PURE__ */ s("div", {
87
- className: "p-3 bg-green-50 text-green-800 rounded-md text-sm",
88
- children: y
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
- C && /* @__PURE__ */ c("div", {
91
- className: "p-3 bg-red-50 text-red-800 rounded-md text-sm",
92
- children: ["Error: ", C.message]
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__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ c(p, {
102
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, {
95
103
  className: "flex items-center gap-2",
96
- children: [/* @__PURE__ */ s(n, { className: "h-4 w-4" }), "Project Details"]
97
- }) }), /* @__PURE__ */ c(d, {
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__ */ c("div", { children: [/* @__PURE__ */ s("label", {
108
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
101
109
  className: "text-sm font-medium",
102
110
  children: "Project Name"
103
- }), /* @__PURE__ */ s(m, {
104
- value: _.name,
105
- onChange: (e) => v({
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__ */ c("div", { children: [
113
- /* @__PURE__ */ s("label", {
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__ */ s(m, {
118
- value: _.key,
119
- onChange: (e) => v({
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__ */ s("p", {
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__ */ c("div", { children: [/* @__PURE__ */ s("label", {
139
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
132
140
  className: "text-sm font-medium",
133
141
  children: "Description"
134
- }), /* @__PURE__ */ s("textarea", {
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: _.description,
137
- onChange: (e) => v({
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__ */ c("div", { children: [/* @__PURE__ */ s("label", {
151
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
144
152
  className: "text-sm font-medium",
145
153
  children: "Methodology"
146
- }), /* @__PURE__ */ s("select", {
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: _.methodology,
149
- onChange: (e) => v({
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__ */ s("option", {
168
+ ].map((e) => /* @__PURE__ */ u("option", {
161
169
  value: e,
162
170
  children: e.toLowerCase()
163
171
  }, e))
164
172
  })] }),
165
- /* @__PURE__ */ c("div", {
173
+ /* @__PURE__ */ d("div", {
166
174
  className: "grid grid-cols-2 gap-4",
167
- children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("label", {
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__ */ s(m, {
179
+ }), /* @__PURE__ */ u(_, {
180
+ id: "project-start",
171
181
  type: "date",
172
- value: _.startDate,
173
- onChange: (e) => v({
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__ */ c("div", { children: [/* @__PURE__ */ s("label", {
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__ */ s(m, {
193
+ }), /* @__PURE__ */ u(_, {
194
+ id: "project-end",
182
195
  type: "date",
183
- value: _.endDate,
184
- onChange: (e) => v({
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 { g as ProjectsCreateProjectPagePage };
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":"AA2CA,wBAAgB,2BAA2B,4CA+J1C"}
1
+ {"version":3,"file":"ProjectsEditProjectPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsEditProjectPagePage.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,2BAA2B,4CA+L1C"}