@burdenoff/microfe-planmagnet 2026.927.3 → 2026.927.4

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 (66) hide show
  1. package/dist/planmagnet/controls/FeatureControls.d.ts +26 -0
  2. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -0
  3. package/dist/planmagnet/controls/FeatureControls.js +318 -0
  4. package/dist/planmagnet/controls/FeatureControls.js.map +1 -0
  5. package/dist/planmagnet/controls/MilestoneControls.d.ts +17 -0
  6. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -0
  7. package/dist/planmagnet/controls/MilestoneControls.js +200 -0
  8. package/dist/planmagnet/controls/MilestoneControls.js.map +1 -0
  9. package/dist/planmagnet/controls/ObjectiveControls.d.ts +31 -0
  10. package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +1 -0
  11. package/dist/planmagnet/controls/ObjectiveControls.js +296 -0
  12. package/dist/planmagnet/controls/ObjectiveControls.js.map +1 -0
  13. package/dist/planmagnet/controls/Pickers.d.ts +26 -0
  14. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -0
  15. package/dist/planmagnet/controls/Pickers.js +171 -0
  16. package/dist/planmagnet/controls/Pickers.js.map +1 -0
  17. package/dist/planmagnet/controls/ProjectControls.js +7 -7
  18. package/dist/planmagnet/controls/ReleaseControls.d.ts +14 -0
  19. package/dist/planmagnet/controls/ReleaseControls.d.ts.map +1 -0
  20. package/dist/planmagnet/controls/ReleaseControls.js +108 -0
  21. package/dist/planmagnet/controls/ReleaseControls.js.map +1 -0
  22. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +186 -152
  24. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +63 -56
  27. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +229 -214
  30. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +142 -114
  33. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +134 -105
  36. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +102 -108
  39. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +119 -94
  42. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +107 -106
  45. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +2 -0
  48. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +6 -6
  50. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  51. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +55 -63
  52. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  53. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +4 -4
  54. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +123 -128
  55. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  56. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  57. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +139 -107
  58. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  59. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  60. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +173 -126
  61. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  62. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  63. package/dist/planmagnet/pages/TasksTasksPagePage.js +1 -0
  64. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  65. package/dist/planmagnet/roadmaps/RoadmapControls.js +23 -23
  66. package/package.json +1 -1
@@ -2,13 +2,14 @@ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
2
  import { PersonName as t } from "../people/People.js";
3
3
  import { detailPath as n } from "../utils/rowNavigation.js";
4
4
  import { useEntityId as r } from "../hooks/useEntityId.js";
5
- import { Calendar as i, FolderKanban as a, Target as o, User as s } from "lucide-react";
6
- import { gql as c } from "@apollo/client";
7
- import { useQuery as l } from "@apollo/client/react";
8
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
- import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
5
+ import { MilestoneHeaderActions as i } from "../controls/MilestoneControls.js";
6
+ import { Calendar as a, FolderKanban as o, Target as s, User as c } from "lucide-react";
7
+ import { gql as l } from "@apollo/client";
8
+ import { useQuery as u } from "@apollo/client/react";
9
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
+ import { Badge as p, Card as m, CardContent as h, CardHeader as g, CardTitle as _ } from "@burdenoff/fe-libs/ui";
10
11
  //#region src/planmagnet/pages/ProjectsMilestoneDetailPagePage.tsx
