@burdenoff/microfe-planmagnet 2026.925.15 → 2026.925.17
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 +50 -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 +414 -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 +105 -98
- 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 +7 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.js +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts +7 -0
- package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts.map +1 -0
- package/dist/planmagnet/releases/ReleaseReadinessCard.js +390 -0
- package/dist/planmagnet/releases/ReleaseReadinessCard.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":"AA6DA,wBAAgB,6BAA6B,4CA+M5C"}
|
|
@@ -2,15 +2,16 @@ 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
4
|
import { ReleaseGatesCard as r } from "../releases/ReleaseGatesCard.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
5
|
+
import { ReleaseReadinessCard as i } from "../releases/ReleaseReadinessCard.js";
|
|
6
|
+
import { Calendar as a, Clock as o, GitBranch as s, Loader2 as c } from "lucide-react";
|
|
7
|
+
import { useParams as l } from "react-router";
|
|
8
|
+
import { gql as u } from "@apollo/client";
|
|
9
|
+
import { useQuery as d } from "@apollo/client/react";
|
|
10
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
11
|
+
import { Badge as m, Card as h, CardContent as g, CardHeader as _, CardTitle as v } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
import { Markdown as y } from "@burdenoff/fe-libs/shared/components";
|
|
12
13
|
//#region src/planmagnet/pages/ProductsReleaseDetailPagePage.tsx
|
|
13
|
-
var
|
|
14
|
+
var b = u`
|
|
14
15
|
query GetRelease($id: ID!) {
|
|
15
16
|
planmagnetRelease(id: $id) {
|
|
16
17
|
id
|
|
@@ -37,7 +38,7 @@ var y = l`
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
`,
|
|
41
|
+
`, x = {
|
|
41
42
|
DRAFT: "bg-gray-100 text-gray-800",
|
|
42
43
|
PLANNING: "bg-yellow-100 text-yellow-800",
|
|
43
44
|
IN_PROGRESS: "bg-blue-100 text-blue-800",
|
|
@@ -46,89 +47,95 @@ var y = l`
|
|
|
46
47
|
CANCELLED: "bg-red-100 text-red-800",
|
|
47
48
|
ROLLED_BACK: "bg-red-100 text-red-800"
|
|
48
49
|
};
|
|
49
|
-
function
|
|
50
|
-
let { workspaceId:
|
|
51
|
-
variables: { id:
|
|
52
|
-
skip: !
|
|
50
|
+
function S() {
|
|
51
|
+
let { workspaceId: u } = e(), S = l().id ?? "", { data: C, loading: w, error: T } = d(b, {
|
|
52
|
+
variables: { id: S },
|
|
53
|
+
skip: !S
|
|
53
54
|
});
|
|
54
|
-
if (
|
|
55
|
+
if (w && !C) return /* @__PURE__ */ f("div", {
|
|
55
56
|
className: "flex items-center justify-center p-12",
|
|
56
|
-
children: /* @__PURE__ */
|
|
57
|
+
children: /* @__PURE__ */ f(c, { className: "h-8 w-8 animate-spin text-muted-foreground" })
|
|
57
58
|
});
|
|
58
|
-
if (
|
|
59
|
+
if (T) return /* @__PURE__ */ p("div", {
|
|
59
60
|
className: "p-6 text-destructive",
|
|
60
|
-
children: ["Failed to load release: ",
|
|
61
|
+
children: ["Failed to load release: ", T.message]
|
|
61
62
|
});
|
|
62
|
-
let
|
|
63
|
-
if (!
|
|
63
|
+
let E = C?.planmagnetRelease;
|
|
64
|
+
if (!E) return /* @__PURE__ */ f("div", {
|
|
64
65
|
className: "p-6 text-muted-foreground",
|
|
65
66
|
children: "Release not found."
|
|
66
67
|
});
|
|
67
|
-
let
|
|
68
|
-
return /* @__PURE__ */
|
|
68
|
+
let D = E.workItems ?? [], O = D.filter((e) => e.type === "STORY" || e.type === "FEATURE"), k = D.filter((e) => e.type === "BUG");
|
|
69
|
+
return /* @__PURE__ */ p("div", {
|
|
69
70
|
className: "space-y-6 p-6",
|
|
70
|
-
children: [/* @__PURE__ */
|
|
71
|
+
children: [/* @__PURE__ */ p("div", {
|
|
71
72
|
className: "flex items-center justify-between",
|
|
72
|
-
children: [/* @__PURE__ */
|
|
73
|
+
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("div", {
|
|
73
74
|
className: "flex items-center gap-2",
|
|
74
75
|
children: [
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
-
/* @__PURE__ */
|
|
76
|
+
/* @__PURE__ */ f(s, { className: "h-5 w-5 text-primary" }),
|
|
77
|
+
/* @__PURE__ */ f("h1", {
|
|
77
78
|
className: "text-2xl font-semibold",
|
|
78
|
-
children:
|
|
79
|
+
children: E.version
|
|
79
80
|
}),
|
|
80
|
-
/* @__PURE__ */
|
|
81
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
82
|
-
children:
|
|
81
|
+
/* @__PURE__ */ f("span", {
|
|
82
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${x[E.status] ?? "bg-gray-100"}`,
|
|
83
|
+
children: E.status.toLowerCase().replace("_", " ")
|
|
83
84
|
})
|
|
84
85
|
]
|
|
85
|
-
}), /* @__PURE__ */
|
|
86
|
+
}), /* @__PURE__ */ f("p", {
|
|
86
87
|
className: "text-sm text-muted-foreground mt-1",
|
|
87
|
-
children:
|
|
88
|
-
})] }), /* @__PURE__ */
|
|
88
|
+
children: E.name
|
|
89
|
+
})] }), /* @__PURE__ */ f(m, {
|
|
89
90
|
variant: "outline",
|
|
90
91
|
className: "capitalize",
|
|
91
|
-
children:
|
|
92
|
+
children: E.status.toLowerCase().replace("_", " ")
|
|
92
93
|
})]
|
|
93
|
-
}), /* @__PURE__ */
|
|
94
|
+
}), /* @__PURE__ */ p("div", {
|
|
94
95
|
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
95
|
-
children: [/* @__PURE__ */
|
|
96
|
+
children: [/* @__PURE__ */ p("div", {
|
|
96
97
|
className: "lg:col-span-2 space-y-6",
|
|
97
98
|
children: [
|
|
98
|
-
/* @__PURE__ */ f(
|
|
99
|
+
/* @__PURE__ */ f(i, {
|
|
100
|
+
releaseId: E.id,
|
|
101
|
+
projectId: E.projectId || null,
|
|
102
|
+
releaseStatus: E.status,
|
|
103
|
+
plannedDate: E.plannedDate ?? null
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ f(v, { children: "Overview" }) }), /* @__PURE__ */ p(g, {
|
|
99
106
|
className: "space-y-4",
|
|
100
|
-
children: [/* @__PURE__ */
|
|
107
|
+
children: [/* @__PURE__ */ f("div", {
|
|
101
108
|
className: "text-sm prose prose-sm dark:prose-invert max-w-none",
|
|
102
|
-
children:
|
|
103
|
-
}), /* @__PURE__ */
|
|
109
|
+
children: E.description ? /* @__PURE__ */ f(y, { children: E.description }) : /* @__PURE__ */ f("p", { children: "No description provided." })
|
|
110
|
+
}), /* @__PURE__ */ p("div", {
|
|
104
111
|
className: "grid grid-cols-3 gap-4",
|
|
105
112
|
children: [
|
|
106
|
-
/* @__PURE__ */
|
|
113
|
+
/* @__PURE__ */ p("div", {
|
|
107
114
|
className: "text-center p-3 bg-muted rounded-md",
|
|
108
|
-
children: [/* @__PURE__ */
|
|
115
|
+
children: [/* @__PURE__ */ f("p", {
|
|
109
116
|
className: "text-lg font-semibold mt-1",
|
|
110
|
-
children:
|
|
111
|
-
}), /* @__PURE__ */
|
|
117
|
+
children: O.length
|
|
118
|
+
}), /* @__PURE__ */ f("p", {
|
|
112
119
|
className: "text-xs text-muted-foreground",
|
|
113
120
|
children: "Features"
|
|
114
121
|
})]
|
|
115
122
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ p("div", {
|
|
117
124
|
className: "text-center p-3 bg-muted rounded-md",
|
|
118
|
-
children: [/* @__PURE__ */
|
|
125
|
+
children: [/* @__PURE__ */ f("p", {
|
|
119
126
|
className: "text-lg font-semibold mt-1",
|
|
120
|
-
children:
|
|
121
|
-
}), /* @__PURE__ */
|
|
127
|
+
children: k.length
|
|
128
|
+
}), /* @__PURE__ */ f("p", {
|
|
122
129
|
className: "text-xs text-muted-foreground",
|
|
123
130
|
children: "Bug Fixes"
|
|
124
131
|
})]
|
|
125
132
|
}),
|
|
126
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ p("div", {
|
|
127
134
|
className: "text-center p-3 bg-muted rounded-md",
|
|
128
|
-
children: [/* @__PURE__ */
|
|
135
|
+
children: [/* @__PURE__ */ f("p", {
|
|
129
136
|
className: "text-lg font-semibold mt-1",
|
|
130
|
-
children:
|
|
131
|
-
}), /* @__PURE__ */
|
|
137
|
+
children: D.length
|
|
138
|
+
}), /* @__PURE__ */ f("p", {
|
|
132
139
|
className: "text-xs text-muted-foreground",
|
|
133
140
|
children: "Total Items"
|
|
134
141
|
})]
|
|
@@ -136,27 +143,27 @@ function x() {
|
|
|
136
143
|
]
|
|
137
144
|
})]
|
|
138
145
|
})] }),
|
|
139
|
-
/* @__PURE__ */
|
|
140
|
-
releaseId:
|
|
141
|
-
projectId:
|
|
142
|
-
releaseStatus:
|
|
146
|
+
/* @__PURE__ */ f(r, {
|
|
147
|
+
releaseId: E.id,
|
|
148
|
+
projectId: E.projectId ?? null,
|
|
149
|
+
releaseStatus: E.status
|
|
143
150
|
}),
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
-
releaseId:
|
|
146
|
-
notes:
|
|
151
|
+
/* @__PURE__ */ f(n, {
|
|
152
|
+
releaseId: E.id,
|
|
153
|
+
notes: E.releaseNotes ?? null
|
|
147
154
|
}),
|
|
148
|
-
|
|
155
|
+
D.length > 0 && /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ p(v, { children: [
|
|
149
156
|
"Work Items (",
|
|
150
|
-
|
|
157
|
+
D.length,
|
|
151
158
|
")"
|
|
152
|
-
] }) }), /* @__PURE__ */
|
|
159
|
+
] }) }), /* @__PURE__ */ f(g, {
|
|
153
160
|
className: "space-y-2",
|
|
154
|
-
children:
|
|
161
|
+
children: D.map((e) => /* @__PURE__ */ p("div", {
|
|
155
162
|
className: "flex items-center justify-between border rounded-md p-3",
|
|
156
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
|
|
157
164
|
className: "text-sm font-medium",
|
|
158
165
|
children: e.title
|
|
159
|
-
}), /* @__PURE__ */
|
|
166
|
+
}), /* @__PURE__ */ p("p", {
|
|
160
167
|
className: "text-xs text-muted-foreground capitalize",
|
|
161
168
|
children: [
|
|
162
169
|
e.type.toLowerCase(),
|
|
@@ -164,7 +171,7 @@ function x() {
|
|
|
164
171
|
e.priority.toLowerCase(),
|
|
165
172
|
" priority"
|
|
166
173
|
]
|
|
167
|
-
})] }), /* @__PURE__ */
|
|
174
|
+
})] }), /* @__PURE__ */ f(m, {
|
|
168
175
|
variant: "outline",
|
|
169
176
|
className: "text-xs capitalize",
|
|
170
177
|
children: e.status.toLowerCase().replace("_", " ")
|
|
@@ -172,89 +179,89 @@ function x() {
|
|
|
172
179
|
}, e.id))
|
|
173
180
|
})] })
|
|
174
181
|
]
|
|
175
|
-
}), /* @__PURE__ */
|
|
182
|
+
}), /* @__PURE__ */ p("div", {
|
|
176
183
|
className: "space-y-6",
|
|
177
184
|
children: [
|
|
178
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ f(v, { children: "Timeline" }) }), /* @__PURE__ */ p(g, {
|
|
179
186
|
className: "space-y-3 text-sm",
|
|
180
|
-
children: [/* @__PURE__ */
|
|
187
|
+
children: [/* @__PURE__ */ p("div", {
|
|
181
188
|
className: "flex items-center gap-2",
|
|
182
189
|
children: [
|
|
183
|
-
/* @__PURE__ */
|
|
184
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ f(a, { className: "h-4 w-4 text-muted-foreground" }),
|
|
191
|
+
/* @__PURE__ */ f("span", {
|
|
185
192
|
className: "text-muted-foreground",
|
|
186
193
|
children: "Planned:"
|
|
187
194
|
}),
|
|
188
|
-
/* @__PURE__ */
|
|
195
|
+
/* @__PURE__ */ f("span", {
|
|
189
196
|
className: "font-medium",
|
|
190
|
-
children:
|
|
197
|
+
children: E.plannedDate ? new Date(E.plannedDate).toLocaleDateString() : "Not set"
|
|
191
198
|
})
|
|
192
199
|
]
|
|
193
|
-
}),
|
|
200
|
+
}), E.releasedAt && /* @__PURE__ */ p("div", {
|
|
194
201
|
className: "flex items-center gap-2",
|
|
195
202
|
children: [
|
|
196
|
-
/* @__PURE__ */
|
|
197
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ f(o, { className: "h-4 w-4 text-green-500" }),
|
|
204
|
+
/* @__PURE__ */ f("span", {
|
|
198
205
|
className: "text-muted-foreground",
|
|
199
206
|
children: "Released:"
|
|
200
207
|
}),
|
|
201
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ f("span", {
|
|
202
209
|
className: "font-medium",
|
|
203
|
-
children: new Date(
|
|
210
|
+
children: new Date(E.releasedAt).toLocaleDateString()
|
|
204
211
|
})
|
|
205
212
|
]
|
|
206
213
|
})]
|
|
207
214
|
})] }),
|
|
208
|
-
/* @__PURE__ */
|
|
215
|
+
/* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ f(v, { children: "Details" }) }), /* @__PURE__ */ p(g, {
|
|
209
216
|
className: "space-y-2 text-sm",
|
|
210
217
|
children: [
|
|
211
|
-
/* @__PURE__ */
|
|
218
|
+
/* @__PURE__ */ p("div", {
|
|
212
219
|
className: "flex justify-between",
|
|
213
|
-
children: [/* @__PURE__ */
|
|
220
|
+
children: [/* @__PURE__ */ f("span", {
|
|
214
221
|
className: "text-muted-foreground",
|
|
215
222
|
children: "Version"
|
|
216
|
-
}), /* @__PURE__ */
|
|
223
|
+
}), /* @__PURE__ */ f("span", {
|
|
217
224
|
className: "font-medium",
|
|
218
|
-
children:
|
|
225
|
+
children: E.version
|
|
219
226
|
})]
|
|
220
227
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ p("div", {
|
|
222
229
|
className: "flex justify-between",
|
|
223
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ f("span", {
|
|
224
231
|
className: "text-muted-foreground",
|
|
225
232
|
children: "Status"
|
|
226
|
-
}), /* @__PURE__ */
|
|
233
|
+
}), /* @__PURE__ */ f(m, {
|
|
227
234
|
variant: "outline",
|
|
228
235
|
className: "text-xs capitalize",
|
|
229
|
-
children:
|
|
236
|
+
children: E.status.toLowerCase().replace("_", " ")
|
|
230
237
|
})]
|
|
231
238
|
}),
|
|
232
|
-
/* @__PURE__ */
|
|
239
|
+
/* @__PURE__ */ p("div", {
|
|
233
240
|
className: "flex justify-between",
|
|
234
|
-
children: [/* @__PURE__ */
|
|
241
|
+
children: [/* @__PURE__ */ f("span", {
|
|
235
242
|
className: "text-muted-foreground",
|
|
236
243
|
children: "Owner"
|
|
237
|
-
}), /* @__PURE__ */
|
|
244
|
+
}), /* @__PURE__ */ f("span", { children: /* @__PURE__ */ f(t, { id: E.ownerId }) })]
|
|
238
245
|
}),
|
|
239
|
-
/* @__PURE__ */
|
|
246
|
+
/* @__PURE__ */ p("div", {
|
|
240
247
|
className: "flex justify-between",
|
|
241
|
-
children: [/* @__PURE__ */
|
|
248
|
+
children: [/* @__PURE__ */ f("span", {
|
|
242
249
|
className: "text-muted-foreground",
|
|
243
250
|
children: "Created"
|
|
244
|
-
}), /* @__PURE__ */
|
|
251
|
+
}), /* @__PURE__ */ f("span", { children: new Date(E.createdAt).toLocaleDateString() })]
|
|
245
252
|
}),
|
|
246
|
-
/* @__PURE__ */
|
|
253
|
+
/* @__PURE__ */ p("div", {
|
|
247
254
|
className: "flex justify-between",
|
|
248
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ f("span", {
|
|
249
256
|
className: "text-muted-foreground",
|
|
250
257
|
children: "Updated"
|
|
251
|
-
}), /* @__PURE__ */
|
|
258
|
+
}), /* @__PURE__ */ f("span", { children: new Date(E.updatedAt).toLocaleDateString() })]
|
|
252
259
|
})
|
|
253
260
|
]
|
|
254
261
|
})] }),
|
|
255
|
-
|
|
262
|
+
E.tags?.length > 0 && /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ f(v, { children: "Tags" }) }), /* @__PURE__ */ f(g, {
|
|
256
263
|
className: "flex flex-wrap gap-1",
|
|
257
|
-
children:
|
|
264
|
+
children: E.tags.map((e) => /* @__PURE__ */ f(m, {
|
|
258
265
|
variant: "outline",
|
|
259
266
|
className: "text-xs",
|
|
260
267
|
children: e
|
|
@@ -266,6 +273,6 @@ function x() {
|
|
|
266
273
|
});
|
|
267
274
|
}
|
|
268
275
|
//#endregion
|
|
269
|
-
export {
|
|
276
|
+
export { S as ProductsReleaseDetailPagePage };
|
|
270
277
|
|
|
271
278
|
//# sourceMappingURL=ProductsReleaseDetailPagePage.js.map
|