@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.
Files changed (92) hide show
  1. package/dist/generated/wspace-types.d.ts +61 -2
  2. package/dist/generated/wspace-types.d.ts.map +1 -1
  3. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoot.js +90 -79
  5. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  6. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  7. package/dist/planmagnet/PlanMagnetRoutes.js +124 -127
  8. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  9. package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
  10. package/dist/planmagnet/create/CreateDialogs.js +149 -124
  11. package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
  12. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  13. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +1 -1
  14. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  15. package/dist/planmagnet/pages/NotFoundPage.d.ts +6 -0
  16. package/dist/planmagnet/pages/NotFoundPage.d.ts.map +1 -0
  17. package/dist/planmagnet/pages/NotFoundPage.js +18 -0
  18. package/dist/planmagnet/pages/NotFoundPage.js.map +1 -0
  19. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -1
  20. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +93 -98
  21. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -1
  22. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +72 -79
  24. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +112 -123
  27. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +103 -87
  30. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +92 -98
  33. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProductsProductsPagePage.js +88 -96
  36. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +116 -114
  39. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -88
  42. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +79 -79
  45. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +111 -91
  48. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +117 -97
  51. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +150 -154
  54. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +154 -117
  57. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +75 -31
  60. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +161 -115
  63. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +117 -102
  66. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +147 -147
  69. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/TeamTeamPagePage.js +77 -67
  72. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  73. package/dist/planmagnet/roadmaps/planningFocus.d.ts +23 -0
  74. package/dist/planmagnet/roadmaps/planningFocus.d.ts.map +1 -0
  75. package/dist/planmagnet/roadmaps/planningFocus.js +76 -0
  76. package/dist/planmagnet/roadmaps/planningFocus.js.map +1 -0
  77. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  78. package/dist/planmagnet/sprints/SprintControls.js +48 -29
  79. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  80. package/dist/planmagnet/sprints/SprintDates.d.ts +37 -0
  81. package/dist/planmagnet/sprints/SprintDates.d.ts.map +1 -0
  82. package/dist/planmagnet/sprints/SprintDates.js +114 -0
  83. package/dist/planmagnet/sprints/SprintDates.js.map +1 -0
  84. package/dist/planmagnet/utils/email.d.ts +9 -0
  85. package/dist/planmagnet/utils/email.d.ts.map +1 -0
  86. package/dist/planmagnet/utils/email.js +15 -0
  87. package/dist/planmagnet/utils/email.js.map +1 -0
  88. package/dist/planmagnet/utils/formValidation.d.ts +18 -0
  89. package/dist/planmagnet/utils/formValidation.d.ts.map +1 -0
  90. package/dist/planmagnet/utils/formValidation.js +17 -0
  91. package/dist/planmagnet/utils/formValidation.js.map +1 -0
  92. package/package.json +1 -1
@@ -1,140 +1,133 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
- import { useState as n } from "react";
3
- import { Loader2 as r, Map as i, Save as a, X as o } from "lucide-react";
4
- import { gql as s } from "@apollo/client";
5
- import { useMutation as c } from "@apollo/client/react";
6
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
- import { Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, Input as g } from "@burdenoff/fe-libs/ui";
2
+ import { throwOnError as n } from "../utils/mutationResult.js";
3
+ import { PlanningFocusSelect as r, ROADMAP_DISPLAY as i } from "../roadmaps/planningFocus.js";
4
+ import { useState as a } from "react";
5
+ import { Loader2 as o, Map as s, Save as c, X as l } from "lucide-react";
6
+ import { gql as u } from "@apollo/client";
7
+ import { useMutation as d } from "@apollo/client/react";
8
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
+ import { Button as m, Card as h, CardContent as g, CardHeader as _, CardTitle as v, Input as y } from "@burdenoff/fe-libs/ui";
8
10
  //#region src/planmagnet/pages/ProductsCreateRoadmapPagePage.tsx
9
- var _ = s`
11
+ var b = u`
10
12
  mutation CreateRoadmapPage($input: PlanmagnetCreateRoadmapInput!) {
11
13
  planmagnetCreateRoadmap(input: $input) {
12
14
  id
13
15
  name
14
16
  description
15
17
  type
18
+ planningFocus
16
19
  isPublic
17
20
  ownerId
18
21
  createdAt
19
22
  }
20
23
  }
