@burdenoff/microfe-planmagnet 2026.925.14 → 2026.925.16
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/generated/wspace-types.d.ts +21 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +67 -59
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/docs/DocStatusBadge.d.ts +8 -0
- package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +1 -0
- package/dist/planmagnet/docs/DocStatusBadge.js +28 -0
- package/dist/planmagnet/docs/DocStatusBadge.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +410 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts +3 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.js +224 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +100 -94
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +130 -128
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts +6 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +1 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.js +173 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { PersonName as n } from "../people/People.js";
|
|
3
|
+
import { MarkdownEditor as r } from "../../components/MarkdownEditor.js";
|
|
4
|
+
import { throwOnError as i } from "../utils/mutationResult.js";
|
|
5
|
+
import { DOC_STATUSES as a, DOC_STATUS_LABEL as o, DocStatusBadge as s } from "../docs/DocStatusBadge.js";
|
|
6
|
+
import { useDeferredValue as c, useState as l } from "react";
|
|
7
|
+
import { FileText as u, Plus as d, Search as f } from "lucide-react";
|
|
8
|
+
import { gql as p } from "@apollo/client";
|
|
9
|
+
import { useMutation as m, useQuery as h } from "@apollo/client/react";
|
|
10
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
11
|
+
import { Button as v, Card as y, CardContent as b, Input as x } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
//#region src/planmagnet/pages/DocsDocsPagePage.tsx
|
|
13
|
+
var S = 50, C = p`
|
|
14
|
+
query DocsList(
|
|
15
|
+
$workspaceId: String
|
|
16
|
+
$filter: PlanmagnetDocFilter
|
|
17
|
+
$pagination: PlanmagnetPaginationInput
|
|
18
|
+
) {
|
|
19
|
+
planmagnetDocs(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
|
|
20
|
+
totalCount
|
|
21
|
+
pageInfo {
|
|
22
|
+
hasNextPage
|
|
23
|
+
endCursor
|
|
24
|
+
}
|
|
25
|
+
items {
|
|
26
|
+
id
|
|
27
|
+
title
|
|
28
|
+
status
|
|
29
|
+
version
|
|
30
|
+
updatedAt
|
|
31
|
+
updatedBy
|
|
32
|
+
createdBy
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`, w = p`
|
|
37
|
+
mutation DocsCreate($input: PlanmagnetCreateDocInput!) {
|
|
38
|
+
planmagnetCreateDoc(input: $input) {
|
|
39
|
+
id
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`, T = (e) => `/docs/doc-detail-page?docId=${encodeURIComponent(e)}`;
|
|
43
|
+
function E() {
|
|
44
|
+
let { workspaceId: p } = e(), E = t(), [D, O] = l(""), [k, A] = l("ALL"), [j, M] = l(!1), [N, P] = l(""), [F, I] = l(""), [L, R] = l(null), [z, B] = l(!1), V = c(D.trim()), { data: H, loading: U, error: W, fetchMore: G } = h(C, {
|
|
45
|
+
variables: {
|
|
46
|
+
workspaceId: p,
|
|
47
|
+
filter: {
|
|
48
|
+
...V ? { search: V } : {},
|
|
49
|
+
...k === "ALL" ? {} : { status: k }
|
|
50
|
+
},
|
|
51
|
+
pagination: { first: S }
|
|
52
|
+
},
|
|
53
|
+
skip: !p,
|
|
54
|
+
fetchPolicy: "cache-and-network"
|
|
55
|
+
}), [K, q] = m(w, { refetchQueries: ["DocsList"] }), J = H?.planmagnetDocs, Y = J?.items ?? [], X = async () => {
|
|
56
|
+
R(null);
|
|
57
|
+
try {
|
|
58
|
+
let e = (await i(K({ variables: { input: {
|
|
59
|
+
title: N.trim(),
|
|
60
|
+
content: F
|
|
61
|
+
} } }))).data?.planmagnetCreateDoc.id;
|
|
62
|
+
M(!1), P(""), I(""), e && E(T(e));
|
|
63
|
+
} catch (e) {
|
|
64
|
+
R(e instanceof Error ? e.message : "The doc could not be created.");
|
|
65
|
+
}
|
|
66
|
+
}, Z = async () => {
|
|
67
|
+
let e = J?.pageInfo.endCursor;
|
|
68
|
+
if (e) {
|
|
69
|
+
B(!0);
|
|
70
|
+
try {
|
|
71
|
+
await G({
|
|
72
|
+
variables: { pagination: {
|
|
73
|
+
first: S,
|
|
74
|
+
after: e
|
|
75
|
+
} },
|
|
76
|
+
updateQuery: (e, { fetchMoreResult: t }) => ({ planmagnetDocs: {
|
|
77
|
+
...t.planmagnetDocs,
|
|
78
|
+
items: [...e.planmagnetDocs.items, ...t.planmagnetDocs.items]
|
|
79
|
+
} })
|
|
80
|
+
});
|
|
81
|
+
} finally {
|
|
82
|
+
B(!1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
return /* @__PURE__ */ _("div", {
|
|
87
|
+
className: "space-y-6 p-6",
|
|
88
|
+
"data-testid": "docs-page",
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ _("div", {
|
|
91
|
+
className: "flex flex-wrap items-center justify-between gap-3",
|
|
92
|
+
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
|
|
93
|
+
className: "text-2xl font-semibold",
|
|
94
|
+
children: "Docs"
|
|
95
|
+
}), /* @__PURE__ */ g("p", {
|
|
96
|
+
className: "text-sm text-muted-foreground",
|
|
97
|
+
children: J ? `${J.totalCount} doc${J.totalCount === 1 ? "" : "s"}${V || k !== "ALL" ? " match" : " in this workspace"}` : "Specs and documents, with full version history"
|
|
98
|
+
})] }), !j && /* @__PURE__ */ _(v, {
|
|
99
|
+
size: "sm",
|
|
100
|
+
onClick: () => M(!0),
|
|
101
|
+
"data-testid": "doc-new",
|
|
102
|
+
children: [/* @__PURE__ */ g(d, { className: "mr-1 h-4 w-4" }), "New doc"]
|
|
103
|
+
})]
|
|
104
|
+
}),
|
|
105
|
+
L && /* @__PURE__ */ g("p", {
|
|
106
|
+
role: "alert",
|
|
107
|
+
className: "text-sm text-destructive",
|
|
108
|
+
children: L
|
|
109
|
+
}),
|
|
110
|
+
j && /* @__PURE__ */ g(y, { children: /* @__PURE__ */ _(b, {
|
|
111
|
+
className: "space-y-3 pt-6",
|
|
112
|
+
children: [
|
|
113
|
+
/* @__PURE__ */ g(x, {
|
|
114
|
+
"aria-label": "Doc title",
|
|
115
|
+
placeholder: "Doc title",
|
|
116
|
+
value: N,
|
|
117
|
+
onChange: (e) => P(e.target.value)
|
|
118
|
+
}),
|
|
119
|
+
/* @__PURE__ */ g(r, {
|
|
120
|
+
value: F,
|
|
121
|
+
onChange: I,
|
|
122
|
+
placeholder: "Write the doc…",
|
|
123
|
+
minHeight: 160
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ _("div", {
|
|
126
|
+
className: "flex justify-end gap-2",
|
|
127
|
+
children: [/* @__PURE__ */ g(v, {
|
|
128
|
+
size: "sm",
|
|
129
|
+
variant: "ghost",
|
|
130
|
+
onClick: () => {
|
|
131
|
+
M(!1), R(null);
|
|
132
|
+
},
|
|
133
|
+
children: "Cancel"
|
|
134
|
+
}), /* @__PURE__ */ g(v, {
|
|
135
|
+
size: "sm",
|
|
136
|
+
onClick: X,
|
|
137
|
+
disabled: q.loading,
|
|
138
|
+
"data-testid": "doc-create",
|
|
139
|
+
children: q.loading ? "Creating…" : "Create doc"
|
|
140
|
+
})]
|
|
141
|
+
})
|
|
142
|
+
]
|
|
143
|
+
}) }),
|
|
144
|
+
/* @__PURE__ */ _("div", {
|
|
145
|
+
className: "flex flex-wrap items-center gap-3",
|
|
146
|
+
children: [/* @__PURE__ */ _("div", {
|
|
147
|
+
className: "relative w-full max-w-sm",
|
|
148
|
+
children: [/* @__PURE__ */ g(f, { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ g(x, {
|
|
149
|
+
"aria-label": "Search docs",
|
|
150
|
+
placeholder: "Search titles and content",
|
|
151
|
+
className: "pl-8",
|
|
152
|
+
value: D,
|
|
153
|
+
onChange: (e) => O(e.target.value)
|
|
154
|
+
})]
|
|
155
|
+
}), /* @__PURE__ */ g("div", {
|
|
156
|
+
className: "flex gap-1",
|
|
157
|
+
role: "group",
|
|
158
|
+
"aria-label": "Filter by status",
|
|
159
|
+
children: ["ALL", ...a].map((e) => /* @__PURE__ */ g("button", {
|
|
160
|
+
type: "button",
|
|
161
|
+
"aria-pressed": k === e,
|
|
162
|
+
onClick: () => A(e),
|
|
163
|
+
className: `px-3 py-1.5 text-sm rounded-md ${k === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
|
|
164
|
+
children: e === "ALL" ? "All" : o[e]
|
|
165
|
+
}, e))
|
|
166
|
+
})]
|
|
167
|
+
}),
|
|
168
|
+
W && /* @__PURE__ */ _("p", {
|
|
169
|
+
role: "alert",
|
|
170
|
+
className: "text-sm text-destructive",
|
|
171
|
+
children: ["Docs could not be loaded: ", W.message]
|
|
172
|
+
}),
|
|
173
|
+
U && !H && /* @__PURE__ */ g("p", {
|
|
174
|
+
className: "text-sm text-muted-foreground",
|
|
175
|
+
children: "Loading docs…"
|
|
176
|
+
}),
|
|
177
|
+
J && Y.length === 0 && /* @__PURE__ */ g("p", {
|
|
178
|
+
className: "text-sm text-muted-foreground",
|
|
179
|
+
children: V || k !== "ALL" ? "No docs match." : "No docs yet. Create the first one."
|
|
180
|
+
}),
|
|
181
|
+
/* @__PURE__ */ g("ul", {
|
|
182
|
+
className: "space-y-2",
|
|
183
|
+
children: Y.map((e) => /* @__PURE__ */ g("li", { children: /* @__PURE__ */ _("button", {
|
|
184
|
+
type: "button",
|
|
185
|
+
"data-testid": "doc-row",
|
|
186
|
+
onClick: () => E(T(e.id)),
|
|
187
|
+
className: "flex w-full items-center justify-between gap-3 rounded-md border p-3 text-left hover:border-primary transition-colors",
|
|
188
|
+
children: [/* @__PURE__ */ _("span", {
|
|
189
|
+
className: "flex min-w-0 items-center gap-2",
|
|
190
|
+
children: [/* @__PURE__ */ g(u, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), /* @__PURE__ */ _("span", {
|
|
191
|
+
className: "min-w-0",
|
|
192
|
+
children: [/* @__PURE__ */ g("span", {
|
|
193
|
+
className: "block truncate text-sm font-medium",
|
|
194
|
+
children: e.title
|
|
195
|
+
}), /* @__PURE__ */ _("span", {
|
|
196
|
+
className: "block text-xs text-muted-foreground",
|
|
197
|
+
children: [
|
|
198
|
+
"v",
|
|
199
|
+
e.version,
|
|
200
|
+
" · updated ",
|
|
201
|
+
new Date(e.updatedAt).toLocaleString(),
|
|
202
|
+
" by",
|
|
203
|
+
" ",
|
|
204
|
+
/* @__PURE__ */ g(n, { id: e.updatedBy ?? e.createdBy })
|
|
205
|
+
]
|
|
206
|
+
})]
|
|
207
|
+
})]
|
|
208
|
+
}), /* @__PURE__ */ g(s, { status: e.status })]
|
|
209
|
+
}) }, e.id))
|
|
210
|
+
}),
|
|
211
|
+
J?.pageInfo.hasNextPage && /* @__PURE__ */ g(v, {
|
|
212
|
+
size: "sm",
|
|
213
|
+
variant: "outline",
|
|
214
|
+
onClick: Z,
|
|
215
|
+
disabled: z,
|
|
216
|
+
children: z ? "Loading…" : `Show more (${Y.length} of ${J.totalCount})`
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
//#endregion
|
|
222
|
+
export { E as DocsDocsPagePage };
|
|
223
|
+
|
|
224
|
+
//# sourceMappingURL=DocsDocsPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocsDocsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/DocsDocsPagePage.tsx"],"sourcesContent":["import { useDeferredValue, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { Button, Card, CardContent, Input } from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus, Search } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { PersonName } from '../people/People';\nimport { throwOnError } from '../utils/mutationResult';\nimport {\n DOC_STATUSES,\n DOC_STATUS_LABEL,\n DocStatusBadge,\n type DocStatus,\n} from '../docs/DocStatusBadge';\n\n/**\n * Docs browse surface (P1.4). Before this, a doc could only be created from a\n * work item's \"Linked Docs\" panel and never opened again: there was no list,\n * no detail view and no history UI, although the service kept every revision.\n */\n\nconst PAGE = 50;\n\nconst DOCS = gql`\n query DocsList(\n $workspaceId: String\n $filter: PlanmagnetDocFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetDocs(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n title\n status\n version\n updatedAt\n updatedBy\n createdBy\n }\n }\n }\n`;\n\nconst CREATE_DOC = gql`\n mutation DocsCreate($input: PlanmagnetCreateDocInput!) {\n planmagnetCreateDoc(input: $input) {\n id\n }\n }\n`;\n\ninterface DocRow {\n id: string;\n title: string;\n status: string;\n version: number;\n updatedAt: string;\n updatedBy: string | null;\n createdBy: string;\n}\n\ninterface DocsData {\n planmagnetDocs: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: DocRow[];\n };\n}\n\nexport const docDetailPath = (id: string) =>\n `/docs/doc-detail-page?docId=${encodeURIComponent(id)}`;\n\nexport function DocsDocsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [search, setSearch] = useState('');\n const [status, setStatus] = useState<DocStatus | 'ALL'>('ALL');\n const [composing, setComposing] = useState(false);\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loadingMore, setLoadingMore] = useState(false);\n const term = useDeferredValue(search.trim());\n\n const filter = {\n ...(term ? { search: term } : {}),\n ...(status !== 'ALL' ? { status } : {}),\n };\n const {\n data,\n loading,\n error: loadError,\n fetchMore,\n } = useQuery<DocsData>(DOCS, {\n variables: { workspaceId, filter, pagination: { first: PAGE } },\n skip: !workspaceId,\n // Cached copies go stale here: a deleted doc, or someone else's newer version.\n fetchPolicy: 'cache-and-network',\n });\n const [create, createState] = useMutation<{ planmagnetCreateDoc: { id: string } }>(CREATE_DOC, {\n refetchQueries: ['DocsList'],\n });\n\n const list = data?.planmagnetDocs;\n const docs = list?.items ?? [];\n\n const submit = async () => {\n setError(null);\n try {\n const result = await throwOnError(\n create({ variables: { input: { title: title.trim(), content } } })\n );\n const id = result.data?.planmagnetCreateDoc.id;\n setComposing(false);\n setTitle('');\n setContent('');\n if (id) navigate(docDetailPath(id));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The doc could not be created.');\n }\n };\n\n const loadMore = async () => {\n const after = list?.pageInfo.endCursor;\n if (!after) return;\n setLoadingMore(true);\n try {\n await fetchMore({\n variables: { pagination: { first: PAGE, after } },\n updateQuery: (prev, { fetchMoreResult }) => ({\n planmagnetDocs: {\n ...fetchMoreResult.planmagnetDocs,\n items: [...prev.planmagnetDocs.items, ...fetchMoreResult.planmagnetDocs.items],\n },\n }),\n });\n } finally {\n setLoadingMore(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\" data-testid=\"docs-page\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Docs</h1>\n <p className=\"text-sm text-muted-foreground\">\n {list\n ? `${list.totalCount} doc${list.totalCount === 1 ? '' : 's'}${term || status !== 'ALL' ? ' match' : ' in this workspace'}`\n : 'Specs and documents, with full version history'}\n </p>\n </div>\n {!composing && (\n <Button size=\"sm\" onClick={() => setComposing(true)} data-testid=\"doc-new\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New doc\n </Button>\n )}\n </div>\n\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n\n {composing && (\n <Card>\n <CardContent className=\"space-y-3 pt-6\">\n <Input\n aria-label=\"Doc title\"\n placeholder=\"Doc title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n <MarkdownEditor\n value={content}\n onChange={setContent}\n placeholder=\"Write the doc…\"\n minHeight={160}\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setComposing(false);\n setError(null);\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={submit}\n disabled={createState.loading}\n data-testid=\"doc-create\"\n >\n {createState.loading ? 'Creating…' : 'Create doc'}\n </Button>\n </div>\n </CardContent>\n </Card>\n )}\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative w-full max-w-sm\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n aria-label=\"Search docs\"\n placeholder=\"Search titles and content\"\n className=\"pl-8\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Filter by status\">\n {(['ALL', ...DOC_STATUSES] as const).map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={status === s}\n onClick={() => setStatus(s)}\n className={`px-3 py-1.5 text-sm rounded-md ${status === s ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {s === 'ALL' ? 'All' : DOC_STATUS_LABEL[s]}\n </button>\n ))}\n </div>\n </div>\n\n {loadError && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n Docs could not be loaded: {loadError.message}\n </p>\n )}\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading docs…</p>}\n {list && docs.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n {term || status !== 'ALL' ? 'No docs match.' : 'No docs yet. Create the first one.'}\n </p>\n )}\n\n <ul className=\"space-y-2\">\n {docs.map((doc) => (\n <li key={doc.id}>\n <button\n type=\"button\"\n data-testid=\"doc-row\"\n onClick={() => navigate(docDetailPath(doc.id))}\n className=\"flex w-full items-center justify-between gap-3 rounded-md border p-3 text-left hover:border-primary transition-colors\"\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <FileText className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">{doc.title}</span>\n <span className=\"block text-xs text-muted-foreground\">\n v{doc.version} · updated {new Date(doc.updatedAt).toLocaleString()} by{' '}\n <PersonName id={doc.updatedBy ?? doc.createdBy} />\n </span>\n </span>\n </span>\n <DocStatusBadge status={doc.status} />\n </button>\n </li>\n ))}\n </ul>\n {list?.pageInfo.hasNextPage && (\n <Button size=\"sm\" variant=\"outline\" onClick={loadMore} disabled={loadingMore}>\n {loadingMore ? 'Loading…' : `Show more (${docs.length} of ${list.totalCount})`}\n </Button>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductsReleaseDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsReleaseDetailPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProductsReleaseDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsReleaseDetailPagePage.tsx"],"names":[],"mappings":"AA4DA,wBAAgB,6BAA6B,4CAyM5C"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
2
|
import { PersonName as t } from "../people/People.js";
|
|
3
3
|
import { ReleaseNotesCard as n } from "../releases/ReleaseNotesCard.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
4
|
+
import { ReleaseGatesCard as r } from "../releases/ReleaseGatesCard.js";
|
|
5
|
+
import { Calendar as i, Clock as a, GitBranch as o, Loader2 as s } from "lucide-react";
|
|
6
|
+
import { useParams as c } from "react-router";
|
|
7
|
+
import { gql as l } from "@apollo/client";
|
|
8
|
+
import { useQuery as u } from "@apollo/client/react";
|
|
9
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
10
|
+
import { Badge as p, Card as m, CardContent as h, CardHeader as g, CardTitle as _ } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
import { Markdown as v } from "@burdenoff/fe-libs/shared/components";
|
|
11
12
|
//#region src/planmagnet/pages/ProductsReleaseDetailPagePage.tsx
|
|
12
|
-
var
|
|
13
|
+
var y = l`
|
|
13
14
|
query GetRelease($id: ID!) {
|
|
14
15
|
planmagnetRelease(id: $id) {
|
|
15
16
|
id
|
|
@@ -36,7 +37,7 @@ var v = c`
|
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
|
-
`,
|
|
40
|
+
`, b = {
|
|
40
41
|
DRAFT: "bg-gray-100 text-gray-800",
|
|
41
42
|
PLANNING: "bg-yellow-100 text-yellow-800",
|
|
42
43
|
IN_PROGRESS: "bg-blue-100 text-blue-800",
|
|
@@ -45,89 +46,89 @@ var v = c`
|
|
|
45
46
|
CANCELLED: "bg-red-100 text-red-800",
|
|
46
47
|
ROLLED_BACK: "bg-red-100 text-red-800"
|
|
47
48
|
};
|
|
48
|
-
function
|
|
49
|
-
let { workspaceId:
|
|
50
|
-
variables: { id:
|
|
51
|
-
skip: !
|
|
49
|
+
function x() {
|
|
50
|
+
let { workspaceId: l } = e(), x = c().id ?? "", { data: S, loading: C, error: w } = u(y, {
|
|
51
|
+
variables: { id: x },
|
|
52
|
+
skip: !x
|
|
52
53
|
});
|
|
53
|
-
if (
|
|
54
|
+
if (C && !S) return /* @__PURE__ */ d("div", {
|
|
54
55
|
className: "flex items-center justify-center p-12",
|
|
55
|
-
children: /* @__PURE__ */
|
|
56
|
+
children: /* @__PURE__ */ d(s, { className: "h-8 w-8 animate-spin text-muted-foreground" })
|
|
56
57
|
});
|
|
57
|
-
if (
|
|
58
|
+
if (w) return /* @__PURE__ */ f("div", {
|
|
58
59
|
className: "p-6 text-destructive",
|
|
59
|
-
children: ["Failed to load release: ",
|
|
60
|
+
children: ["Failed to load release: ", w.message]
|
|
60
61
|
});
|
|
61
|
-
let
|
|
62
|
-
if (!
|
|
62
|
+
let T = S?.planmagnetRelease;
|
|
63
|
+
if (!T) return /* @__PURE__ */ d("div", {
|
|
63
64
|
className: "p-6 text-muted-foreground",
|
|
64
65
|
children: "Release not found."
|
|
65
66
|
});
|
|
66
|
-
let
|
|
67
|
-
return /* @__PURE__ */
|
|
67
|
+
let E = T.workItems ?? [], D = E.filter((e) => e.type === "STORY" || e.type === "FEATURE"), O = E.filter((e) => e.type === "BUG");
|
|
68
|
+
return /* @__PURE__ */ f("div", {
|
|
68
69
|
className: "space-y-6 p-6",
|
|
69
|
-
children: [/* @__PURE__ */
|
|
70
|
+
children: [/* @__PURE__ */ f("div", {
|
|
70
71
|
className: "flex items-center justify-between",
|
|
71
|
-
children: [/* @__PURE__ */
|
|
72
|
+
children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ f("div", {
|
|
72
73
|
className: "flex items-center gap-2",
|
|
73
74
|
children: [
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ d(o, { className: "h-5 w-5 text-primary" }),
|
|
76
|
+
/* @__PURE__ */ d("h1", {
|
|
76
77
|
className: "text-2xl font-semibold",
|
|
77
|
-
children:
|
|
78
|
+
children: T.version
|
|
78
79
|
}),
|
|
79
|
-
/* @__PURE__ */
|
|
80
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
81
|
-
children:
|
|
80
|
+
/* @__PURE__ */ d("span", {
|
|
81
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${b[T.status] ?? "bg-gray-100"}`,
|
|
82
|
+
children: T.status.toLowerCase().replace("_", " ")
|
|
82
83
|
})
|
|
83
84
|
]
|
|
84
|
-
}), /* @__PURE__ */
|
|
85
|
+
}), /* @__PURE__ */ d("p", {
|
|
85
86
|
className: "text-sm text-muted-foreground mt-1",
|
|
86
|
-
children:
|
|
87
|
-
})] }), /* @__PURE__ */
|
|
87
|
+
children: T.name
|
|
88
|
+
})] }), /* @__PURE__ */ d(p, {
|
|
88
89
|
variant: "outline",
|
|
89
90
|
className: "capitalize",
|
|
90
|
-
children:
|
|
91
|
+
children: T.status.toLowerCase().replace("_", " ")
|
|
91
92
|
})]
|
|
92
|
-
}), /* @__PURE__ */
|
|
93
|
+
}), /* @__PURE__ */ f("div", {
|
|
93
94
|
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
94
|
-
children: [/* @__PURE__ */
|
|
95
|
+
children: [/* @__PURE__ */ f("div", {
|
|
95
96
|
className: "lg:col-span-2 space-y-6",
|
|
96
97
|
children: [
|
|
97
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Overview" }) }), /* @__PURE__ */ f(h, {
|
|
98
99
|
className: "space-y-4",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
100
|
+
children: [/* @__PURE__ */ d("div", {
|
|
100
101
|
className: "text-sm prose prose-sm dark:prose-invert max-w-none",
|
|
101
|
-
children:
|
|
102
|
-
}), /* @__PURE__ */
|
|
102
|
+
children: T.description ? /* @__PURE__ */ d(v, { children: T.description }) : /* @__PURE__ */ d("p", { children: "No description provided." })
|
|
103
|
+
}), /* @__PURE__ */ f("div", {
|
|
103
104
|
className: "grid grid-cols-3 gap-4",
|
|
104
105
|
children: [
|
|
105
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ f("div", {
|
|
106
107
|
className: "text-center p-3 bg-muted rounded-md",
|
|
107
|
-
children: [/* @__PURE__ */
|
|
108
|
+
children: [/* @__PURE__ */ d("p", {
|
|
108
109
|
className: "text-lg font-semibold mt-1",
|
|
109
|
-
children:
|
|
110
|
-
}), /* @__PURE__ */
|
|
110
|
+
children: D.length
|
|
111
|
+
}), /* @__PURE__ */ d("p", {
|
|
111
112
|
className: "text-xs text-muted-foreground",
|
|
112
113
|
children: "Features"
|
|
113
114
|
})]
|
|
114
115
|
}),
|
|
115
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ f("div", {
|
|
116
117
|
className: "text-center p-3 bg-muted rounded-md",
|
|
117
|
-
children: [/* @__PURE__ */
|
|
118
|
+
children: [/* @__PURE__ */ d("p", {
|
|
118
119
|
className: "text-lg font-semibold mt-1",
|
|
119
|
-
children:
|
|
120
|
-
}), /* @__PURE__ */
|
|
120
|
+
children: O.length
|
|
121
|
+
}), /* @__PURE__ */ d("p", {
|
|
121
122
|
className: "text-xs text-muted-foreground",
|
|
122
123
|
children: "Bug Fixes"
|
|
123
124
|
})]
|
|
124
125
|
}),
|
|
125
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ f("div", {
|
|
126
127
|
className: "text-center p-3 bg-muted rounded-md",
|
|
127
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ d("p", {
|
|
128
129
|
className: "text-lg font-semibold mt-1",
|
|
129
|
-
children:
|
|
130
|
-
}), /* @__PURE__ */
|
|
130
|
+
children: E.length
|
|
131
|
+
}), /* @__PURE__ */ d("p", {
|
|
131
132
|
className: "text-xs text-muted-foreground",
|
|
132
133
|
children: "Total Items"
|
|
133
134
|
})]
|
|
@@ -135,22 +136,27 @@ function b() {
|
|
|
135
136
|
]
|
|
136
137
|
})]
|
|
137
138
|
})] }),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
releaseId:
|
|
140
|
-
|
|
139
|
+
/* @__PURE__ */ d(r, {
|
|
140
|
+
releaseId: T.id,
|
|
141
|
+
projectId: T.projectId ?? null,
|
|
142
|
+
releaseStatus: T.status
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ d(n, {
|
|
145
|
+
releaseId: T.id,
|
|
146
|
+
notes: T.releaseNotes ?? null
|
|
141
147
|
}),
|
|
142
|
-
|
|
148
|
+
E.length > 0 && /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ f(_, { children: [
|
|
143
149
|
"Work Items (",
|
|
144
|
-
|
|
150
|
+
E.length,
|
|
145
151
|
")"
|
|
146
|
-
] }) }), /* @__PURE__ */
|
|
152
|
+
] }) }), /* @__PURE__ */ d(h, {
|
|
147
153
|
className: "space-y-2",
|
|
148
|
-
children:
|
|
154
|
+
children: E.map((e) => /* @__PURE__ */ f("div", {
|
|
149
155
|
className: "flex items-center justify-between border rounded-md p-3",
|
|
150
|
-
children: [/* @__PURE__ */
|
|
156
|
+
children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
|
|
151
157
|
className: "text-sm font-medium",
|
|
152
158
|
children: e.title
|
|
153
|
-
}), /* @__PURE__ */
|
|
159
|
+
}), /* @__PURE__ */ f("p", {
|
|
154
160
|
className: "text-xs text-muted-foreground capitalize",
|
|
155
161
|
children: [
|
|
156
162
|
e.type.toLowerCase(),
|
|
@@ -158,7 +164,7 @@ function b() {
|
|
|
158
164
|
e.priority.toLowerCase(),
|
|
159
165
|
" priority"
|
|
160
166
|
]
|
|
161
|
-
})] }), /* @__PURE__ */
|
|
167
|
+
})] }), /* @__PURE__ */ d(p, {
|
|
162
168
|
variant: "outline",
|
|
163
169
|
className: "text-xs capitalize",
|
|
164
170
|
children: e.status.toLowerCase().replace("_", " ")
|
|
@@ -166,89 +172,89 @@ function b() {
|
|
|
166
172
|
}, e.id))
|
|
167
173
|
})] })
|
|
168
174
|
]
|
|
169
|
-
}), /* @__PURE__ */
|
|
175
|
+
}), /* @__PURE__ */ f("div", {
|
|
170
176
|
className: "space-y-6",
|
|
171
177
|
children: [
|
|
172
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Timeline" }) }), /* @__PURE__ */ f(h, {
|
|
173
179
|
className: "space-y-3 text-sm",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
180
|
+
children: [/* @__PURE__ */ f("div", {
|
|
175
181
|
className: "flex items-center gap-2",
|
|
176
182
|
children: [
|
|
177
|
-
/* @__PURE__ */
|
|
178
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ d(i, { className: "h-4 w-4 text-muted-foreground" }),
|
|
184
|
+
/* @__PURE__ */ d("span", {
|
|
179
185
|
className: "text-muted-foreground",
|
|
180
186
|
children: "Planned:"
|
|
181
187
|
}),
|
|
182
|
-
/* @__PURE__ */
|
|
188
|
+
/* @__PURE__ */ d("span", {
|
|
183
189
|
className: "font-medium",
|
|
184
|
-
children:
|
|
190
|
+
children: T.plannedDate ? new Date(T.plannedDate).toLocaleDateString() : "Not set"
|
|
185
191
|
})
|
|
186
192
|
]
|
|
187
|
-
}),
|
|
193
|
+
}), T.releasedAt && /* @__PURE__ */ f("div", {
|
|
188
194
|
className: "flex items-center gap-2",
|
|
189
195
|
children: [
|
|
190
|
-
/* @__PURE__ */
|
|
191
|
-
/* @__PURE__ */
|
|
196
|
+
/* @__PURE__ */ d(a, { className: "h-4 w-4 text-green-500" }),
|
|
197
|
+
/* @__PURE__ */ d("span", {
|
|
192
198
|
className: "text-muted-foreground",
|
|
193
199
|
children: "Released:"
|
|
194
200
|
}),
|
|
195
|
-
/* @__PURE__ */
|
|
201
|
+
/* @__PURE__ */ d("span", {
|
|
196
202
|
className: "font-medium",
|
|
197
|
-
children: new Date(
|
|
203
|
+
children: new Date(T.releasedAt).toLocaleDateString()
|
|
198
204
|
})
|
|
199
205
|
]
|
|
200
206
|
})]
|
|
201
207
|
})] }),
|
|
202
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Details" }) }), /* @__PURE__ */ f(h, {
|
|
203
209
|
className: "space-y-2 text-sm",
|
|
204
210
|
children: [
|
|
205
|
-
/* @__PURE__ */
|
|
211
|
+
/* @__PURE__ */ f("div", {
|
|
206
212
|
className: "flex justify-between",
|
|
207
|
-
children: [/* @__PURE__ */
|
|
213
|
+
children: [/* @__PURE__ */ d("span", {
|
|
208
214
|
className: "text-muted-foreground",
|
|
209
215
|
children: "Version"
|
|
210
|
-
}), /* @__PURE__ */
|
|
216
|
+
}), /* @__PURE__ */ d("span", {
|
|
211
217
|
className: "font-medium",
|
|
212
|
-
children:
|
|
218
|
+
children: T.version
|
|
213
219
|
})]
|
|
214
220
|
}),
|
|
215
|
-
/* @__PURE__ */
|
|
221
|
+
/* @__PURE__ */ f("div", {
|
|
216
222
|
className: "flex justify-between",
|
|
217
|
-
children: [/* @__PURE__ */
|
|
223
|
+
children: [/* @__PURE__ */ d("span", {
|
|
218
224
|
className: "text-muted-foreground",
|
|
219
225
|
children: "Status"
|
|
220
|
-
}), /* @__PURE__ */
|
|
226
|
+
}), /* @__PURE__ */ d(p, {
|
|
221
227
|
variant: "outline",
|
|
222
228
|
className: "text-xs capitalize",
|
|
223
|
-
children:
|
|
229
|
+
children: T.status.toLowerCase().replace("_", " ")
|
|
224
230
|
})]
|
|
225
231
|
}),
|
|
226
|
-
/* @__PURE__ */
|
|
232
|
+
/* @__PURE__ */ f("div", {
|
|
227
233
|
className: "flex justify-between",
|
|
228
|
-
children: [/* @__PURE__ */
|
|
234
|
+
children: [/* @__PURE__ */ d("span", {
|
|
229
235
|
className: "text-muted-foreground",
|
|
230
236
|
children: "Owner"
|
|
231
|
-
}), /* @__PURE__ */
|
|
237
|
+
}), /* @__PURE__ */ d("span", { children: /* @__PURE__ */ d(t, { id: T.ownerId }) })]
|
|
232
238
|
}),
|
|
233
|
-
/* @__PURE__ */
|
|
239
|
+
/* @__PURE__ */ f("div", {
|
|
234
240
|
className: "flex justify-between",
|
|
235
|
-
children: [/* @__PURE__ */
|
|
241
|
+
children: [/* @__PURE__ */ d("span", {
|
|
236
242
|
className: "text-muted-foreground",
|
|
237
243
|
children: "Created"
|
|
238
|
-
}), /* @__PURE__ */
|
|
244
|
+
}), /* @__PURE__ */ d("span", { children: new Date(T.createdAt).toLocaleDateString() })]
|
|
239
245
|
}),
|
|
240
|
-
/* @__PURE__ */
|
|
246
|
+
/* @__PURE__ */ f("div", {
|
|
241
247
|
className: "flex justify-between",
|
|
242
|
-
children: [/* @__PURE__ */
|
|
248
|
+
children: [/* @__PURE__ */ d("span", {
|
|
243
249
|
className: "text-muted-foreground",
|
|
244
250
|
children: "Updated"
|
|
245
|
-
}), /* @__PURE__ */
|
|
251
|
+
}), /* @__PURE__ */ d("span", { children: new Date(T.updatedAt).toLocaleDateString() })]
|
|
246
252
|
})
|
|
247
253
|
]
|
|
248
254
|
})] }),
|
|
249
|
-
|
|
255
|
+
T.tags?.length > 0 && /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Tags" }) }), /* @__PURE__ */ d(h, {
|
|
250
256
|
className: "flex flex-wrap gap-1",
|
|
251
|
-
children:
|
|
257
|
+
children: T.tags.map((e) => /* @__PURE__ */ d(p, {
|
|
252
258
|
variant: "outline",
|
|
253
259
|
className: "text-xs",
|
|
254
260
|
children: e
|
|
@@ -260,6 +266,6 @@ function b() {
|
|
|
260
266
|
});
|
|
261
267
|
}
|
|
262
268
|
//#endregion
|
|
263
|
-
export {
|
|
269
|
+
export { x as ProductsReleaseDetailPagePage };
|
|
264
270
|
|
|
265
271
|
//# sourceMappingURL=ProductsReleaseDetailPagePage.js.map
|