11
- var _ = c`
12
+ var v = l`
12
13
  query GetMilestonesForDetail($id: ID!) {
13
14
  planmagnetMilestone(id: $id) {
14
15
  id
@@ -26,154 +27,145 @@ var _ = c`
26
27
  completedAt
27
28
  }
28
29
  }
29
- `, v = {
30
- PENDING: "bg-gray-100 text-gray-800",
31
- IN_PROGRESS: "bg-blue-100 text-blue-800",
32
- COMPLETED: "bg-green-100 text-green-800",
33
- MISSED: "bg-red-100 text-red-800",
34
- CANCELLED: "bg-red-100 text-red-800"
35
- };
30
+ `;
36
31
  function y() {
37
- let c = r("milestoneId"), y = e(), { data: b, loading: x, error: S } = l(_, {
38
- variables: { id: c },
39
- skip: !c
32
+ let l = r("milestoneId"), y = e(), { data: b, loading: x, error: S } = u(v, {
33
+ variables: { id: l },
34
+ skip: !l
40
35
  });
41
- if (!c) return /* @__PURE__ */ u("div", {
36
+ if (!l) return /* @__PURE__ */ d("div", {
42
37
  className: "p-6 text-muted-foreground",
43
38
  children: "No milestone selected. Open one from the list."
44
39
  });
45
- if (x && !b) return /* @__PURE__ */ u("div", {
40
+ if (x && !b) return /* @__PURE__ */ d("div", {
46
41
  className: "flex items-center justify-center p-12",
47
- children: /* @__PURE__ */ u("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
42
+ children: /* @__PURE__ */ d("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
48
43
  });
49
- if (S) return /* @__PURE__ */ d("div", {
44
+ if (S) return /* @__PURE__ */ f("div", {
50
45
  className: "p-6 text-red-500",
51
46
  children: ["Error loading milestone: ", S.message]
52
47
  });
53
48
  let C = b?.planmagnetMilestone;
54
- if (!C) return /* @__PURE__ */ u("div", {
49
+ if (!C) return /* @__PURE__ */ d("div", {
55
50
  className: "p-6 text-muted-foreground",
56
51
  children: "Milestone not found."
57
52
  });
58
53
  let w = C.status === "COMPLETED";
59
- return /* @__PURE__ */ d("div", {
54
+ return /* @__PURE__ */ f("div", {
60
55
  className: "space-y-6 p-6",
61
- children: [/* @__PURE__ */ d("div", {
56
+ children: [/* @__PURE__ */ f("div", {
62
57
  className: "flex items-center justify-between",
63
- children: [/* @__PURE__ */ d("div", {
58
+ children: [/* @__PURE__ */ f("div", {
64
59
  className: "flex items-center gap-3",
65
- children: [/* @__PURE__ */ u(o, { className: "h-6 w-6 text-primary" }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
60
+ children: [/* @__PURE__ */ d(s, { className: "h-6 w-6 text-primary" }), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
66
61
  className: "text-2xl font-semibold",
67
62
  children: C.name
68
- }), /* @__PURE__ */ d("p", {
63
+ }), /* @__PURE__ */ f("p", {
69
64
  className: "text-sm text-muted-foreground",
70
65
  children: ["Project: ", C.project?.name ?? "not available"]
71
66
  })] })]
72
- }), /* @__PURE__ */ u("span", {
73
- className: `text-xs px-3 py-1 rounded-full capitalize ${v[C.status] ?? "bg-gray-100"}`,
74
- children: C.status.toLowerCase().replace("_", " ")
75
- })]
76
- }), /* @__PURE__ */ d("div", {
67
+ }), /* @__PURE__ */ d(i, { milestone: C })]
68
+ }), /* @__PURE__ */ f("div", {
77
69
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
78
- children: [/* @__PURE__ */ d("div", {
70
+ children: [/* @__PURE__ */ f("div", {
79
71
  className: "lg:col-span-2 space-y-6",
80
- children: [/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Overview" }) }), /* @__PURE__ */ d(m, {
72
+ children: [/* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Overview" }) }), /* @__PURE__ */ f(h, {
81
73
  className: "space-y-4",
82
- children: [/* @__PURE__ */ u("p", {
74
+ children: [/* @__PURE__ */ d("p", {
83
75
  className: "text-sm",
84
76
  children: C.description ?? "No description provided."
85
- }), /* @__PURE__ */ u("div", { children: /* @__PURE__ */ d("div", {
77
+ }), /* @__PURE__ */ d("div", { children: /* @__PURE__ */ f("div", {
86
78
  className: "flex justify-between text-sm mb-2",
87
- children: [/* @__PURE__ */ u("span", {
79
+ children: [/* @__PURE__ */ d("span", {
88
80
  className: "text-muted-foreground",
89
81
  children: "Status"
90
- }), /* @__PURE__ */ u(f, {
82
+ }), /* @__PURE__ */ d(p, {
91
83
  variant: w ? "default" : "secondary",
92
84
  className: "capitalize",
93
85
  children: C.status.toLowerCase().replace("_", " ")
94
86
  })]
95
87
  }) })]
96
- })] }), /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Timeline" }) }), /* @__PURE__ */ u(m, { children: /* @__PURE__ */ d("div", {
88
+ })] }), /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Timeline" }) }), /* @__PURE__ */ d(h, { children: /* @__PURE__ */ f("div", {
97
89
  className: "grid grid-cols-2 gap-4 text-center",
98
- children: [/* @__PURE__ */ d("div", {
90
+ children: [/* @__PURE__ */ f("div", {
99
91
  className: "p-4 bg-muted rounded-md",
100
- children: [/* @__PURE__ */ u("p", {
92
+ children: [/* @__PURE__ */ d("p", {
101
93
  className: "text-sm font-bold",
102
94
  children: C.dueDate ? new Date(C.dueDate).toLocaleDateString() : "—"
103
- }), /* @__PURE__ */ u("p", {
95
+ }), /* @__PURE__ */ d("p", {
104
96
  className: "text-xs text-muted-foreground",
105
97
  children: "Due Date"
106
98
  })]
107
- }), /* @__PURE__ */ d("div", {
99
+ }), /* @__PURE__ */ f("div", {
108
100
  className: "p-4 bg-muted rounded-md",
109
- children: [/* @__PURE__ */ u("p", {
101
+ children: [/* @__PURE__ */ d("p", {
110
102
  className: "text-sm font-bold",
111
103
  children: C.completedAt ? new Date(C.completedAt).toLocaleDateString() : "—"
112
- }), /* @__PURE__ */ u("p", {
104
+ }), /* @__PURE__ */ d("p", {
113
105
  className: "text-xs text-muted-foreground",
114
106
  children: "Completed"
115
107
  })]
116
108
  })]
117
109
  }) })] })]
118
- }), /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Details" }) }), /* @__PURE__ */ d(m, {
110
+ }), /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Details" }) }), /* @__PURE__ */ f(h, {
119
111
  className: "space-y-3 text-sm",
120
112
  children: [
121
- /* @__PURE__ */ d("div", {
113
+ /* @__PURE__ */ f("div", {
122
114
  className: "flex items-center gap-2",
123
115
  children: [
124
- /* @__PURE__ */ u(i, { className: "h-4 w-4 text-muted-foreground" }),
125
- /* @__PURE__ */ u("span", {
116
+ /* @__PURE__ */ d(a, { className: "h-4 w-4 text-muted-foreground" }),
117
+ /* @__PURE__ */ d("span", {
126
118
  className: "text-muted-foreground",
127
119
  children: "Due:"
128
120
  }),
129
- /* @__PURE__ */ u("span", {
121
+ /* @__PURE__ */ d("span", {
130
122
  className: "font-medium",
131
123
  children: C.dueDate ? new Date(C.dueDate).toLocaleDateString() : "Not set"
132
124
  })
133
125
  ]
134
126
  }),
135
- /* @__PURE__ */ d("div", {
127
+ /* @__PURE__ */ f("div", {
136
128
  className: "flex items-center gap-2",
137
129
  children: [
138
- /* @__PURE__ */ u(a, { className: "h-4 w-4 text-muted-foreground" }),
139
- /* @__PURE__ */ u("span", {
130
+ /* @__PURE__ */ d(o, { className: "h-4 w-4 text-muted-foreground" }),
131
+ /* @__PURE__ */ d("span", {
140
132
  className: "text-muted-foreground",
141
133
  children: "Project:"
142
134
  }),
143
- C.project ? /* @__PURE__ */ u("button", {
135
+ C.project ? /* @__PURE__ */ d("button", {
144
136
  type: "button",
145
137
  className: "font-medium text-primary hover:underline",
146
138
  onClick: () => y(n("/projects/project-detail-page", C.project.id)),
147
139
  children: C.project.name
148
- }) : /* @__PURE__ */ u("span", {
140
+ }) : /* @__PURE__ */ d("span", {
149
141
  className: "text-muted-foreground",
150
142
  children: "not available"
151
143
  })
152
144
  ]
153
145
  }),
154
- C.ownerId && /* @__PURE__ */ d("div", {
146
+ C.ownerId && /* @__PURE__ */ f("div", {
155
147
  className: "flex items-center gap-2",
156
148
  children: [
157
- /* @__PURE__ */ u(s, { className: "h-4 w-4 text-muted-foreground" }),
158
- /* @__PURE__ */ u("span", {
149
+ /* @__PURE__ */ d(c, { className: "h-4 w-4 text-muted-foreground" }),
150
+ /* @__PURE__ */ d("span", {
159
151
  className: "text-muted-foreground",
160
152
  children: "Owner:"
161
153
  }),
162
- /* @__PURE__ */ u("span", {
154
+ /* @__PURE__ */ d("span", {
163
155
  className: "font-medium",
164
- children: /* @__PURE__ */ u(t, { id: C.ownerId })
156
+ children: /* @__PURE__ */ d(t, { id: C.ownerId })
165
157
  })
166
158
  ]
167
159
  }),
168
- /* @__PURE__ */ d("div", {
160
+ /* @__PURE__ */ f("div", {
169
161
  className: "flex items-center gap-2",
170
162
  children: [
171
- /* @__PURE__ */ u(i, { className: "h-4 w-4 text-muted-foreground" }),
172
- /* @__PURE__ */ u("span", {
163
+ /* @__PURE__ */ d(a, { className: "h-4 w-4 text-muted-foreground" }),
164
+ /* @__PURE__ */ d("span", {
173
165
  className: "text-muted-foreground",
174
166
  children: "Created:"
175
167
  }),
176
- /* @__PURE__ */ u("span", {
168
+ /* @__PURE__ */ d("span", {
177
169
  className: "font-medium",
178
170
  children: C.createdAt ? new Date(C.createdAt).toLocaleDateString() : "—"
179
171
  })
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsMilestoneDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsMilestoneDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Target, Calendar, FolderKanban, User } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { PersonName } from '../people/People';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\n\nconst GET_MILESTONES_FOR_DETAIL = gql`\n query GetMilestonesForDetail($id: ID!) {\n planmagnetMilestone(id: $id) {\n id\n name\n description\n projectId\n project {\n id\n name\n }\n status\n dueDate\n ownerId\n createdAt\n completedAt\n }\n }\n`;\n\nconst statusColor: Record<string, string> = {\n PENDING: 'bg-gray-100 text-gray-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n COMPLETED: 'bg-green-100 text-green-800',\n MISSED: 'bg-red-100 text-red-800',\n CANCELLED: 'bg-red-100 text-red-800',\n};\n\nexport function ProjectsMilestoneDetailPagePage() {\n const milestoneId = useEntityId('milestoneId');\n const navigate = usePlanMagnetNavigate();\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_MILESTONES_FOR_DETAIL, {\n variables: { id: milestoneId },\n skip: !milestoneId,\n });\n\n if (!milestoneId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No milestone selected. Open one from the list.\n </div>\n );\n // Only before the first load: a refetch must not blank the page (it\n // unmounts every component on it and loses their state).\n if (loading && !data)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error)\n return <div className=\"p-6 text-red-500\">Error loading milestone: {error.message}</div>;\n\n const ms = data?.planmagnetMilestone;\n if (!ms) return <div className=\"p-6 text-muted-foreground\">Milestone not found.</div>;\n\n const isCompleted = ms.status === 'COMPLETED';\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 <Target className=\"h-6 w-6 text-primary\" />\n <div>\n <h1 className=\"text-2xl font-semibold\">{ms.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n Project: {ms.project?.name ?? 'not available'}\n </p>\n </div>\n </div>\n <span\n className={`text-xs px-3 py-1 rounded-full capitalize ${statusColor[ms.status] ?? 'bg-gray-100'}`}\n >\n {ms.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\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>Overview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm\">{ms.description ?? 'No description provided.'}</p>\n <div>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant={isCompleted ? 'default' : 'secondary'} className=\"capitalize\">\n {ms.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Due Date</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.completedAt ? new Date(ms.completedAt).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Due:</span>\n <span className=\"font-medium\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n {/* The project's name, linked — this printed the raw project UUID (BOFF-7949). */}\n {ms.project ? (\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() =>\n navigate(detailPath('/projects/project-detail-page', ms.project.id))\n }\n >\n {ms.project.name}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">not available</span>\n )}\n </div>\n {ms.ownerId && (\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Owner:</span>\n <span className=\"font-medium\">\n <PersonName id={ms.ownerId} />\n </span>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Created:</span>\n <span className=\"font-medium\">\n {ms.createdAt ? new Date(ms.createdAt).toLocaleDateString() : '—'}\n </span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectsMilestoneDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsMilestoneDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Target, Calendar, FolderKanban, User } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { PersonName } from '../people/People';\nimport { MilestoneHeaderActions } from '../controls/MilestoneControls';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\n\nconst GET_MILESTONES_FOR_DETAIL = gql`\n query GetMilestonesForDetail($id: ID!) {\n planmagnetMilestone(id: $id) {\n id\n name\n description\n projectId\n project {\n id\n name\n }\n status\n dueDate\n ownerId\n createdAt\n completedAt\n }\n }\n`;\n\nexport function ProjectsMilestoneDetailPagePage() {\n const milestoneId = useEntityId('milestoneId');\n const navigate = usePlanMagnetNavigate();\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_MILESTONES_FOR_DETAIL, {\n variables: { id: milestoneId },\n skip: !milestoneId,\n });\n\n if (!milestoneId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No milestone selected. Open one from the list.\n </div>\n );\n // Only before the first load: a refetch must not blank the page (it\n // unmounts every component on it and loses their state).\n if (loading && !data)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error)\n return <div className=\"p-6 text-red-500\">Error loading milestone: {error.message}</div>;\n\n const ms = data?.planmagnetMilestone;\n if (!ms) return <div className=\"p-6 text-muted-foreground\">Milestone not found.</div>;\n\n const isCompleted = ms.status === 'COMPLETED';\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 <Target className=\"h-6 w-6 text-primary\" />\n <div>\n <h1 className=\"text-2xl font-semibold\">{ms.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n Project: {ms.project?.name ?? 'not available'}\n </p>\n </div>\n </div>\n {/* Status, Edit and Delete (BOFF-7953): the milestone could never move past Pending. */}\n <MilestoneHeaderActions milestone={ms} />\n </div>\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>Overview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm\">{ms.description ?? 'No description provided.'}</p>\n <div>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant={isCompleted ? 'default' : 'secondary'} className=\"capitalize\">\n {ms.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Due Date</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.completedAt ? new Date(ms.completedAt).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Due:</span>\n <span className=\"font-medium\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n {/* The project's name, linked — this printed the raw project UUID (BOFF-7949). */}\n {ms.project ? (\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() =>\n navigate(detailPath('/projects/project-detail-page', ms.project.id))\n }\n >\n {ms.project.name}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">not available</span>\n )}\n </div>\n {ms.ownerId && (\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Owner:</span>\n <span className=\"font-medium\">\n <PersonName id={ms.ownerId} />\n </span>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Created:</span>\n <span className=\"font-medium\">\n {ms.createdAt ? new Date(ms.createdAt).toLocaleDateString() : '—'}\n </span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { throwOnError as n } from "../utils/mutationResult.js";
3
- import { detailPath as r } from "../utils/rowNavigation.js";
4
- import { endBeforeStart as i, parseIntField as a } from "../utils/formValidation.js";
3
+ import { endBeforeStart as r, parseIntField as i } from "../utils/formValidation.js";
4
+ import { detailPath as a } from "../utils/rowNavigation.js";
5
5
  import { useEntityId as o } from "../hooks/useEntityId.js";
6
6
  import { SprintLifecycleActions as s } from "../sprints/SprintControls.js";
7
7
  import { useMemo as c, useState as l } from "react";
@@ -63,7 +63,7 @@ function T() {
63
63
  let n = { ...t };
64
64
  for (let [t, r] of Object.entries(e)) r !== L[t] && (n[t] = r);
65
65
  return n;
66
- }), [z, B] = l(null), V = i(L.startDate, L.endDate), H = a(L.capacity, { min: 0 }), [U, { loading: W }] = p(w, { refetchQueries: [
66
+ }), [z, B] = l(null), V = r(L.startDate, L.endDate), H = i(L.capacity, { min: 0 }), [U, { loading: W }] = p(w, { refetchQueries: [
67
67
  "GetSprints",
68
68
  "GetSprintDetail",
69
69
  "GetSprintForEdit",
@@ -86,7 +86,7 @@ function T() {
86
86
  variant: "ghost",
87
87
  size: "sm",
88
88
  "aria-label": "Back to the sprint",
89
- onClick: () => E(r("/projects/planning-detail-page", T)),
89
+ onClick: () => E(a("/projects/planning-detail-page", T)),
90
90
  children: /* @__PURE__ */ h(u, { className: "h-4 w-4" })
91
91
  }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h1", {
92
92
  className: "text-2xl font-semibold",