21
24
  `;
22
- function v() {
23
- let { workspaceId: s, currentUser: v } = e(), y = t(), [b, x] = n({
25
+ function x() {
26
+ let { workspaceId: u, currentUser: x } = e(), S = t(), [C, w] = a({
24
27
  name: "",
25
28
  description: "",
26
- type: "TIMELINE",
29
+ planningFocus: null,
27
30
  isPublic: !1
28
- }), [S, { loading: C, error: w }] = c(_, {
29
- refetchQueries: ["ListRoadmapsPage", "ListRoadmaps"],
30
- onCompleted: () => {
31
- y("/products/roadmaps-page");
32
- }
33
- });
34
- return /* @__PURE__ */ u("div", {
31
+ }), [T, E] = a(null), [D, { loading: O }] = d(b, { refetchQueries: ["ListRoadmapsPage", "ListRoadmaps"] });
32
+ return /* @__PURE__ */ p("div", {
35
33
  className: "space-y-6 p-6 max-w-4xl",
36
34
  children: [
37
- /* @__PURE__ */ u("div", {
35
+ /* @__PURE__ */ p("div", {
38
36
  className: "flex items-center justify-between",
39
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
37
+ children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
40
38
  className: "text-2xl font-semibold",
41
39
  children: "Create Roadmap"
42
- }), /* @__PURE__ */ l("p", {
40
+ }), /* @__PURE__ */ f("p", {
43
41
  className: "text-sm text-muted-foreground",
44
42
  children: "Define a new product roadmap with milestones and features."
45
- })] }), /* @__PURE__ */ u("div", {
43
+ })] }), /* @__PURE__ */ p("div", {
46
44
  className: "flex gap-2",
47
- children: [/* @__PURE__ */ u(d, {
45
+ children: [/* @__PURE__ */ p(m, {
48
46
  variant: "outline",
49
47
  size: "sm",
50
- onClick: () => y("/products/roadmaps-page"),
51
- children: [/* @__PURE__ */ l(o, { className: "mr-1 h-4 w-4" }), "Cancel"]
52
- }), /* @__PURE__ */ u(d, {
48
+ onClick: () => S("/products/roadmaps-page"),
49
+ children: [/* @__PURE__ */ f(l, { className: "mr-1 h-4 w-4" }), "Cancel"]
50
+ }), /* @__PURE__ */ p(m, {
53
51
  size: "sm",
54
- onClick: () => {
55
- b.name.trim() && S({ variables: { input: {
56
- name: b.name,
57
- description: b.description || void 0,
58
- type: b.type,
59
- isPublic: b.isPublic,
60
- ownerId: v?.id ?? ""
61
- } } });
52
+ onClick: async () => {
53
+ if (C.name.trim()) {
54
+ E(null);
55
+ try {
56
+ await n(D({ variables: { input: {
57
+ name: C.name,
58
+ description: C.description || void 0,
59
+ type: i,
60
+ ...C.planningFocus ? { planningFocus: C.planningFocus } : {},
61
+ isPublic: C.isPublic,
62
+ ownerId: x?.id ?? ""
63
+ } } })), S("/products/roadmaps-page");
64
+ } catch (e) {
65
+ E(e instanceof Error ? e.message : "The roadmap could not be created.");
66
+ }
67
+ }
62
68
  },
63
- disabled: C || !b.name.trim(),
64
- children: [C ? /* @__PURE__ */ l(r, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ l(a, { className: "mr-1 h-4 w-4" }), "Create Roadmap"]
69
+ disabled: O || !C.name.trim(),
70
+ children: [O ? /* @__PURE__ */ f(o, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ f(c, { className: "mr-1 h-4 w-4" }), "Create Roadmap"]
65
71
  })]
66
72
  })]
67
73
  }),
68
- w && /* @__PURE__ */ u("div", {
74
+ T && /* @__PURE__ */ p("div", {
75
+ role: "alert",
69
76
  className: "p-3 rounded-md bg-destructive/10 text-destructive text-sm",
70
- children: ["Failed to create roadmap: ", w.message]
77
+ children: ["Failed to create roadmap: ", T]
71
78
  }),
72
- /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, {
79
+ /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ p(v, {
73
80
  className: "flex items-center gap-2",
74
- children: [/* @__PURE__ */ l(i, { className: "h-4 w-4" }), "Roadmap Details"]
75
- }) }), /* @__PURE__ */ u(p, {
81
+ children: [/* @__PURE__ */ f(s, { className: "h-4 w-4" }), "Roadmap Details"]
82
+ }) }), /* @__PURE__ */ p(g, {
76
83
  className: "space-y-4",
77
84
  children: [
78
- /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
85
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
79
86
  className: "text-sm font-medium",
80
87
  children: "Name"
81
- }), /* @__PURE__ */ l(g, {
82
- value: b.name,
83
- onChange: (e) => x({
84
- ...b,
88
+ }), /* @__PURE__ */ f(y, {
89
+ value: C.name,
90
+ onChange: (e) => w({
91
+ ...C,
85
92
  name: e.target.value
86
93
  }),
87
94
  className: "mt-1",
88
95
  placeholder: "e.g. 2026 Platform Roadmap"
89
96
  })] }),
90
- /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
97
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
91
98
  className: "text-sm font-medium",
92
99
  children: "Description"
93
- }), /* @__PURE__ */ l("textarea", {
100
+ }), /* @__PURE__ */ f("textarea", {
94
101
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]",
95
- value: b.description,
96
- onChange: (e) => x({
97
- ...b,
102
+ value: C.description,
103
+ onChange: (e) => w({
104
+ ...C,
98
105
  description: e.target.value
99
106
  }),
100
107
  placeholder: "Describe the roadmap goals and scope..."
101
108
  })] }),
102
- /* @__PURE__ */ u("div", {
109
+ /* @__PURE__ */ p("div", {
103
110
  className: "grid grid-cols-2 gap-4",
104
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
105
- className: "text-sm font-medium",
106
- children: "Type"
107
- }), /* @__PURE__ */ l("select", {
108
- className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
109
- value: b.type,
110
- onChange: (e) => x({
111
- ...b,
112
- type: e.target.value
113
- }),
114
- children: [
115
- "TIMELINE",
116
- "GANTT",
117
- "SWIMLANE",
118
- "CUSTOM"
119
- ].map((e) => /* @__PURE__ */ l("option", {
120
- value: e,
121
- className: "capitalize",
122
- children: e.toLowerCase()
123
- }, e))
124
- })] }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
111
+ children: [/* @__PURE__ */ f(r, {
112
+ value: C.planningFocus,
113
+ onChange: (e) => w({
114
+ ...C,
115
+ planningFocus: e
116
+ })
117
+ }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
125
118
  className: "text-sm font-medium",
126
119
  children: "Visibility"
127
- }), /* @__PURE__ */ u("select", {
120
+ }), /* @__PURE__ */ p("select", {
128
121
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
129
- value: b.isPublic ? "public" : "private",
130
- onChange: (e) => x({
131
- ...b,
122
+ value: C.isPublic ? "public" : "private",
123
+ onChange: (e) => w({
124
+ ...C,
132
125
  isPublic: e.target.value === "public"
133
126
  }),
134
- children: [/* @__PURE__ */ l("option", {
127
+ children: [/* @__PURE__ */ f("option", {
135
128
  value: "private",
136
129
  children: "Private"
137
- }), /* @__PURE__ */ l("option", {
130
+ }), /* @__PURE__ */ f("option", {
138
131
  value: "public",
139
132
  children: "Public"
140
133
  })]
@@ -146,6 +139,6 @@ function v() {
146
139
  });
147
140
  }
148
141
  //#endregion
149
- export { v as ProductsCreateRoadmapPagePage };
142
+ export { x as ProductsCreateRoadmapPagePage };
150
143
 
151
144
  //# sourceMappingURL=ProductsCreateRoadmapPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsCreateRoadmapPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsCreateRoadmapPagePage.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, Map, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst CREATE_ROADMAP = gql`\n mutation CreateRoadmapPage($input: PlanmagnetCreateRoadmapInput!) {\n planmagnetCreateRoadmap(input: $input) {\n id\n name\n description\n type\n isPublic\n ownerId\n createdAt\n }\n }\n`;\n\nexport function ProductsCreateRoadmapPagePage() {\n const { workspaceId, currentUser } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const [form, setForm] = useState({\n name: '',\n description: '',\n type: 'TIMELINE' as 'TIMELINE' | 'GANTT' | 'SWIMLANE' | 'CUSTOM',\n isPublic: false,\n });\n\n const [createRoadmap, { loading: saving, error: saveError }] = useMutation(CREATE_ROADMAP, {\n refetchQueries: ['ListRoadmapsPage', 'ListRoadmaps'],\n onCompleted: () => {\n navigate('/products/roadmaps-page');\n },\n });\n\n const types = ['TIMELINE', 'GANTT', 'SWIMLANE', 'CUSTOM'] as const;\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createRoadmap({\n variables: {\n input: {\n name: form.name,\n description: form.description || undefined,\n type: form.type,\n isPublic: form.isPublic,\n ownerId: currentUser?.id ?? '',\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 Roadmap</h1>\n <p className=\"text-sm text-muted-foreground\">\n Define a new product roadmap with milestones and features.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/products/roadmaps-page')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleCreate} disabled={saving || !form.name.trim()}>\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 Create Roadmap\n </Button>\n </div>\n </div>\n\n {saveError && (\n <div className=\"p-3 rounded-md bg-destructive/10 text-destructive text-sm\">\n Failed to create roadmap: {saveError.message}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Map className=\"h-4 w-4\" />\n Roadmap Details\n </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 placeholder=\"e.g. 2026 Platform Roadmap\"\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 placeholder=\"Describe the roadmap goals and scope...\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Type</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.type}\n onChange={(e) => setForm({ ...form, type: e.target.value as typeof form.type })}\n >\n {types.map((t) => (\n <option key={t} value={t} className=\"capitalize\">\n {t.toLowerCase()}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Visibility</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.isPublic ? 'public' : 'private'}\n onChange={(e) => setForm({ ...form, isPublic: e.target.value === 'public' })}\n >\n <option value=\"private\">Private</option>\n <option value=\"public\">Public</option>\n </select>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProductsCreateRoadmapPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsCreateRoadmapPagePage.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, Map, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError } from '../utils/mutationResult';\nimport {\n PlanningFocusSelect,\n ROADMAP_DISPLAY,\n type PlanningFocus,\n} from '../roadmaps/planningFocus';\n\nconst CREATE_ROADMAP = gql`\n mutation CreateRoadmapPage($input: PlanmagnetCreateRoadmapInput!) {\n planmagnetCreateRoadmap(input: $input) {\n id\n name\n description\n type\n planningFocus\n isPublic\n ownerId\n createdAt\n }\n }\n`;\n\nexport function ProductsCreateRoadmapPagePage() {\n const { workspaceId, currentUser } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const [form, setForm] = useState({\n name: '',\n description: '',\n planningFocus: null as PlanningFocus | null,\n isPublic: false,\n });\n\n const [saveError, setSaveError] = useState<string | null>(null);\n const [createRoadmap, { loading: saving }] = useMutation(CREATE_ROADMAP, {\n refetchQueries: ['ListRoadmapsPage', 'ListRoadmaps'],\n });\n\n // Navigate only after the service ACCEPTED the roadmap: a refused create\n // (e.g. a duplicate name) resolves rather than rejects under fe-libs'\n // errorPolicy 'all', and onCompleted-style navigation would leave the page\n // with the reason unseen.\n const handleCreate = async () => {\n if (!form.name.trim()) return;\n setSaveError(null);\n try {\n await throwOnError(\n createRoadmap({\n variables: {\n input: {\n name: form.name,\n description: form.description || undefined,\n type: ROADMAP_DISPLAY,\n ...(form.planningFocus ? { planningFocus: form.planningFocus } : {}),\n isPublic: form.isPublic,\n ownerId: currentUser?.id ?? '',\n },\n },\n })\n );\n navigate('/products/roadmaps-page');\n } catch (e) {\n setSaveError(e instanceof Error ? e.message : 'The roadmap 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 Roadmap</h1>\n <p className=\"text-sm text-muted-foreground\">\n Define a new product roadmap with milestones and features.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/products/roadmaps-page')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleCreate} disabled={saving || !form.name.trim()}>\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 Create Roadmap\n </Button>\n </div>\n </div>\n\n {saveError && (\n <div role=\"alert\" className=\"p-3 rounded-md bg-destructive/10 text-destructive text-sm\">\n Failed to create roadmap: {saveError}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Map className=\"h-4 w-4\" />\n Roadmap Details\n </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 placeholder=\"e.g. 2026 Platform Roadmap\"\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 placeholder=\"Describe the roadmap goals and scope...\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\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 <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.isPublic ? 'public' : 'private'}\n onChange={(e) => setForm({ ...form, isPublic: e.target.value === 'public' })}\n >\n <option value=\"private\">Private</option>\n <option value=\"public\">Public</option>\n </select>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsEditProductPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsEditProductPagePage.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,2BAA2B,4CAkO1C"}
1
+ {"version":3,"file":"ProductsEditProductPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsEditProductPagePage.tsx"],"names":[],"mappings":"AAkEA,wBAAgB,2BAA2B,4CAwN1C"}