@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.
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +52 -0
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/hooks/useEntityId.d.ts +14 -0
- package/dist/planmagnet/hooks/useEntityId.d.ts.map +1 -0
- package/dist/planmagnet/hooks/useEntityId.js +15 -0
- package/dist/planmagnet/hooks/useEntityId.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +148 -144
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +85 -84
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +95 -91
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +117 -113
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +74 -70
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +21 -17
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +21 -16
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +67 -63
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +61 -56
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +107 -99
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +94 -90
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +46 -41
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +110 -106
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +2 -2
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +2 -2
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js +67 -66
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
- package/dist/planmagnet/utils/rowNavigation.d.ts +29 -0
- package/dist/planmagnet/utils/rowNavigation.d.ts.map +1 -0
- package/dist/planmagnet/utils/rowNavigation.js +20 -0
- package/dist/planmagnet/utils/rowNavigation.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
|
48
|
-
let { workspaceId:
|
|
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:
|
|
51
|
+
workspaceId: d,
|
|
51
52
|
pagination: { first: 50 }
|
|
52
53
|
},
|
|
53
|
-
skip: !
|
|
54
|
-
}), { data:
|
|
54
|
+
skip: !d
|
|
55
|
+
}), { data: M } = f(C, {
|
|
55
56
|
variables: {
|
|
56
|
-
workspaceId:
|
|
57
|
+
workspaceId: d,
|
|
57
58
|
pagination: { first: 1 }
|
|
58
59
|
},
|
|
59
|
-
skip: !
|
|
60
|
-
}), { data:
|
|
60
|
+
skip: !d
|
|
61
|
+
}), { data: N } = f(w, {
|
|
61
62
|
variables: {
|
|
62
|
-
workspaceId:
|
|
63
|
+
workspaceId: d,
|
|
63
64
|
pagination: { first: 1 }
|
|
64
65
|
},
|
|
65
|
-
skip: !
|
|
66
|
+
skip: !d
|
|
66
67
|
});
|
|
67
|
-
if (
|
|
68
|
+
if (A) return /* @__PURE__ */ p("div", {
|
|
68
69
|
className: "flex items-center justify-center p-12",
|
|
69
|
-
children: /* @__PURE__ */
|
|
70
|
+
children: /* @__PURE__ */ p(s, { className: "h-8 w-8 animate-spin text-muted-foreground" })
|
|
70
71
|
});
|
|
71
|
-
if (
|
|
72
|
+
if (j) return /* @__PURE__ */ m("div", {
|
|
72
73
|
className: "p-6 text-destructive",
|
|
73
74
|
children: [
|
|
74
|
-
|
|
75
|
+
E("planmagnet.products.errorLoading", "Failed to load products"),
|
|
75
76
|
": ",
|
|
76
|
-
|
|
77
|
+
j.message
|
|
77
78
|
]
|
|
78
79
|
});
|
|
79
|
-
let
|
|
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__ */
|
|
88
|
+
return /* @__PURE__ */ m("div", {
|
|
88
89
|
className: "space-y-6 p-6",
|
|
89
90
|
children: [
|
|
90
|
-
/* @__PURE__ */
|
|
91
|
+
/* @__PURE__ */ m("div", {
|
|
91
92
|
className: "flex items-center justify-between",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
96
|
+
/* @__PURE__ */ p(l, { className: "h-6 w-6" }),
|
|
96
97
|
" ",
|
|
97
|
-
|
|
98
|
+
E("planmagnet.products.title", "Products")
|
|
98
99
|
]
|
|
99
|
-
}), /* @__PURE__ */
|
|
100
|
+
}), /* @__PURE__ */ p("p", {
|
|
100
101
|
className: "text-sm text-muted-foreground mt-1",
|
|
101
|
-
children:
|
|
102
|
-
})] }), /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
108
|
+
/* @__PURE__ */ p("div", {
|
|
108
109
|
className: "grid gap-4 md:grid-cols-4",
|
|
109
110
|
children: [
|
|
110
111
|
{
|
|
111
|
-
label:
|
|
112
|
-
val:
|
|
113
|
-
icon:
|
|
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:
|
|
118
|
-
val:
|
|
119
|
-
icon:
|
|
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:
|
|
124
|
-
val:
|
|
125
|
-
icon:
|
|
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:
|
|
130
|
-
val:
|
|
131
|
-
icon:
|
|
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__ */
|
|
135
|
+
].map((e) => /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, {
|
|
135
136
|
className: "pt-6",
|
|
136
|
-
children: /* @__PURE__ */
|
|
137
|
+
children: /* @__PURE__ */ m("div", {
|
|
137
138
|
className: "flex items-center justify-between",
|
|
138
|
-
children: [/* @__PURE__ */
|
|
139
|
+
children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
|
|
139
140
|
className: "text-sm text-muted-foreground",
|
|
140
141
|
children: e.label
|
|
141
|
-
}), /* @__PURE__ */
|
|
142
|
+
}), /* @__PURE__ */ p("p", {
|
|
142
143
|
className: "text-2xl font-bold",
|
|
143
144
|
children: e.val
|
|
144
|
-
})] }), /* @__PURE__ */
|
|
145
|
+
})] }), /* @__PURE__ */ p(e.icon, { className: `h-8 w-8 ${e.color} opacity-60` })]
|
|
145
146
|
})
|
|
146
147
|
}) }, e.label))
|
|
147
148
|
}),
|
|
148
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ p("div", {
|
|
149
150
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-2",
|
|
150
|
-
children:
|
|
151
|
-
|
|
152
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
155
|
+
children: [/* @__PURE__ */ p(x, {
|
|
155
156
|
className: "text-base",
|
|
156
157
|
children: e.name
|
|
157
|
-
}), /* @__PURE__ */
|
|
158
|
-
variant:
|
|
158
|
+
}), /* @__PURE__ */ p(g, {
|
|
159
|
+
variant: R(e.type),
|
|
159
160
|
children: e.type.toLowerCase()
|
|
160
161
|
})]
|
|
161
|
-
}) }), /* @__PURE__ */
|
|
162
|
+
}) }), /* @__PURE__ */ m(y, {
|
|
162
163
|
className: "space-y-3",
|
|
163
164
|
children: [
|
|
164
|
-
/* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ p("p", {
|
|
165
166
|
className: "text-sm text-muted-foreground",
|
|
166
|
-
children: e.description ??
|
|
167
|
+
children: e.description ?? E("planmagnet.products.shared.noDescription", "No description")
|
|
167
168
|
}),
|
|
168
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ m("div", {
|
|
169
170
|
className: "grid grid-cols-3 gap-2 text-center",
|
|
170
171
|
children: [
|
|
171
|
-
/* @__PURE__ */
|
|
172
|
+
/* @__PURE__ */ m("div", {
|
|
172
173
|
className: "rounded border p-2",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ p("p", {
|
|
174
175
|
className: "text-lg font-bold",
|
|
175
176
|
children: e.items?.length ?? 0
|
|
176
|
-
}), /* @__PURE__ */
|
|
177
|
+
}), /* @__PURE__ */ p("p", {
|
|
177
178
|
className: "text-xs text-muted-foreground",
|
|
178
|
-
children:
|
|
179
|
+
children: E("planmagnet.products.shared.items", "Items")
|
|
179
180
|
})]
|
|
180
181
|
}),
|
|
181
|
-
/* @__PURE__ */
|
|
182
|
+
/* @__PURE__ */ m("div", {
|
|
182
183
|
className: "rounded border p-2",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
184
|
+
children: [/* @__PURE__ */ p("p", {
|
|
184
185
|
className: "text-lg font-bold",
|
|
185
|
-
children: e.isPublic ?
|
|
186
|
-
}), /* @__PURE__ */
|
|
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:
|
|
189
|
+
children: E("planmagnet.products.shared.visibility", "Visibility")
|
|
189
190
|
})]
|
|
190
191
|
}),
|
|
191
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ m("div", {
|
|
192
193
|
className: "rounded border p-2",
|
|
193
|
-
children: [/* @__PURE__ */
|
|
194
|
+
children: [/* @__PURE__ */ p("p", {
|
|
194
195
|
className: "text-lg font-bold",
|
|
195
196
|
children: e.type.toLowerCase()
|
|
196
|
-
}), /* @__PURE__ */
|
|
197
|
+
}), /* @__PURE__ */ p("p", {
|
|
197
198
|
className: "text-xs text-muted-foreground",
|
|
198
|
-
children:
|
|
199
|
+
children: E("planmagnet.products.shared.type", "Type")
|
|
199
200
|
})]
|
|
200
201
|
})
|
|
201
202
|
]
|
|
202
203
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
+
/* @__PURE__ */ m("div", {
|
|
204
205
|
className: "flex items-center justify-between text-xs text-muted-foreground",
|
|
205
|
-
children: [/* @__PURE__ */
|
|
206
|
-
|
|
206
|
+
children: [/* @__PURE__ */ m("span", { children: [
|
|
207
|
+
E("planmagnet.products.shared.owner", "Owner"),
|
|
207
208
|
": ",
|
|
208
209
|
e.ownerId
|
|
209
|
-
] }), /* @__PURE__ */
|
|
210
|
-
|
|
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 {
|
|
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":"
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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
|
|
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
|
-
],
|
|
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
|
|
53
|
-
let { workspaceId:
|
|
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:
|
|
56
|
-
filter:
|
|
56
|
+
workspaceId: l,
|
|
57
|
+
filter: C === "all" ? void 0 : { status: C },
|
|
57
58
|
pagination: { first: 50 }
|
|
58
59
|
},
|
|
59
|
-
skip: !
|
|
60
|
+
skip: !l
|
|
60
61
|
});
|
|
61
|
-
if (
|
|
62
|
+
if (E) return /* @__PURE__ */ d("div", {
|
|
62
63
|
className: "flex items-center justify-center p-12",
|
|
63
|
-
children: /* @__PURE__ */
|
|
64
|
+
children: /* @__PURE__ */ d(s, { className: "h-8 w-8 animate-spin text-muted-foreground" })
|
|
64
65
|
});
|
|
65
|
-
if (
|
|
66
|
+
if (D) return /* @__PURE__ */ f("div", {
|
|
66
67
|
className: "p-6 text-destructive",
|
|
67
|
-
children: ["Failed to load releases: ",
|
|
68
|
+
children: ["Failed to load releases: ", D.message]
|
|
68
69
|
});
|
|
69
|
-
let
|
|
70
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
74
|
+
/* @__PURE__ */ f("div", {
|
|
74
75
|
className: "flex items-center justify-between",
|
|
75
|
-
children: [/* @__PURE__ */
|
|
76
|
+
children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
|
|
76
77
|
className: "text-2xl font-semibold",
|
|
77
78
|
children: "Releases"
|
|
78
|
-
}), /* @__PURE__ */
|
|
79
|
+
}), /* @__PURE__ */ f("p", {
|
|
79
80
|
className: "text-sm text-muted-foreground",
|
|
80
|
-
children: [
|
|
81
|
-
})] }), /* @__PURE__ */
|
|
81
|
+
children: [k, " releases across all products"]
|
|
82
|
+
})] }), /* @__PURE__ */ f(m, {
|
|
82
83
|
size: "sm",
|
|
83
|
-
children: [/* @__PURE__ */
|
|
84
|
+
children: [/* @__PURE__ */ d(o, { className: "mr-1 h-4 w-4" }), "New Release"]
|
|
84
85
|
})]
|
|
85
86
|
}),
|
|
86
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ d("div", {
|
|
87
88
|
className: "flex gap-1 border-b pb-1",
|
|
88
|
-
children:
|
|
89
|
-
onClick: () =>
|
|
90
|
-
className: `px-3 py-1.5 text-sm rounded-md capitalize ${
|
|
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__ */
|
|
95
|
+
/* @__PURE__ */ d("div", {
|
|
95
96
|
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
96
|
-
children:
|
|
97
|
-
|
|
98
|
-
children: [/* @__PURE__ */
|
|
99
|
-
className: "
|
|
100
|
-
children: [/* @__PURE__ */
|
|
101
|
-
className: "flex items-center
|
|
102
|
-
children: /* @__PURE__ */
|
|
103
|
-
className: "
|
|
104
|
-
children:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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__ */
|
|
111
|
-
className: "
|
|
112
|
-
children:
|
|
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
|
-
}
|
|
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
|
-
|
|
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 {
|
|
168
|
+
export { S as ProductsReleasesPagePage };
|
|
165
169
|
|
|
166
170
|
//# sourceMappingURL=ProductsReleasesPagePage.js.map
|