@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.
Files changed (32) hide show
  1. package/dist/generated/wspace-types.d.ts +50 -0
  2. package/dist/generated/wspace-types.d.ts.map +1 -1
  3. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoutes.js +67 -59
  5. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  6. package/dist/planmagnet/docs/DocStatusBadge.d.ts +8 -0
  7. package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +1 -0
  8. package/dist/planmagnet/docs/DocStatusBadge.js +28 -0
  9. package/dist/planmagnet/docs/DocStatusBadge.js.map +1 -0
  10. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts +2 -0
  11. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -0
  12. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +414 -0
  13. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -0
  14. package/dist/planmagnet/pages/DocsDocsPagePage.d.ts +3 -0
  15. package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +1 -0
  16. package/dist/planmagnet/pages/DocsDocsPagePage.js +224 -0
  17. package/dist/planmagnet/pages/DocsDocsPagePage.js.map +1 -0
  18. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  19. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +105 -98
  20. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  21. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  22. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +130 -128
  23. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  24. package/dist/planmagnet/releases/ReleaseGatesCard.d.ts +7 -0
  25. package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +1 -1
  26. package/dist/planmagnet/releases/ReleaseGatesCard.js +1 -1
  27. package/dist/planmagnet/releases/ReleaseGatesCard.js.map +1 -1
  28. package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts +7 -0
  29. package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts.map +1 -0
  30. package/dist/planmagnet/releases/ReleaseReadinessCard.js +390 -0
  31. package/dist/planmagnet/releases/ReleaseReadinessCard.js.map +1 -0
  32. 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":"AA4DA,wBAAgB,6BAA6B,4CAyM5C"}
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 { 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";
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 y = l`
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
- `, b = {
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 x() {
50
- let { workspaceId: l } = e(), x = c().id ?? "", { data: S, loading: C, error: w } = u(y, {
51
- variables: { id: x },
52
- skip: !x
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 (C && !S) return /* @__PURE__ */ d("div", {
55
+ if (w && !C) return /* @__PURE__ */ f("div", {
55
56
  className: "flex items-center justify-center p-12",
56
- children: /* @__PURE__ */ d(s, { className: "h-8 w-8 animate-spin text-muted-foreground" })
57
+ children: /* @__PURE__ */ f(c, { className: "h-8 w-8 animate-spin text-muted-foreground" })
57
58
  });
58
- if (w) return /* @__PURE__ */ f("div", {
59
+ if (T) return /* @__PURE__ */ p("div", {
59
60
  className: "p-6 text-destructive",
60
- children: ["Failed to load release: ", w.message]
61
+ children: ["Failed to load release: ", T.message]
61
62
  });
62
- let T = S?.planmagnetRelease;
63
- if (!T) return /* @__PURE__ */ d("div", {
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 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
+ 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__ */ f("div", {
71
+ children: [/* @__PURE__ */ p("div", {
71
72
  className: "flex items-center justify-between",
72
- children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ f("div", {
73
+ children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("div", {
73
74
  className: "flex items-center gap-2",
74
75
  children: [
75
- /* @__PURE__ */ d(o, { className: "h-5 w-5 text-primary" }),
76
- /* @__PURE__ */ d("h1", {
76
+ /* @__PURE__ */ f(s, { className: "h-5 w-5 text-primary" }),
77
+ /* @__PURE__ */ f("h1", {
77
78
  className: "text-2xl font-semibold",
78
- children: T.version
79
+ children: E.version
79
80
  }),
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("_", " ")
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__ */ d("p", {
86
+ }), /* @__PURE__ */ f("p", {
86
87
  className: "text-sm text-muted-foreground mt-1",
87
- children: T.name
88
- })] }), /* @__PURE__ */ d(p, {
88
+ children: E.name
89
+ })] }), /* @__PURE__ */ f(m, {
89
90
  variant: "outline",
90
91
  className: "capitalize",
91
- children: T.status.toLowerCase().replace("_", " ")
92
+ children: E.status.toLowerCase().replace("_", " ")
92
93
  })]
93
- }), /* @__PURE__ */ f("div", {
94
+ }), /* @__PURE__ */ p("div", {
94
95
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
95
- children: [/* @__PURE__ */ f("div", {
96
+ children: [/* @__PURE__ */ p("div", {
96
97
  className: "lg:col-span-2 space-y-6",
97
98
  children: [
98
- /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Overview" }) }), /* @__PURE__ */ f(h, {
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__ */ d("div", {
107
+ children: [/* @__PURE__ */ f("div", {
101
108
  className: "text-sm prose prose-sm dark:prose-invert max-w-none",
102
- children: T.description ? /* @__PURE__ */ d(v, { children: T.description }) : /* @__PURE__ */ d("p", { children: "No description provided." })
103
- }), /* @__PURE__ */ f("div", {
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__ */ f("div", {
113
+ /* @__PURE__ */ p("div", {
107
114
  className: "text-center p-3 bg-muted rounded-md",
108
- children: [/* @__PURE__ */ d("p", {
115
+ children: [/* @__PURE__ */ f("p", {
109
116
  className: "text-lg font-semibold mt-1",
110
- children: D.length
111
- }), /* @__PURE__ */ d("p", {
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__ */ f("div", {
123
+ /* @__PURE__ */ p("div", {
117
124
  className: "text-center p-3 bg-muted rounded-md",
118
- children: [/* @__PURE__ */ d("p", {
125
+ children: [/* @__PURE__ */ f("p", {
119
126
  className: "text-lg font-semibold mt-1",
120
- children: O.length
121
- }), /* @__PURE__ */ d("p", {
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__ */ f("div", {
133
+ /* @__PURE__ */ p("div", {
127
134
  className: "text-center p-3 bg-muted rounded-md",
128
- children: [/* @__PURE__ */ d("p", {
135
+ children: [/* @__PURE__ */ f("p", {
129
136
  className: "text-lg font-semibold mt-1",
130
- children: E.length
131
- }), /* @__PURE__ */ d("p", {
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__ */ d(r, {
140
- releaseId: T.id,
141
- projectId: T.projectId ?? null,
142
- releaseStatus: T.status
146
+ /* @__PURE__ */ f(r, {
147
+ releaseId: E.id,
148
+ projectId: E.projectId ?? null,
149
+ releaseStatus: E.status
143
150
  }),
144
- /* @__PURE__ */ d(n, {
145
- releaseId: T.id,
146
- notes: T.releaseNotes ?? null
151
+ /* @__PURE__ */ f(n, {
152
+ releaseId: E.id,
153
+ notes: E.releaseNotes ?? null
147
154
  }),
148
- E.length > 0 && /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ f(_, { children: [
155
+ D.length > 0 && /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ f(_, { children: /* @__PURE__ */ p(v, { children: [
149
156
  "Work Items (",
150
- E.length,
157
+ D.length,
151
158
  ")"
152
- ] }) }), /* @__PURE__ */ d(h, {
159
+ ] }) }), /* @__PURE__ */ f(g, {
153
160
  className: "space-y-2",
154
- children: E.map((e) => /* @__PURE__ */ f("div", {
161
+ children: D.map((e) => /* @__PURE__ */ p("div", {
155
162
  className: "flex items-center justify-between border rounded-md p-3",
156
- children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
163
+ children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
157
164
  className: "text-sm font-medium",
158
165
  children: e.title
159
- }), /* @__PURE__ */ f("p", {
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__ */ d(p, {
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__ */ f("div", {
182
+ }), /* @__PURE__ */ p("div", {
176
183
  className: "space-y-6",
177
184
  children: [
178
- /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Timeline" }) }), /* @__PURE__ */ f(h, {
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__ */ f("div", {
187
+ children: [/* @__PURE__ */ p("div", {
181
188
  className: "flex items-center gap-2",
182
189
  children: [
183
- /* @__PURE__ */ d(i, { className: "h-4 w-4 text-muted-foreground" }),
184
- /* @__PURE__ */ d("span", {
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__ */ d("span", {
195
+ /* @__PURE__ */ f("span", {
189
196
  className: "font-medium",
190
- children: T.plannedDate ? new Date(T.plannedDate).toLocaleDateString() : "Not set"
197
+ children: E.plannedDate ? new Date(E.plannedDate).toLocaleDateString() : "Not set"
191
198
  })
192
199
  ]
193
- }), T.releasedAt && /* @__PURE__ */ f("div", {
200
+ }), E.releasedAt && /* @__PURE__ */ p("div", {
194
201
  className: "flex items-center gap-2",
195
202
  children: [
196
- /* @__PURE__ */ d(a, { className: "h-4 w-4 text-green-500" }),
197
- /* @__PURE__ */ d("span", {
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__ */ d("span", {
208
+ /* @__PURE__ */ f("span", {
202
209
  className: "font-medium",
203
- children: new Date(T.releasedAt).toLocaleDateString()
210
+ children: new Date(E.releasedAt).toLocaleDateString()
204
211
  })
205
212
  ]
206
213
  })]
207
214
  })] }),
208
- /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Details" }) }), /* @__PURE__ */ f(h, {
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__ */ f("div", {
218
+ /* @__PURE__ */ p("div", {
212
219
  className: "flex justify-between",
213
- children: [/* @__PURE__ */ d("span", {
220
+ children: [/* @__PURE__ */ f("span", {
214
221
  className: "text-muted-foreground",
215
222
  children: "Version"
216
- }), /* @__PURE__ */ d("span", {
223
+ }), /* @__PURE__ */ f("span", {
217
224
  className: "font-medium",
218
- children: T.version
225
+ children: E.version
219
226
  })]
220
227
  }),
221
- /* @__PURE__ */ f("div", {
228
+ /* @__PURE__ */ p("div", {
222
229
  className: "flex justify-between",
223
- children: [/* @__PURE__ */ d("span", {
230
+ children: [/* @__PURE__ */ f("span", {
224
231
  className: "text-muted-foreground",
225
232
  children: "Status"
226
- }), /* @__PURE__ */ d(p, {
233
+ }), /* @__PURE__ */ f(m, {
227
234
  variant: "outline",
228
235
  className: "text-xs capitalize",
229
- children: T.status.toLowerCase().replace("_", " ")
236
+ children: E.status.toLowerCase().replace("_", " ")
230
237
  })]
231
238
  }),
232
- /* @__PURE__ */ f("div", {
239
+ /* @__PURE__ */ p("div", {
233
240
  className: "flex justify-between",
234
- children: [/* @__PURE__ */ d("span", {
241
+ children: [/* @__PURE__ */ f("span", {
235
242
  className: "text-muted-foreground",
236
243
  children: "Owner"
237
- }), /* @__PURE__ */ d("span", { children: /* @__PURE__ */ d(t, { id: T.ownerId }) })]
244
+ }), /* @__PURE__ */ f("span", { children: /* @__PURE__ */ f(t, { id: E.ownerId }) })]
238
245
  }),
239
- /* @__PURE__ */ f("div", {
246
+ /* @__PURE__ */ p("div", {
240
247
  className: "flex justify-between",
241
- children: [/* @__PURE__ */ d("span", {
248
+ children: [/* @__PURE__ */ f("span", {
242
249
  className: "text-muted-foreground",
243
250
  children: "Created"
244
- }), /* @__PURE__ */ d("span", { children: new Date(T.createdAt).toLocaleDateString() })]
251
+ }), /* @__PURE__ */ f("span", { children: new Date(E.createdAt).toLocaleDateString() })]
245
252
  }),
246
- /* @__PURE__ */ f("div", {
253
+ /* @__PURE__ */ p("div", {
247
254
  className: "flex justify-between",
248
- children: [/* @__PURE__ */ d("span", {
255
+ children: [/* @__PURE__ */ f("span", {
249
256
  className: "text-muted-foreground",
250
257
  children: "Updated"
251
- }), /* @__PURE__ */ d("span", { children: new Date(T.updatedAt).toLocaleDateString() })]
258
+ }), /* @__PURE__ */ f("span", { children: new Date(E.updatedAt).toLocaleDateString() })]
252
259
  })
253
260
  ]
254
261
  })] }),
255
- T.tags?.length > 0 && /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Tags" }) }), /* @__PURE__ */ d(h, {
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: T.tags.map((e) => /* @__PURE__ */ d(p, {
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 { x as ProductsReleaseDetailPagePage };
276
+ export { S as ProductsReleaseDetailPagePage };
270
277
 
271
278
  //# sourceMappingURL=ProductsReleaseDetailPagePage.js.map