@burdenoff/microfe-planmagnet 2026.928.2 → 2026.928.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 (85) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +102 -84
  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 +103 -55
  6. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  7. package/dist/planmagnet/controls/CompetitorControls.d.ts +20 -0
  8. package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -0
  9. package/dist/planmagnet/controls/CompetitorControls.js +172 -0
  10. package/dist/planmagnet/controls/CompetitorControls.js.map +1 -0
  11. package/dist/planmagnet/controls/FeatureControls.js +29 -29
  12. package/dist/planmagnet/controls/FeatureTriage.js +11 -11
  13. package/dist/planmagnet/controls/ObjectiveControls.js +24 -24
  14. package/dist/planmagnet/controls/Pickers.d.ts +17 -2
  15. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  16. package/dist/planmagnet/controls/Pickers.js +100 -9
  17. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  18. package/dist/planmagnet/controls/PortfolioControls.d.ts +13 -0
  19. package/dist/planmagnet/controls/PortfolioControls.d.ts.map +1 -0
  20. package/dist/planmagnet/controls/PortfolioControls.js +114 -0
  21. package/dist/planmagnet/controls/PortfolioControls.js.map +1 -0
  22. package/dist/planmagnet/controls/ProgramControls.d.ts +25 -0
  23. package/dist/planmagnet/controls/ProgramControls.d.ts.map +1 -0
  24. package/dist/planmagnet/controls/ProgramControls.js +187 -0
  25. package/dist/planmagnet/controls/ProgramControls.js.map +1 -0
  26. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts +2 -0
  27. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -0
  28. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +127 -0
  29. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -0
  30. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts +2 -0
  31. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -0
  32. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +129 -0
  33. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -0
  34. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts +2 -0
  35. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -0
  36. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +132 -0
  37. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -0
  38. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +181 -0
  41. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts +2 -0
  43. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +1 -0
  44. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +242 -0
  45. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +1 -0
  46. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts +2 -0
  47. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +1 -0
  48. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +302 -0
  49. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +1 -0
  50. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts +2 -0
  51. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -0
  52. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +335 -0
  53. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -0
  54. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts +2 -0
  55. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +1 -0
  56. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +154 -0
  57. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +1 -0
  58. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +124 -138
  60. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts +2 -0
  62. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +1 -0
  63. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +221 -0
  64. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +1 -0
  65. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts +2 -0
  66. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +1 -0
  67. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +279 -0
  68. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +1 -0
  69. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts +2 -0
  70. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +1 -0
  71. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +178 -0
  72. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +1 -0
  73. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts +2 -0
  74. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +1 -0
  75. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +157 -0
  76. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +1 -0
  77. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  78. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +130 -103
  79. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  80. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  81. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +156 -136
  82. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  83. package/dist/planmagnet/pages/TasksImportPagePage.js +5 -5
  84. package/dist/planmagnet/types/index.d.ts.map +1 -1
  85. package/package.json +1 -1
@@ -1,16 +1,16 @@
1
1
  import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
2
  import { PersonName as t } from "../people/People.js";
3
3
  import { workProgress as n } from "../hooks/useCounts.js";
4
- import { ROW_LINK_CLASS as r, rowLinkProps as i } from "../utils/rowNavigation.js";
5
- import { useEntityId as a } from "../hooks/useEntityId.js";
4
+ import { ROW_LINK_CLASS as r, detailPath as i, rowLinkProps as a } from "../utils/rowNavigation.js";
6
5
  import { ProjectHeaderActions as o } from "../controls/ProjectControls.js";
7
- import { Calendar as s, CheckSquare as c, FolderKanban as l, Users as u, Zap as d } from "lucide-react";
8
- import { gql as f } from "@apollo/client";
9
- import { useQuery as p } from "@apollo/client/react";
10
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
11
- import { Badge as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b } from "@burdenoff/fe-libs/ui";
6
+ import { useEntityId as s } from "../hooks/useEntityId.js";
7
+ import { Calendar as c, CheckSquare as l, FolderKanban as u, Users as d, Zap as f } from "lucide-react";
8
+ import { gql as p } from "@apollo/client";
9
+ import { useQuery as m } from "@apollo/client/react";
10
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
11
+ import { Badge as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x } from "@burdenoff/fe-libs/ui";
12
12
  //#region src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx
13
- var x = f`
13
+ var S = p`
14
14
  query GetProjectDetail($id: ID!) {
15
15
  planmagnetProject(id: $id) {
16
16
  id
@@ -24,6 +24,11 @@ var x = f`
24
24
  endDate
25
25
  tags
26
26
  createdAt
27
+ programId
28
+ program {
29
+ id
30
+ name
31
+ }
27
32
  sprints {
28
33
  id
29
34
  name
@@ -61,7 +66,7 @@ var x = f`
61
66
  }
62
67
  }
63
68
  }
64
- `, S = {
69
+ `, C = {
65
70
  ACTIVE: "bg-green-100 text-green-800",
66
71
  ON_HOLD: "bg-orange-100 text-orange-800",
67
72
  CANCELLED: "bg-red-100 text-red-800",
@@ -69,186 +74,186 @@ var x = f`
69
74
  PLANNING: "bg-gray-100 text-gray-800",
70
75
  ARCHIVED: "bg-gray-100 text-gray-800"
71
76
  };
72
- function C() {
73
- let f = a("projectId"), C = e(), { data: w, loading: T, error: E } = p(x, {
74
- variables: { id: f },
75
- skip: !f
77
+ function w() {
78
+ let p = s("projectId"), w = e(), { data: T, loading: E, error: D } = m(S, {
79
+ variables: { id: p },
80
+ skip: !p
76
81
  });
77
- if (!f) return /* @__PURE__ */ m("div", {
82
+ if (!p) return /* @__PURE__ */ h("div", {
78
83
  className: "p-6 text-muted-foreground",
79
84
  children: "No project selected. Open one from the list."
80
85
  });
81
- if (T && !w) return /* @__PURE__ */ m("div", {
86
+ if (E && !T) return /* @__PURE__ */ h("div", {
82
87
  className: "flex items-center justify-center p-12",
83
- children: /* @__PURE__ */ m("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
88
+ children: /* @__PURE__ */ h("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
84
89
  });
85
- if (E) return /* @__PURE__ */ h("div", {
90
+ if (D) return /* @__PURE__ */ g("div", {
86
91
  className: "p-6 text-red-500",
87
- children: ["Error loading project: ", E.message]
92
+ children: ["Error loading project: ", D.message]
88
93
  });
89
- let D = w?.planmagnetProject;
90
- if (!D) return /* @__PURE__ */ m("div", {
94
+ let O = T?.planmagnetProject;
95
+ if (!O) return /* @__PURE__ */ h("div", {
91
96
  className: "p-6 text-muted-foreground",
92
97
  children: "Project not found."
93
98
  });
94
- let O = D.workItems ?? [], k = D.sprints ?? [], A = D.milestones ?? [], j = k.find((e) => e.status === "ACTIVE"), M = k.filter((e) => e.status === "COMPLETED" && e.velocity != null).sort((e, t) => (t.endDate ?? "").localeCompare(e.endDate ?? ""))[0], N = n(O.map((e) => ({ status: e.status }))), P = O.filter((e) => e.status !== "CANCELLED"), F = P.filter((e) => e.status === "DONE").length, I = [...O].sort((e, t) => t.createdAt.localeCompare(e.createdAt)).slice(0, 5);
95
- return /* @__PURE__ */ h("div", {
99
+ let k = O.workItems ?? [], A = O.sprints ?? [], j = O.milestones ?? [], M = A.find((e) => e.status === "ACTIVE"), N = A.filter((e) => e.status === "COMPLETED" && e.velocity != null).sort((e, t) => (t.endDate ?? "").localeCompare(e.endDate ?? ""))[0], P = n(k.map((e) => ({ status: e.status }))), F = k.filter((e) => e.status !== "CANCELLED"), I = F.filter((e) => e.status === "DONE").length, L = [...k].sort((e, t) => t.createdAt.localeCompare(e.createdAt)).slice(0, 5);
100
+ return /* @__PURE__ */ g("div", {
96
101
  className: "space-y-6 p-6",
97
102
  children: [
98
- /* @__PURE__ */ h("div", {
103
+ /* @__PURE__ */ g("div", {
99
104
  className: "flex items-center justify-between",
100
- children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("div", {
105
+ children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("div", {
101
106
  className: "flex items-center gap-2",
102
107
  children: [
103
- /* @__PURE__ */ m(l, { className: "h-5 w-5 text-primary" }),
104
- /* @__PURE__ */ m("h1", {
108
+ /* @__PURE__ */ h(u, { className: "h-5 w-5 text-primary" }),
109
+ /* @__PURE__ */ h("h1", {
105
110
  className: "text-2xl font-semibold",
106
- children: D.name
111
+ children: O.name
107
112
  }),
108
- /* @__PURE__ */ m("span", {
109
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${S[D.status] ?? "bg-gray-100"}`,
110
- children: D.status.toLowerCase().replace("_", " ")
113
+ /* @__PURE__ */ h("span", {
114
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${C[O.status] ?? "bg-gray-100"}`,
115
+ children: O.status.toLowerCase().replace("_", " ")
111
116
  })
112
117
  ]
113
- }), /* @__PURE__ */ m("p", {
118
+ }), /* @__PURE__ */ h("p", {
114
119
  className: "text-sm text-muted-foreground mt-1",
115
- children: D.description ?? "No description"
116
- })] }), /* @__PURE__ */ h("div", {
120
+ children: O.description ?? "No description"
121
+ })] }), /* @__PURE__ */ g("div", {
117
122
  className: "flex flex-col items-end gap-2",
118
- children: [/* @__PURE__ */ m(o, {
119
- projectId: D.id,
120
- name: D.name,
121
- status: D.status
122
- }), /* @__PURE__ */ m(g, {
123
+ children: [/* @__PURE__ */ h(o, {
124
+ projectId: O.id,
125
+ name: O.name,
126
+ status: O.status
127
+ }), /* @__PURE__ */ h(_, {
123
128
  variant: "outline",
124
129
  className: "capitalize",
125
- children: D.methodology.toLowerCase()
130
+ children: O.methodology.toLowerCase()
126
131
  })]
127
132
  })]
128
133
  }),
129
- /* @__PURE__ */ h("div", {
134
+ /* @__PURE__ */ g("div", {
130
135
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
131
136
  children: [
132
- /* @__PURE__ */ m(_, { children: /* @__PURE__ */ h(v, {
137
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
133
138
  className: "pt-4",
134
- children: [/* @__PURE__ */ h("div", {
139
+ children: [/* @__PURE__ */ g("div", {
135
140
  className: "flex items-center gap-2 text-muted-foreground text-xs",
136
- children: [/* @__PURE__ */ m(c, { className: "h-4 w-4" }), "Work Items"]
137
- }), /* @__PURE__ */ h("p", {
141
+ children: [/* @__PURE__ */ h(l, { className: "h-4 w-4" }), "Work Items"]
142
+ }), /* @__PURE__ */ g("p", {
138
143
  className: "text-xl font-bold mt-1",
139
144
  children: [
140
- F,
145
+ I,
141
146
  "/",
142
- P.length
147
+ F.length
143
148
  ]
144
149
  })]
145
150
  }) }),
146
- /* @__PURE__ */ m(_, { children: /* @__PURE__ */ h(v, {
151
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
147
152
  className: "pt-4",
148
- children: [/* @__PURE__ */ h("div", {
153
+ children: [/* @__PURE__ */ g("div", {
149
154
  className: "flex items-center gap-2 text-muted-foreground text-xs",
150
- children: [/* @__PURE__ */ m(d, { className: "h-4 w-4" }), "Sprints"]
151
- }), /* @__PURE__ */ m("p", {
155
+ children: [/* @__PURE__ */ h(f, { className: "h-4 w-4" }), "Sprints"]
156
+ }), /* @__PURE__ */ h("p", {
152
157
  className: "text-xl font-bold mt-1",
153
- children: k.length
158
+ children: A.length
154
159
  })]
155
160
  }) }),
156
- /* @__PURE__ */ m(_, { children: /* @__PURE__ */ h(v, {
161
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
157
162
  className: "pt-4",
158
- children: [/* @__PURE__ */ h("div", {
163
+ children: [/* @__PURE__ */ g("div", {
159
164
  className: "flex items-center gap-2 text-muted-foreground text-xs",
160
- children: [/* @__PURE__ */ m(s, { className: "h-4 w-4" }), "Milestones"]
161
- }), /* @__PURE__ */ m("p", {
165
+ children: [/* @__PURE__ */ h(c, { className: "h-4 w-4" }), "Milestones"]
166
+ }), /* @__PURE__ */ h("p", {
162
167
  className: "text-xl font-bold mt-1",
163
- children: A.length
168
+ children: j.length
164
169
  })]
165
170
  }) }),
166
- /* @__PURE__ */ m(_, { children: /* @__PURE__ */ h(v, {
171
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
167
172
  className: "pt-4",
168
- children: [/* @__PURE__ */ h("div", {
173
+ children: [/* @__PURE__ */ g("div", {
169
174
  className: "flex items-center gap-2 text-muted-foreground text-xs",
170
- children: [/* @__PURE__ */ m(u, { className: "h-4 w-4" }), "Owner"]
171
- }), /* @__PURE__ */ m("p", {
175
+ children: [/* @__PURE__ */ h(d, { className: "h-4 w-4" }), "Owner"]
176
+ }), /* @__PURE__ */ h("p", {
172
177
  className: "text-sm font-bold mt-1 truncate",
173
- children: /* @__PURE__ */ m(t, { id: D.ownerId })
178
+ children: /* @__PURE__ */ h(t, { id: O.ownerId })
174
179
  })]
175
180
  }) })
176
181
  ]
177
182
  }),
178
- /* @__PURE__ */ h("div", {
183
+ /* @__PURE__ */ g("div", {
179
184
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
180
- children: [/* @__PURE__ */ h("div", {
185
+ children: [/* @__PURE__ */ g("div", {
181
186
  className: "lg:col-span-2 space-y-6",
182
187
  children: [
183
- /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ m(b, { children: "Timeline" }) }), /* @__PURE__ */ h(v, { children: [
184
- /* @__PURE__ */ h("div", {
188
+ /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: "Timeline" }) }), /* @__PURE__ */ g(y, { children: [
189
+ /* @__PURE__ */ g("div", {
185
190
  className: "flex justify-between text-sm mb-2",
186
- children: [/* @__PURE__ */ m("span", {
191
+ children: [/* @__PURE__ */ h("span", {
187
192
  className: "text-muted-foreground",
188
193
  children: "Tasks done"
189
- }), /* @__PURE__ */ m("span", {
194
+ }), /* @__PURE__ */ h("span", {
190
195
  className: "font-medium",
191
- children: N === null ? "No open tasks" : `${N}%`
196
+ children: P === null ? "No open tasks" : `${P}%`
192
197
  })]
193
198
  }),
194
- /* @__PURE__ */ m("div", {
199
+ /* @__PURE__ */ h("div", {
195
200
  className: "w-full h-4 rounded-full bg-muted overflow-hidden",
196
- children: /* @__PURE__ */ m("div", {
201
+ children: /* @__PURE__ */ h("div", {
197
202
  className: "h-full bg-primary rounded-full",
198
- style: { width: `${N ?? 0}%` }
203
+ style: { width: `${P ?? 0}%` }
199
204
  })
200
205
  }),
201
- /* @__PURE__ */ h("div", {
206
+ /* @__PURE__ */ g("div", {
202
207
  className: "flex justify-between text-xs text-muted-foreground mt-2",
203
- children: [/* @__PURE__ */ m("span", { children: D.startDate ? new Date(D.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ m("span", { children: D.endDate ? new Date(D.endDate).toLocaleDateString() : "Not set" })]
208
+ children: [/* @__PURE__ */ h("span", { children: O.startDate ? new Date(O.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ h("span", { children: O.endDate ? new Date(O.endDate).toLocaleDateString() : "Not set" })]
204
209
  })
205
210
  ] })] }),
206
- j && /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ h(b, {
211
+ M && /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ g(x, {
207
212
  className: "flex items-center gap-2",
208
- children: [/* @__PURE__ */ m(d, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
209
- }) }), /* @__PURE__ */ h(v, {
213
+ children: [/* @__PURE__ */ h(f, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
214
+ }) }), /* @__PURE__ */ g(y, {
210
215
  className: "space-y-3",
211
216
  children: [
212
- /* @__PURE__ */ h("div", {
217
+ /* @__PURE__ */ g("div", {
213
218
  className: "flex justify-between",
214
- children: [/* @__PURE__ */ m("span", {
219
+ children: [/* @__PURE__ */ h("span", {
215
220
  className: "font-medium",
216
- children: j.name
217
- }), /* @__PURE__ */ m(g, { children: "Active" })]
221
+ children: M.name
222
+ }), /* @__PURE__ */ h(_, { children: "Active" })]
218
223
  }),
219
- j.goal && /* @__PURE__ */ m("p", {
224
+ M.goal && /* @__PURE__ */ h("p", {
220
225
  className: "text-sm text-muted-foreground",
221
- children: j.goal
226
+ children: M.goal
222
227
  }),
223
- /* @__PURE__ */ h("div", {
228
+ /* @__PURE__ */ g("div", {
224
229
  className: "grid grid-cols-3 gap-4 text-center",
225
230
  children: [
226
- /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
231
+ /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("p", {
227
232
  className: "text-lg font-semibold",
228
233
  children: [
229
- j.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
234
+ M.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
230
235
  "/",
231
- j.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
236
+ M.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
232
237
  ]
233
- }), /* @__PURE__ */ m("p", {
238
+ }), /* @__PURE__ */ h("p", {
234
239
  className: "text-xs text-muted-foreground",
235
240
  children: "Points"
236
241
  })] }),
237
- /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
242
+ /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("p", {
238
243
  className: "text-lg font-semibold",
239
244
  children: [
240
- j.workItems?.filter((e) => e.status === "DONE").length ?? 0,
245
+ M.workItems?.filter((e) => e.status === "DONE").length ?? 0,
241
246
  "/",
242
- j.workItems?.length ?? 0
247
+ M.workItems?.length ?? 0
243
248
  ]
244
- }), /* @__PURE__ */ m("p", {
249
+ }), /* @__PURE__ */ h("p", {
245
250
  className: "text-xs text-muted-foreground",
246
251
  children: "Tasks"
247
252
  })] }),
248
- /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
253
+ /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
249
254
  className: "text-lg font-semibold",
250
- children: M ? `${M.velocity} pts` : "—"
251
- }), /* @__PURE__ */ m("p", {
255
+ children: N ? `${N.velocity} pts` : "—"
256
+ }), /* @__PURE__ */ h("p", {
252
257
  className: "text-xs text-muted-foreground",
253
258
  children: "Velocity of the last sprint"
254
259
  })] })
@@ -256,115 +261,130 @@ function C() {
256
261
  })
257
262
  ]
258
263
  })] }),
259
- /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ h(b, { children: [
264
+ /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ g(x, { children: [
260
265
  "Work items (",
261
- O.length,
266
+ k.length,
262
267
  ")",
263
- O.length > 5 ? " · latest 5" : ""
264
- ] }) }), /* @__PURE__ */ h(v, {
268
+ k.length > 5 ? " · latest 5" : ""
269
+ ] }) }), /* @__PURE__ */ g(y, {
265
270
  className: "space-y-2",
266
- children: [I.map((e) => /* @__PURE__ */ h("div", {
267
- ...i(() => C(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`), e.key),
271
+ children: [L.map((e) => /* @__PURE__ */ g("div", {
272
+ ...a(() => w(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`), e.key),
268
273
  className: `flex items-center justify-between border rounded-md p-2.5 ${r}`,
269
- children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
274
+ children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("p", {
270
275
  className: "text-sm font-medium",
271
276
  children: [
272
277
  e.key,
273
278
  " ",
274
- /* @__PURE__ */ m("span", {
279
+ /* @__PURE__ */ h("span", {
275
280
  className: "font-normal",
276
281
  children: e.title
277
282
  })
278
283
  ]
279
- }), /* @__PURE__ */ m("div", {
284
+ }), /* @__PURE__ */ h("div", {
280
285
  className: "flex gap-1 mt-1",
281
- children: e.labels.map((e) => /* @__PURE__ */ m("span", {
286
+ children: e.labels.map((e) => /* @__PURE__ */ h("span", {
282
287
  className: "text-[10px] px-1.5 py-0.5 rounded bg-muted",
283
288
  children: e
284
289
  }, e))
285
- })] }), /* @__PURE__ */ h("div", {
290
+ })] }), /* @__PURE__ */ g("div", {
286
291
  className: "flex items-center gap-2",
287
- children: [/* @__PURE__ */ h("span", {
292
+ children: [/* @__PURE__ */ g("span", {
288
293
  className: "text-xs text-muted-foreground",
289
294
  children: [e.storyPoints ?? 0, " pts"]
290
- }), /* @__PURE__ */ m(g, {
295
+ }), /* @__PURE__ */ h(_, {
291
296
  variant: "secondary",
292
297
  className: "capitalize text-xs",
293
298
  children: e.status.toLowerCase().replace("_", " ")
294
299
  })]
295
300
  })]
296
- }, e.id)), O.length === 0 && /* @__PURE__ */ m("p", {
301
+ }, e.id)), k.length === 0 && /* @__PURE__ */ h("p", {
297
302
  className: "text-sm text-muted-foreground text-center py-4",
298
303
  children: "No work items yet."
299
304
  })]
300
305
  })] })
301
306
  ]
302
- }), /* @__PURE__ */ h("div", {
307
+ }), /* @__PURE__ */ g("div", {
303
308
  className: "space-y-6",
304
- children: [/* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ h(b, { children: [
309
+ children: [/* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ g(x, { children: [
305
310
  "Milestones (",
306
- A.length,
311
+ j.length,
307
312
  ")"
308
- ] }) }), /* @__PURE__ */ h(v, {
313
+ ] }) }), /* @__PURE__ */ g(y, {
309
314
  className: "space-y-3",
310
- children: [A.map((e) => /* @__PURE__ */ h("div", {
315
+ children: [j.map((e) => /* @__PURE__ */ g("div", {
311
316
  className: "border-b pb-2 last:border-0",
312
- children: [/* @__PURE__ */ h("div", {
317
+ children: [/* @__PURE__ */ g("div", {
313
318
  className: "flex justify-between",
314
- children: [/* @__PURE__ */ m("span", {
319
+ children: [/* @__PURE__ */ h("span", {
315
320
  className: "text-sm font-medium",
316
321
  children: e.name
317
- }), /* @__PURE__ */ m(g, {
322
+ }), /* @__PURE__ */ h(_, {
318
323
  variant: "outline",
319
324
  className: "text-xs capitalize",
320
325
  children: e.status.toLowerCase().replace("_", " ")
321
326
  })]
322
- }), /* @__PURE__ */ h("div", {
327
+ }), /* @__PURE__ */ g("div", {
323
328
  className: "flex items-center gap-1 text-xs text-muted-foreground mt-1",
324
- children: [/* @__PURE__ */ m(s, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
329
+ children: [/* @__PURE__ */ h(c, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
325
330
  })]
326
- }, e.id)), A.length === 0 && /* @__PURE__ */ m("p", {
331
+ }, e.id)), j.length === 0 && /* @__PURE__ */ h("p", {
327
332
  className: "text-sm text-muted-foreground text-center py-2",
328
333
  children: "No milestones."
329
334
  })]
330
- })] }), /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ m(b, { children: "Details" }) }), /* @__PURE__ */ h(v, {
335
+ })] }), /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: "Details" }) }), /* @__PURE__ */ g(y, {
331
336
  className: "space-y-2 text-sm",
332
337
  children: [
333
- /* @__PURE__ */ h("div", {
338
+ /* @__PURE__ */ g("div", {
334
339
  className: "flex justify-between",
335
- children: [/* @__PURE__ */ m("span", {
340
+ children: [/* @__PURE__ */ h("span", {
336
341
  className: "text-muted-foreground",
337
342
  children: "Owner"
338
- }), /* @__PURE__ */ m("span", { children: /* @__PURE__ */ m(t, { id: D.ownerId }) })]
343
+ }), /* @__PURE__ */ h("span", { children: /* @__PURE__ */ h(t, { id: O.ownerId }) })]
339
344
  }),
340
- /* @__PURE__ */ h("div", {
345
+ /* @__PURE__ */ g("div", {
341
346
  className: "flex justify-between",
342
- children: [/* @__PURE__ */ m("span", {
347
+ children: [/* @__PURE__ */ h("span", {
343
348
  className: "text-muted-foreground",
344
349
  children: "Key"
345
- }), /* @__PURE__ */ m("span", {
350
+ }), /* @__PURE__ */ h("span", {
346
351
  className: "font-mono",
347
- children: D.key
352
+ children: O.key
348
353
  })]
349
354
  }),
350
- /* @__PURE__ */ h("div", {
355
+ /* @__PURE__ */ g("div", {
351
356
  className: "flex justify-between",
352
- children: [/* @__PURE__ */ m("span", {
357
+ children: [/* @__PURE__ */ h("span", {
353
358
  className: "text-muted-foreground",
354
359
  children: "Methodology"
355
- }), /* @__PURE__ */ m("span", {
360
+ }), /* @__PURE__ */ h("span", {
356
361
  className: "capitalize",
357
- children: D.methodology.toLowerCase()
362
+ children: O.methodology.toLowerCase()
363
+ })]
364
+ }),
365
+ /* @__PURE__ */ g("div", {
366
+ className: "flex justify-between",
367
+ children: [/* @__PURE__ */ h("span", {
368
+ className: "text-muted-foreground",
369
+ children: "Program"
370
+ }), O.program ? /* @__PURE__ */ h("button", {
371
+ type: "button",
372
+ className: "text-primary hover:underline underline-offset-2",
373
+ onClick: () => w(i("/products/program-detail-page", O.program.id)),
374
+ children: O.program.name
375
+ }) : /* @__PURE__ */ h("span", {
376
+ className: "text-muted-foreground",
377
+ children: "No program"
358
378
  })]
359
379
  }),
360
- D.tags.length > 0 && /* @__PURE__ */ h("div", {
380
+ O.tags.length > 0 && /* @__PURE__ */ g("div", {
361
381
  className: "flex justify-between items-start",
362
- children: [/* @__PURE__ */ m("span", {
382
+ children: [/* @__PURE__ */ h("span", {
363
383
  className: "text-muted-foreground",
364
384
  children: "Tags"
365
- }), /* @__PURE__ */ m("div", {
385
+ }), /* @__PURE__ */ h("div", {
366
386
  className: "flex gap-1 flex-wrap justify-end",
367
- children: D.tags.map((e) => /* @__PURE__ */ m(g, {
387
+ children: O.tags.map((e) => /* @__PURE__ */ h(_, {
368
388
  variant: "outline",
369
389
  className: "text-xs",
370
390
  children: e
@@ -379,6 +399,6 @@ function C() {
379
399
  });
380
400
  }
381
401
  //#endregion
382
- export { C as ProjectsProjectDetailPagePage };
402
+ export { w as ProjectsProjectDetailPagePage };
383
403
 
384
404
  //# sourceMappingURL=ProjectsProjectDetailPagePage.js.map