@burdenoff/microfe-planmagnet 2026.830.1 → 2026.923.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 (58) hide show
  1. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoutes.js +52 -0
  3. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  4. package/dist/planmagnet/hooks/useEntityId.d.ts +14 -0
  5. package/dist/planmagnet/hooks/useEntityId.d.ts.map +1 -0
  6. package/dist/planmagnet/hooks/useEntityId.js +15 -0
  7. package/dist/planmagnet/hooks/useEntityId.js.map +1 -0
  8. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  9. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +148 -144
  10. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  11. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  12. package/dist/planmagnet/pages/ProductsProductsPagePage.js +85 -84
  13. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  14. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  15. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +95 -91
  16. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  17. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
  18. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +117 -113
  19. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  20. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
  21. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +74 -70
  22. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
  23. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  24. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +21 -17
  25. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  26. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  27. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +21 -16
  28. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  29. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  30. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +67 -63
  31. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  32. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  33. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +61 -56
  34. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  35. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
  36. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +107 -99
  37. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
  38. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -1
  39. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +94 -90
  40. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -1
  41. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  42. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +46 -41
  43. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  44. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  45. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +110 -106
  46. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  47. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +2 -2
  48. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +2 -2
  50. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  51. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  52. package/dist/planmagnet/pages/TasksTasksPagePage.js +67 -66
  53. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  54. package/dist/planmagnet/utils/rowNavigation.d.ts +29 -0
  55. package/dist/planmagnet/utils/rowNavigation.d.ts.map +1 -0
  56. package/dist/planmagnet/utils/rowNavigation.js +20 -0
  57. package/dist/planmagnet/utils/rowNavigation.js.map +1 -0
  58. package/package.json +1 -1
@@ -1,13 +1,14 @@
1
- import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { useState as t } from "react";
3
- import { Calendar as n, GitBranch as r, Loader2 as i, Map as a, Package as o, Plus as s } from "lucide-react";
4
- import { gql as c } from "@apollo/client";
5
- import { useQuery as l } from "@apollo/client/react";
6
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
- import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { Badge as p, Button as m, Card as h, CardContent as g, CardHeader as _, CardTitle as v } from "@burdenoff/fe-libs/ui";
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { detailPath as n, rowLinkProps as r } from "../utils/rowNavigation.js";
3
+ import { useState as i } from "react";
4
+ import { Calendar as a, GitBranch as o, Loader2 as s, Map as c, Package as l, Plus as u } from "lucide-react";
5
+ import { gql as d } from "@apollo/client";
6
+ import { useQuery as f } from "@apollo/client/react";
7
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
8
+ import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
+ import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/planmagnet/pages/ProductsProductsPagePage.tsx
10
- var y = c`
11
+ var S = d`
11
12
  query ListRoadmaps($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
12
13
  planmagnetRoadmaps(workspaceId: $workspaceId, pagination: $pagination) {
13
14
  items {
@@ -31,52 +32,52 @@ var y = c`
31
32
  totalCount
32
33
  }
33
34
  }
34
- `, b = c`
35
+ `, C = d`
35
36
  query ListFeatureRequestsForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
36
37
  planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {
37
38
  totalCount
38
39
  }
39
40
  }
40
- `, x = c`
41
+ `, w = d`
41
42
  query ListReleasesForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
42
43
  planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {
43
44
  totalCount
44
45
  }
45
46
  }
46
47
  `;
47
- function S() {
48
- let { workspaceId: c } = e(), { t: S } = f(), [C, w] = t("grid"), { data: T, loading: E, error: D } = l(y, {
48
+ function T() {
49
+ let { workspaceId: d } = e(), T = t(), { t: E } = h(), [D, O] = i("grid"), { data: k, loading: A, error: j } = f(S, {
49
50
  variables: {
50
- workspaceId: c,
51
+ workspaceId: d,
51
52
  pagination: { first: 50 }
52
53
  },
53
- skip: !c
54
- }), { data: O } = l(b, {
54
+ skip: !d
55
+ }), { data: M } = f(C, {
55
56
  variables: {
56
- workspaceId: c,
57
+ workspaceId: d,
57
58
  pagination: { first: 1 }
58
59
  },
59
- skip: !c
60
- }), { data: k } = l(x, {
60
+ skip: !d
61
+ }), { data: N } = f(w, {
61
62
  variables: {
62
- workspaceId: c,
63
+ workspaceId: d,
63
64
  pagination: { first: 1 }
64
65
  },
65
- skip: !c
66
+ skip: !d
66
67
  });
67
- if (E) return /* @__PURE__ */ u("div", {
68
+ if (A) return /* @__PURE__ */ p("div", {
68
69
  className: "flex items-center justify-center p-12",
69
- children: /* @__PURE__ */ u(i, { className: "h-8 w-8 animate-spin text-muted-foreground" })
70
+ children: /* @__PURE__ */ p(s, { className: "h-8 w-8 animate-spin text-muted-foreground" })
70
71
  });
71
- if (D) return /* @__PURE__ */ d("div", {
72
+ if (j) return /* @__PURE__ */ m("div", {
72
73
  className: "p-6 text-destructive",
73
74
  children: [
74
- S("planmagnet.products.errorLoading", "Failed to load products"),
75
+ E("planmagnet.products.errorLoading", "Failed to load products"),
75
76
  ": ",
76
- D.message
77
+ j.message
77
78
  ]
78
79
  });
79
- let A = T?.planmagnetRoadmaps?.items ?? [], j = T?.planmagnetRoadmaps?.totalCount ?? 0, M = O?.planmagnetFeatureRequests?.totalCount ?? 0, N = k?.planmagnetReleases?.totalCount ?? 0, P = (e) => {
80
+ let P = k?.planmagnetRoadmaps?.items ?? [], F = k?.planmagnetRoadmaps?.totalCount ?? 0, I = M?.planmagnetFeatureRequests?.totalCount ?? 0, L = N?.planmagnetReleases?.totalCount ?? 0, R = (e) => {
80
81
  switch (e) {
81
82
  case "TIMELINE": return "default";
82
83
  case "GANTT": return "secondary";
@@ -84,130 +85,130 @@ function S() {
84
85
  default: return "outline";
85
86
  }
86
87
  };
87
- return /* @__PURE__ */ d("div", {
88
+ return /* @__PURE__ */ m("div", {
88
89
  className: "space-y-6 p-6",
89
90
  children: [
90
- /* @__PURE__ */ d("div", {
91
+ /* @__PURE__ */ m("div", {
91
92
  className: "flex items-center justify-between",
92
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("h1", {
93
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("h1", {
93
94
  className: "text-2xl font-semibold flex items-center gap-2",
94
95
  children: [
95
- /* @__PURE__ */ u(o, { className: "h-6 w-6" }),
96
+ /* @__PURE__ */ p(l, { className: "h-6 w-6" }),
96
97
  " ",
97
- S("planmagnet.products.title", "Products")
98
+ E("planmagnet.products.title", "Products")
98
99
  ]
99
- }), /* @__PURE__ */ u("p", {
100
+ }), /* @__PURE__ */ p("p", {
100
101
  className: "text-sm text-muted-foreground mt-1",
101
- children: S("planmagnet.products.subtitle", "Manage your product portfolio and track feature development")
102
- })] }), /* @__PURE__ */ d(m, {
102
+ children: E("planmagnet.products.subtitle", "Manage your product portfolio and track feature development")
103
+ })] }), /* @__PURE__ */ m(_, {
103
104
  size: "sm",
104
- children: [/* @__PURE__ */ u(s, { className: "h-4 w-4 mr-1" }), S("planmagnet.products.actions.newProduct", "New Product")]
105
+ children: [/* @__PURE__ */ p(u, { className: "h-4 w-4 mr-1" }), E("planmagnet.products.actions.newProduct", "New Product")]
105
106
  })]
106
107
  }),
107
- /* @__PURE__ */ u("div", {
108
+ /* @__PURE__ */ p("div", {
108
109
  className: "grid gap-4 md:grid-cols-4",
109
110
  children: [
110
111
  {
111
- label: S("planmagnet.products.metrics.totalProducts", "Total Products"),
112
- val: j,
113
- icon: o,
112
+ label: E("planmagnet.products.metrics.totalProducts", "Total Products"),
113
+ val: F,
114
+ icon: l,
114
115
  color: "text-blue-500"
115
116
  },
116
117
  {
117
- label: S("planmagnet.products.metrics.activeFeatures", "Active Features"),
118
- val: M,
119
- icon: r,
118
+ label: E("planmagnet.products.metrics.activeFeatures", "Active Features"),
119
+ val: I,
120
+ icon: o,
120
121
  color: "text-green-500"
121
122
  },
122
123
  {
123
- label: S("planmagnet.products.metrics.releases", "Releases"),
124
- val: N,
125
- icon: n,
124
+ label: E("planmagnet.products.metrics.releases", "Releases"),
125
+ val: L,
126
+ icon: a,
126
127
  color: "text-purple-500"
127
128
  },
128
129
  {
129
- label: S("planmagnet.products.metrics.roadmaps", "Roadmaps"),
130
- val: j,
131
- icon: a,
130
+ label: E("planmagnet.products.metrics.roadmaps", "Roadmaps"),
131
+ val: F,
132
+ icon: c,
132
133
  color: "text-orange-500"
133
134
  }
134
- ].map((e) => /* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, {
135
+ ].map((e) => /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, {
135
136
  className: "pt-6",
136
- children: /* @__PURE__ */ d("div", {
137
+ children: /* @__PURE__ */ m("div", {
137
138
  className: "flex items-center justify-between",
138
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
139
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
139
140
  className: "text-sm text-muted-foreground",
140
141
  children: e.label
141
- }), /* @__PURE__ */ u("p", {
142
+ }), /* @__PURE__ */ p("p", {
142
143
  className: "text-2xl font-bold",
143
144
  children: e.val
144
- })] }), /* @__PURE__ */ u(e.icon, { className: `h-8 w-8 ${e.color} opacity-60` })]
145
+ })] }), /* @__PURE__ */ p(e.icon, { className: `h-8 w-8 ${e.color} opacity-60` })]
145
146
  })
146
147
  }) }, e.label))
147
148
  }),
148
- /* @__PURE__ */ u("div", {
149
+ /* @__PURE__ */ p("div", {
149
150
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-2",
150
- children: A.map((e) => /* @__PURE__ */ d(h, {
151
- className: "hover:shadow-md transition-shadow",
152
- children: [/* @__PURE__ */ u(_, { children: /* @__PURE__ */ d("div", {
151
+ children: P.map((e) => /* @__PURE__ */ m(v, {
152
+ ...r(() => T(n("/products/product-detail-page", e.id)), e.name),
153
+ children: [/* @__PURE__ */ p(b, { children: /* @__PURE__ */ m("div", {
153
154
  className: "flex items-center justify-between",
154
- children: [/* @__PURE__ */ u(v, {
155
+ children: [/* @__PURE__ */ p(x, {
155
156
  className: "text-base",
156
157
  children: e.name
157
- }), /* @__PURE__ */ u(p, {
158
- variant: P(e.type),
158
+ }), /* @__PURE__ */ p(g, {
159
+ variant: R(e.type),
159
160
  children: e.type.toLowerCase()
160
161
  })]
161
- }) }), /* @__PURE__ */ d(g, {
162
+ }) }), /* @__PURE__ */ m(y, {
162
163
  className: "space-y-3",
163
164
  children: [
164
- /* @__PURE__ */ u("p", {
165
+ /* @__PURE__ */ p("p", {
165
166
  className: "text-sm text-muted-foreground",
166
- children: e.description ?? S("planmagnet.products.shared.noDescription", "No description")
167
+ children: e.description ?? E("planmagnet.products.shared.noDescription", "No description")
167
168
  }),
168
- /* @__PURE__ */ d("div", {
169
+ /* @__PURE__ */ m("div", {
169
170
  className: "grid grid-cols-3 gap-2 text-center",
170
171
  children: [
171
- /* @__PURE__ */ d("div", {
172
+ /* @__PURE__ */ m("div", {
172
173
  className: "rounded border p-2",
173
- children: [/* @__PURE__ */ u("p", {
174
+ children: [/* @__PURE__ */ p("p", {
174
175
  className: "text-lg font-bold",
175
176
  children: e.items?.length ?? 0
176
- }), /* @__PURE__ */ u("p", {
177
+ }), /* @__PURE__ */ p("p", {
177
178
  className: "text-xs text-muted-foreground",
178
- children: S("planmagnet.products.shared.items", "Items")
179
+ children: E("planmagnet.products.shared.items", "Items")
179
180
  })]
180
181
  }),
181
- /* @__PURE__ */ d("div", {
182
+ /* @__PURE__ */ m("div", {
182
183
  className: "rounded border p-2",
183
- children: [/* @__PURE__ */ u("p", {
184
+ children: [/* @__PURE__ */ p("p", {
184
185
  className: "text-lg font-bold",
185
- children: e.isPublic ? S("planmagnet.products.shared.public", "Public") : S("planmagnet.products.shared.private", "Private")
186
- }), /* @__PURE__ */ u("p", {
186
+ children: e.isPublic ? E("planmagnet.products.shared.public", "Public") : E("planmagnet.products.shared.private", "Private")
187
+ }), /* @__PURE__ */ p("p", {
187
188
  className: "text-xs text-muted-foreground",
188
- children: S("planmagnet.products.shared.visibility", "Visibility")
189
+ children: E("planmagnet.products.shared.visibility", "Visibility")
189
190
  })]
190
191
  }),
191
- /* @__PURE__ */ d("div", {
192
+ /* @__PURE__ */ m("div", {
192
193
  className: "rounded border p-2",
193
- children: [/* @__PURE__ */ u("p", {
194
+ children: [/* @__PURE__ */ p("p", {
194
195
  className: "text-lg font-bold",
195
196
  children: e.type.toLowerCase()
196
- }), /* @__PURE__ */ u("p", {
197
+ }), /* @__PURE__ */ p("p", {
197
198
  className: "text-xs text-muted-foreground",
198
- children: S("planmagnet.products.shared.type", "Type")
199
+ children: E("planmagnet.products.shared.type", "Type")
199
200
  })]
200
201
  })
201
202
  ]
202
203
  }),
203
- /* @__PURE__ */ d("div", {
204
+ /* @__PURE__ */ m("div", {
204
205
  className: "flex items-center justify-between text-xs text-muted-foreground",
205
- children: [/* @__PURE__ */ d("span", { children: [
206
- S("planmagnet.products.shared.owner", "Owner"),
206
+ children: [/* @__PURE__ */ m("span", { children: [
207
+ E("planmagnet.products.shared.owner", "Owner"),
207
208
  ": ",
208
209
  e.ownerId
209
- ] }), /* @__PURE__ */ d("span", { children: [
210
- S("planmagnet.products.shared.updated", "Updated"),
210
+ ] }), /* @__PURE__ */ m("span", { children: [
211
+ E("planmagnet.products.shared.updated", "Updated"),
211
212
  " ",
212
213
  new Date(e.updatedAt).toLocaleDateString()
213
214
  ] })]
@@ -220,6 +221,6 @@ function S() {
220
221
  });
221
222
  }
222
223
  //#endregion
223
- export { S as ProductsProductsPagePage };
224
+ export { T as ProductsProductsPagePage };
224
225
 
225
226
  //# sourceMappingURL=ProductsProductsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsProductsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductsPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Package, Plus, TrendingUp, Calendar, GitBranch, Map, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst LIST_ROADMAPS = gql`\n query ListRoadmaps($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetRoadmaps(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n metadata\n createdBy\n createdAt\n updatedAt\n updatedBy\n items {\n id\n status\n }\n }\n totalCount\n }\n }\n`;\n\nconst LIST_FEATURE_REQUESTS = gql`\n query ListFeatureRequestsForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\nconst LIST_RELEASES = gql`\n query ListReleasesForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\ninterface RoadmapNode {\n id: string;\n name: string;\n description: string | null;\n type: string;\n isPublic: boolean;\n ownerId: string;\n createdAt: string;\n updatedAt: string;\n items: { id: string; status: string }[];\n}\n\nexport function ProductsProductsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const { t } = useI18n();\n const [view, setView] = useState<'grid' | 'list'>('grid');\n\n const {\n data: roadmapsData,\n loading: roadmapsLoading,\n error: roadmapsError,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = useQuery<Record<string, any>>(LIST_ROADMAPS, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n variables: { workspaceId, pagination: { first: 50 } },\n skip: !workspaceId,\n });\n\n const {\n data: featuresData,\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>>(LIST_FEATURE_REQUESTS, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n const {\n data: releasesData,\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>>(LIST_RELEASES, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n if (roadmapsLoading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (roadmapsError) {\n return (\n <div className=\"p-6 text-destructive\">\n {t('planmagnet.products.errorLoading', 'Failed to load products')}: {roadmapsError.message}\n </div>\n );\n }\n\n const roadmaps: RoadmapNode[] = roadmapsData?.planmagnetRoadmaps?.items ?? [];\n const totalRoadmaps = roadmapsData?.planmagnetRoadmaps?.totalCount ?? 0;\n const totalFeatures = featuresData?.planmagnetFeatureRequests?.totalCount ?? 0;\n const totalReleases = releasesData?.planmagnetReleases?.totalCount ?? 0;\n\n const typeLabel = (t: string) => {\n switch (t) {\n case 'TIMELINE':\n return 'default';\n case 'GANTT':\n return 'secondary';\n case 'SWIMLANE':\n return 'outline';\n default:\n return 'outline';\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold flex items-center gap-2\">\n <Package className=\"h-6 w-6\" /> {t('planmagnet.products.title', 'Products')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {t(\n 'planmagnet.products.subtitle',\n 'Manage your product portfolio and track feature development'\n )}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('planmagnet.products.actions.newProduct', 'New Product')}\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n label: t('planmagnet.products.metrics.totalProducts', 'Total Products'),\n val: totalRoadmaps,\n icon: Package,\n color: 'text-blue-500',\n },\n {\n label: t('planmagnet.products.metrics.activeFeatures', 'Active Features'),\n val: totalFeatures,\n icon: GitBranch,\n color: 'text-green-500',\n },\n {\n label: t('planmagnet.products.metrics.releases', 'Releases'),\n val: totalReleases,\n icon: Calendar,\n color: 'text-purple-500',\n },\n {\n label: t('planmagnet.products.metrics.roadmaps', 'Roadmaps'),\n val: totalRoadmaps,\n icon: Map,\n color: 'text-orange-500',\n },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">{s.label}</p>\n <p className=\"text-2xl font-bold\">{s.val}</p>\n </div>\n <s.icon className={`h-8 w-8 ${s.color} opacity-60`} />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-2\">\n {roadmaps.map((roadmap) => (\n <Card key={roadmap.id} className=\"hover:shadow-md transition-shadow\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{roadmap.name}</CardTitle>\n <Badge variant={typeLabel(roadmap.type)}>{roadmap.type.toLowerCase()}</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {roadmap.description ??\n t('planmagnet.products.shared.noDescription', 'No description')}\n </p>\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.items?.length ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.items', 'Items')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">\n {roadmap.isPublic\n ? t('planmagnet.products.shared.public', 'Public')\n : t('planmagnet.products.shared.private', 'Private')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.visibility', 'Visibility')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.type.toLowerCase()}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.type', 'Type')}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {t('planmagnet.products.shared.owner', 'Owner')}: {roadmap.ownerId}\n </span>\n <span>\n {t('planmagnet.products.shared.updated', 'Updated')}{' '}\n {new Date(roadmap.updatedAt).toLocaleDateString()}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProductsProductsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductsPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Package, Plus, TrendingUp, Calendar, GitBranch, Map, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\n\nconst LIST_ROADMAPS = gql`\n query ListRoadmaps($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetRoadmaps(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n metadata\n createdBy\n createdAt\n updatedAt\n updatedBy\n items {\n id\n status\n }\n }\n totalCount\n }\n }\n`;\n\nconst LIST_FEATURE_REQUESTS = gql`\n query ListFeatureRequestsForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\nconst LIST_RELEASES = gql`\n query ListReleasesForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\ninterface RoadmapNode {\n id: string;\n name: string;\n description: string | null;\n type: string;\n isPublic: boolean;\n ownerId: string;\n createdAt: string;\n updatedAt: string;\n items: { id: string; status: string }[];\n}\n\nexport function ProductsProductsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { t } = useI18n();\n const [view, setView] = useState<'grid' | 'list'>('grid');\n\n const {\n data: roadmapsData,\n loading: roadmapsLoading,\n error: roadmapsError,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = useQuery<Record<string, any>>(LIST_ROADMAPS, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n variables: { workspaceId, pagination: { first: 50 } },\n skip: !workspaceId,\n });\n\n const {\n data: featuresData,\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>>(LIST_FEATURE_REQUESTS, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n const {\n data: releasesData,\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>>(LIST_RELEASES, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n if (roadmapsLoading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (roadmapsError) {\n return (\n <div className=\"p-6 text-destructive\">\n {t('planmagnet.products.errorLoading', 'Failed to load products')}: {roadmapsError.message}\n </div>\n );\n }\n\n const roadmaps: RoadmapNode[] = roadmapsData?.planmagnetRoadmaps?.items ?? [];\n const totalRoadmaps = roadmapsData?.planmagnetRoadmaps?.totalCount ?? 0;\n const totalFeatures = featuresData?.planmagnetFeatureRequests?.totalCount ?? 0;\n const totalReleases = releasesData?.planmagnetReleases?.totalCount ?? 0;\n\n const typeLabel = (t: string) => {\n switch (t) {\n case 'TIMELINE':\n return 'default';\n case 'GANTT':\n return 'secondary';\n case 'SWIMLANE':\n return 'outline';\n default:\n return 'outline';\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold flex items-center gap-2\">\n <Package className=\"h-6 w-6\" /> {t('planmagnet.products.title', 'Products')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {t(\n 'planmagnet.products.subtitle',\n 'Manage your product portfolio and track feature development'\n )}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('planmagnet.products.actions.newProduct', 'New Product')}\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n label: t('planmagnet.products.metrics.totalProducts', 'Total Products'),\n val: totalRoadmaps,\n icon: Package,\n color: 'text-blue-500',\n },\n {\n label: t('planmagnet.products.metrics.activeFeatures', 'Active Features'),\n val: totalFeatures,\n icon: GitBranch,\n color: 'text-green-500',\n },\n {\n label: t('planmagnet.products.metrics.releases', 'Releases'),\n val: totalReleases,\n icon: Calendar,\n color: 'text-purple-500',\n },\n {\n label: t('planmagnet.products.metrics.roadmaps', 'Roadmaps'),\n val: totalRoadmaps,\n icon: Map,\n color: 'text-orange-500',\n },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">{s.label}</p>\n <p className=\"text-2xl font-bold\">{s.val}</p>\n </div>\n <s.icon className={`h-8 w-8 ${s.color} opacity-60`} />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-2\">\n {roadmaps.map((roadmap) => (\n <Card\n key={roadmap.id}\n {...rowLinkProps(\n () => navigate(detailPath('/products/product-detail-page', roadmap.id)),\n roadmap.name\n )}\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{roadmap.name}</CardTitle>\n <Badge variant={typeLabel(roadmap.type)}>{roadmap.type.toLowerCase()}</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {roadmap.description ??\n t('planmagnet.products.shared.noDescription', 'No description')}\n </p>\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.items?.length ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.items', 'Items')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">\n {roadmap.isPublic\n ? t('planmagnet.products.shared.public', 'Public')\n : t('planmagnet.products.shared.private', 'Private')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.visibility', 'Visibility')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.type.toLowerCase()}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.type', 'Type')}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {t('planmagnet.products.shared.owner', 'Owner')}: {roadmap.ownerId}\n </span>\n <span>\n {t('planmagnet.products.shared.updated', 'Updated')}{' '}\n {new Date(roadmap.updatedAt).toLocaleDateString()}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsReleasesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsReleasesPagePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,wBAAwB,4CA0HvC"}
1
+ {"version":3,"file":"ProductsReleasesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsReleasesPagePage.tsx"],"names":[],"mappings":"AAwEA,wBAAgB,wBAAwB,4CAiIvC"}
@@ -1,12 +1,13 @@
1
- import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { useState as t } from "react";
3
- import { Calendar as n, GitBranch as r, Loader2 as i, Package as a } from "lucide-react";
4
- import { gql as o } from "@apollo/client";
5
- import { useQuery as s } from "@apollo/client/react";
6
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
- import { Badge as u, Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h } from "@burdenoff/fe-libs/ui";
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { detailPath as n, rowLinkProps as r } from "../utils/rowNavigation.js";
3
+ import { useState as i } from "react";
4
+ import { Calendar as a, GitBranch as o, Loader2 as s, Package as c } from "lucide-react";
5
+ import { gql as l } from "@apollo/client";
6
+ import { useQuery as u } from "@apollo/client/react";
7
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
+ import { Badge as p, Button as m, Card as h, CardContent as g, CardHeader as _, CardTitle as v } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/planmagnet/pages/ProductsReleasesPagePage.tsx
9
- var g = o`
10
+ var y = l`
10
11
  query ListReleases(
11
12
  $workspaceId: ID!
12
13
  $filter: PlanmagnetReleaseFilter
@@ -32,7 +33,7 @@ var g = o`
32
33
  totalCount
33
34
  }
34
35
  }
35
- `, _ = [
36
+ `, b = [
36
37
  "all",
37
38
  "DRAFT",
38
39
  "PLANNING",
@@ -40,7 +41,7 @@ var g = o`
40
41
  "READY",
41
42
  "RELEASED",
42
43
  "CANCELLED"
43
- ], v = {
44
+ ], x = {
44
45
  DRAFT: "bg-gray-100 text-gray-800",
45
46
  PLANNING: "bg-yellow-100 text-yellow-800",
46
47
  IN_PROGRESS: "bg-blue-100 text-blue-800",
@@ -49,111 +50,114 @@ var g = o`
49
50
  CANCELLED: "bg-red-100 text-red-800",
50
51
  ROLLED_BACK: "bg-red-100 text-red-800"
51
52
  };
52
- function y() {
53
- let { workspaceId: o } = e(), [y, b] = t("all"), { data: x, loading: S, error: C } = s(g, {
53
+ function S() {
54
+ let { workspaceId: l } = e(), S = t(), [C, w] = i("all"), { data: T, loading: E, error: D } = u(y, {
54
55
  variables: {
55
- workspaceId: o,
56
- filter: y === "all" ? void 0 : { status: y },
56
+ workspaceId: l,
57
+ filter: C === "all" ? void 0 : { status: C },
57
58
  pagination: { first: 50 }
58
59
  },
59
- skip: !o
60
+ skip: !l
60
61
  });
61
- if (S) return /* @__PURE__ */ c("div", {
62
+ if (E) return /* @__PURE__ */ d("div", {
62
63
  className: "flex items-center justify-center p-12",
63
- children: /* @__PURE__ */ c(i, { className: "h-8 w-8 animate-spin text-muted-foreground" })
64
+ children: /* @__PURE__ */ d(s, { className: "h-8 w-8 animate-spin text-muted-foreground" })
64
65
  });
65
- if (C) return /* @__PURE__ */ l("div", {
66
+ if (D) return /* @__PURE__ */ f("div", {
66
67
  className: "p-6 text-destructive",
67
- children: ["Failed to load releases: ", C.message]
68
+ children: ["Failed to load releases: ", D.message]
68
69
  });
69
- let w = x?.planmagnetReleases?.items ?? [], T = x?.planmagnetReleases?.totalCount ?? 0;
70
- return /* @__PURE__ */ l("div", {
70
+ let O = T?.planmagnetReleases?.items ?? [], k = T?.planmagnetReleases?.totalCount ?? 0;
71
+ return /* @__PURE__ */ f("div", {
71
72
  className: "space-y-6 p-6",
72
73
  children: [
73
- /* @__PURE__ */ l("div", {
74
+ /* @__PURE__ */ f("div", {
74
75
  className: "flex items-center justify-between",
75
- children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
76
+ children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
76
77
  className: "text-2xl font-semibold",
77
78
  children: "Releases"
78
- }), /* @__PURE__ */ l("p", {
79
+ }), /* @__PURE__ */ f("p", {
79
80
  className: "text-sm text-muted-foreground",
80
- children: [T, " releases across all products"]
81
- })] }), /* @__PURE__ */ l(d, {
81
+ children: [k, " releases across all products"]
82
+ })] }), /* @__PURE__ */ f(m, {
82
83
  size: "sm",
83
- children: [/* @__PURE__ */ c(r, { className: "mr-1 h-4 w-4" }), "New Release"]
84
+ children: [/* @__PURE__ */ d(o, { className: "mr-1 h-4 w-4" }), "New Release"]
84
85
  })]
85
86
  }),
86
- /* @__PURE__ */ c("div", {
87
+ /* @__PURE__ */ d("div", {
87
88
  className: "flex gap-1 border-b pb-1",
88
- children: _.map((e) => /* @__PURE__ */ c("button", {
89
- onClick: () => b(e),
90
- className: `px-3 py-1.5 text-sm rounded-md capitalize ${y === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
89
+ children: b.map((e) => /* @__PURE__ */ d("button", {
90
+ onClick: () => w(e),
91
+ className: `px-3 py-1.5 text-sm rounded-md capitalize ${C === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
91
92
  children: e === "all" ? "All" : e.toLowerCase().replace("_", " ")
92
93
  }, e))
93
94
  }),
94
- /* @__PURE__ */ c("div", {
95
+ /* @__PURE__ */ d("div", {
95
96
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
96
- children: w.map((e) => /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(m, {
97
- className: "pb-2",
98
- children: [/* @__PURE__ */ l("div", {
99
- className: "flex items-center justify-between",
100
- children: [/* @__PURE__ */ c("div", {
101
- className: "flex items-center gap-2",
102
- children: /* @__PURE__ */ c("span", {
103
- className: "text-lg font-semibold",
104
- children: e.version
105
- })
106
- }), /* @__PURE__ */ c("span", {
107
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${v[e.status] ?? "bg-gray-100"}`,
108
- children: e.status.toLowerCase().replace("_", " ")
97
+ children: O.map((e) => /* @__PURE__ */ f(h, {
98
+ ...r(() => S(n("/products/release-detail-page", e.id)), e.name),
99
+ children: [/* @__PURE__ */ f(_, {
100
+ className: "pb-2",
101
+ children: [/* @__PURE__ */ f("div", {
102
+ className: "flex items-center justify-between",
103
+ children: [/* @__PURE__ */ d("div", {
104
+ className: "flex items-center gap-2",
105
+ children: /* @__PURE__ */ d("span", {
106
+ className: "text-lg font-semibold",
107
+ children: e.version
108
+ })
109
+ }), /* @__PURE__ */ d("span", {
110
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${x[e.status] ?? "bg-gray-100"}`,
111
+ children: e.status.toLowerCase().replace("_", " ")
112
+ })]
113
+ }), /* @__PURE__ */ d(v, {
114
+ className: "text-sm font-medium",
115
+ children: e.name
109
116
  })]
110
- }), /* @__PURE__ */ c(h, {
111
- className: "text-sm font-medium",
112
- children: e.name
117
+ }), /* @__PURE__ */ f(g, {
118
+ className: "space-y-3",
119
+ children: [
120
+ /* @__PURE__ */ d("p", {
121
+ className: "text-sm text-muted-foreground",
122
+ children: e.description ?? "No description"
123
+ }),
124
+ /* @__PURE__ */ f("div", {
125
+ className: "flex items-center gap-4 text-sm",
126
+ children: [/* @__PURE__ */ f("div", {
127
+ className: "flex items-center gap-1 text-muted-foreground",
128
+ children: [
129
+ /* @__PURE__ */ d(c, { className: "h-3.5 w-3.5" }),
130
+ "Owner: ",
131
+ e.ownerId
132
+ ]
133
+ }), /* @__PURE__ */ f("div", {
134
+ className: "flex items-center gap-1 text-muted-foreground",
135
+ children: [/* @__PURE__ */ d(a, { className: "h-3.5 w-3.5" }), e.plannedDate ? new Date(e.plannedDate).toLocaleDateString() : "No date"]
136
+ })]
137
+ }),
138
+ e.tags.length > 0 && /* @__PURE__ */ d("div", {
139
+ className: "flex gap-1 flex-wrap",
140
+ children: e.tags.map((e) => /* @__PURE__ */ d(p, {
141
+ variant: "outline",
142
+ className: "text-xs",
143
+ children: e
144
+ }, e))
145
+ }),
146
+ e.releaseNotes && /* @__PURE__ */ f("div", {
147
+ className: "border-t pt-2",
148
+ children: [/* @__PURE__ */ d("p", {
149
+ className: "text-xs font-medium text-muted-foreground mb-1",
150
+ children: "Release Notes Preview"
151
+ }), /* @__PURE__ */ d("p", {
152
+ className: "text-xs text-muted-foreground line-clamp-3",
153
+ children: e.releaseNotes
154
+ })]
155
+ })
156
+ ]
113
157
  })]
114
- }), /* @__PURE__ */ l(p, {
115
- className: "space-y-3",
116
- children: [
117
- /* @__PURE__ */ c("p", {
118
- className: "text-sm text-muted-foreground",
119
- children: e.description ?? "No description"
120
- }),
121
- /* @__PURE__ */ l("div", {
122
- className: "flex items-center gap-4 text-sm",
123
- children: [/* @__PURE__ */ l("div", {
124
- className: "flex items-center gap-1 text-muted-foreground",
125
- children: [
126
- /* @__PURE__ */ c(a, { className: "h-3.5 w-3.5" }),
127
- "Owner: ",
128
- e.ownerId
129
- ]
130
- }), /* @__PURE__ */ l("div", {
131
- className: "flex items-center gap-1 text-muted-foreground",
132
- children: [/* @__PURE__ */ c(n, { className: "h-3.5 w-3.5" }), e.plannedDate ? new Date(e.plannedDate).toLocaleDateString() : "No date"]
133
- })]
134
- }),
135
- e.tags.length > 0 && /* @__PURE__ */ c("div", {
136
- className: "flex gap-1 flex-wrap",
137
- children: e.tags.map((e) => /* @__PURE__ */ c(u, {
138
- variant: "outline",
139
- className: "text-xs",
140
- children: e
141
- }, e))
142
- }),
143
- e.releaseNotes && /* @__PURE__ */ l("div", {
144
- className: "border-t pt-2",
145
- children: [/* @__PURE__ */ c("p", {
146
- className: "text-xs font-medium text-muted-foreground mb-1",
147
- children: "Release Notes Preview"
148
- }), /* @__PURE__ */ c("p", {
149
- className: "text-xs text-muted-foreground line-clamp-3",
150
- children: e.releaseNotes
151
- })]
152
- })
153
- ]
154
- })] }, e.id))
158
+ }, e.id))
155
159
  }),
156
- w.length === 0 && /* @__PURE__ */ c("p", {
160
+ O.length === 0 && /* @__PURE__ */ d("p", {
157
161
  className: "text-center text-muted-foreground py-8",
158
162
  children: "No releases match this filter."
159
163
  })
@@ -161,6 +165,6 @@ function y() {
161
165
  });
162
166
  }
163
167
  //#endregion
164
- export { y as ProductsReleasesPagePage };
168
+ export { S as ProductsReleasesPagePage };
165
169
 
166
170
  //# sourceMappingURL=ProductsReleasesPagePage.js.map