@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
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsReleaseDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsReleaseDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Markdown } from '@burdenoff/fe-libs/shared/components';\nimport { GitBranch, Calendar, Clock, Server, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\nimport { ReleaseNotesCard } from '../releases/ReleaseNotesCard';\nimport { ReleaseGatesCard } from '../releases/ReleaseGatesCard';\n\nconst GET_RELEASE = gql`\n query GetRelease($id: ID!) {\n planmagnetRelease(id: $id) {\n id\n workspaceId\n projectId\n name\n description\n version\n status\n plannedDate\n releasedAt\n releaseNotes\n ownerId\n tags\n metadata\n createdAt\n updatedAt\n workItems {\n id\n title\n status\n type\n priority\n }\n }\n }\n`;\n\ninterface WorkItemSummary {\n id: string;\n title: string;\n status: string;\n type: string;\n priority: string;\n}\n\nconst statusColor: Record<string, string> = {\n DRAFT: 'bg-gray-100 text-gray-800',\n PLANNING: 'bg-yellow-100 text-yellow-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n READY: 'bg-orange-100 text-orange-800',\n RELEASED: 'bg-green-100 text-green-800',\n CANCELLED: 'bg-red-100 text-red-800',\n ROLLED_BACK: 'bg-red-100 text-red-800',\n};\n\nexport function ProductsReleaseDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const releaseId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_RELEASE, {\n variables: { id: releaseId },\n skip: !releaseId,\n });\n\n // Only before the first load: a refetch must not blank the page (it\n\n // unmounts every component on it and loses their state).\n\n if (loading && !data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-destructive\">Failed to load release: {error.message}</div>;\n }\n\n const release = data?.planmagnetRelease;\n if (!release) return <div className=\"p-6 text-muted-foreground\">Release not found.</div>;\n\n const workItems: WorkItemSummary[] = release.workItems ?? [];\n const featureItems = workItems.filter((w) => w.type === 'STORY' || w.type === 'FEATURE');\n const bugItems = workItems.filter((w) => w.type === 'BUG');\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <GitBranch className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{release.version}</h1>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[release.status] ?? 'bg-gray-100'}`}\n >\n {release.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">{release.name}</p>\n </div>\n <Badge variant=\"outline\" className=\"capitalize\">\n {release.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Overview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"text-sm prose prose-sm dark:prose-invert max-w-none\">\n {release.description ? (\n <Markdown>{release.description}</Markdown>\n ) : (\n <p>No description provided.</p>\n )}\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"text-center p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-semibold mt-1\">{featureItems.length}</p>\n <p className=\"text-xs text-muted-foreground\">Features</p>\n </div>\n <div className=\"text-center p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-semibold mt-1\">{bugItems.length}</p>\n <p className=\"text-xs text-muted-foreground\">Bug Fixes</p>\n </div>\n <div className=\"text-center p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-semibold mt-1\">{workItems.length}</p>\n <p className=\"text-xs text-muted-foreground\">Total Items</p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <ReleaseGatesCard\n releaseId={release.id}\n projectId={release.projectId ?? null}\n releaseStatus={release.status}\n />\n <ReleaseNotesCard releaseId={release.id} notes={release.releaseNotes ?? null} />\n\n {workItems.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Work Items ({workItems.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {workItems.map((item) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between border rounded-md p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{item.title}</p>\n <p className=\"text-xs text-muted-foreground capitalize\">\n {item.type.toLowerCase()} &middot; {item.priority.toLowerCase()} priority\n </p>\n </div>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {item.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Planned:</span>\n <span className=\"font-medium\">\n {release.plannedDate\n ? new Date(release.plannedDate).toLocaleDateString()\n : 'Not set'}\n </span>\n </div>\n {release.releasedAt && (\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-green-500\" />\n <span className=\"text-muted-foreground\">Released:</span>\n <span className=\"font-medium\">\n {new Date(release.releasedAt).toLocaleDateString()}\n </span>\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Version</span>\n <span className=\"font-medium\">{release.version}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {release.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>\n <PersonName id={release.ownerId} />\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(release.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(release.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n {release.tags?.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1\">\n {release.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProductsReleaseDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsReleaseDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Markdown } from '@burdenoff/fe-libs/shared/components';\nimport { GitBranch, Calendar, Clock, Server, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\nimport { ReleaseNotesCard } from '../releases/ReleaseNotesCard';\nimport { ReleaseGatesCard } from '../releases/ReleaseGatesCard';\nimport { ReleaseReadinessCard } from '../releases/ReleaseReadinessCard';\n\nconst GET_RELEASE = gql`\n query GetRelease($id: ID!) {\n planmagnetRelease(id: $id) {\n id\n workspaceId\n projectId\n name\n description\n version\n status\n plannedDate\n releasedAt\n releaseNotes\n ownerId\n tags\n metadata\n createdAt\n updatedAt\n workItems {\n id\n title\n status\n type\n priority\n }\n }\n }\n`;\n\ninterface WorkItemSummary {\n id: string;\n title: string;\n status: string;\n type: string;\n priority: string;\n}\n\nconst statusColor: Record<string, string> = {\n DRAFT: 'bg-gray-100 text-gray-800',\n PLANNING: 'bg-yellow-100 text-yellow-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n READY: 'bg-orange-100 text-orange-800',\n RELEASED: 'bg-green-100 text-green-800',\n CANCELLED: 'bg-red-100 text-red-800',\n ROLLED_BACK: 'bg-red-100 text-red-800',\n};\n\nexport function ProductsReleaseDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const releaseId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_RELEASE, {\n variables: { id: releaseId },\n skip: !releaseId,\n });\n\n // Only before the first load: a refetch must not blank the page (it\n\n // unmounts every component on it and loses their state).\n\n if (loading && !data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-destructive\">Failed to load release: {error.message}</div>;\n }\n\n const release = data?.planmagnetRelease;\n if (!release) return <div className=\"p-6 text-muted-foreground\">Release not found.</div>;\n\n const workItems: WorkItemSummary[] = release.workItems ?? [];\n const featureItems = workItems.filter((w) => w.type === 'STORY' || w.type === 'FEATURE');\n const bugItems = workItems.filter((w) => w.type === 'BUG');\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <GitBranch className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{release.version}</h1>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[release.status] ?? 'bg-gray-100'}`}\n >\n {release.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">{release.name}</p>\n </div>\n <Badge variant=\"outline\" className=\"capitalize\">\n {release.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <ReleaseReadinessCard\n releaseId={release.id}\n projectId={release.projectId || null}\n releaseStatus={release.status}\n plannedDate={release.plannedDate ?? null}\n />\n <Card>\n <CardHeader>\n <CardTitle>Overview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"text-sm prose prose-sm dark:prose-invert max-w-none\">\n {release.description ? (\n <Markdown>{release.description}</Markdown>\n ) : (\n <p>No description provided.</p>\n )}\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"text-center p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-semibold mt-1\">{featureItems.length}</p>\n <p className=\"text-xs text-muted-foreground\">Features</p>\n </div>\n <div className=\"text-center p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-semibold mt-1\">{bugItems.length}</p>\n <p className=\"text-xs text-muted-foreground\">Bug Fixes</p>\n </div>\n <div className=\"text-center p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-semibold mt-1\">{workItems.length}</p>\n <p className=\"text-xs text-muted-foreground\">Total Items</p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <ReleaseGatesCard\n releaseId={release.id}\n projectId={release.projectId ?? null}\n releaseStatus={release.status}\n />\n <ReleaseNotesCard releaseId={release.id} notes={release.releaseNotes ?? null} />\n\n {workItems.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Work Items ({workItems.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {workItems.map((item) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between border rounded-md p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{item.title}</p>\n <p className=\"text-xs text-muted-foreground capitalize\">\n {item.type.toLowerCase()} &middot; {item.priority.toLowerCase()} priority\n </p>\n </div>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {item.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Planned:</span>\n <span className=\"font-medium\">\n {release.plannedDate\n ? new Date(release.plannedDate).toLocaleDateString()\n : 'Not set'}\n </span>\n </div>\n {release.releasedAt && (\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-green-500\" />\n <span className=\"text-muted-foreground\">Released:</span>\n <span className=\"font-medium\">\n {new Date(release.releasedAt).toLocaleDateString()}\n </span>\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Version</span>\n <span className=\"font-medium\">{release.version}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {release.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>\n <PersonName id={release.ownerId} />\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(release.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(release.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n {release.tags?.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1\">\n {release.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TasksTaskDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"names":[],"mappings":"AA6RA,wBAAgB,uBAAuB,4CAgItC"}
1
+ {"version":3,"file":"TasksTaskDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"names":[],"mappings":"AAsSA,wBAAgB,uBAAuB,4CAgItC"}
@@ -1,16 +1,16 @@
1
- import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { throwOnError as t } from "../utils/mutationResult.js";
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
3
2
  import { MarkdownEditor as n } from "../../components/MarkdownEditor.js";
4
- import { WorkItemComments as r } from "../comments/WorkItemComments.js";
5
- import { WorkItemActivity as i } from "../comments/WorkItemActivity.js";
6
- import { useState as a } from "react";
7
- import { FileText as o, Plus as s, X as c } from "lucide-react";
8
- import { gql as l } from "@apollo/client";
9
- import { useMutation as u, useQuery as d } from "@apollo/client/react";
10
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
- import { Badge as m, Button as h, Card as g, CardContent as _, CardHeader as v, CardTitle as y, Input as b } from "@burdenoff/fe-libs/ui";
3
+ import { throwOnError as r } from "../utils/mutationResult.js";
4
+ import { WorkItemComments as i } from "../comments/WorkItemComments.js";
5
+ import { WorkItemActivity as a } from "../comments/WorkItemActivity.js";
6
+ import { useState as o } from "react";
7
+ import { FileText as s, Plus as c, X as l } from "lucide-react";
8
+ import { gql as u } from "@apollo/client";
9
+ import { useMutation as d, useQuery as f } from "@apollo/client/react";
10
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
+ import { Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, Input as x } from "@burdenoff/fe-libs/ui";
12
12
  //#region src/planmagnet/pages/TasksTaskDetailPagePage.tsx
13
- var x = l`
13
+ var S = u`
14
14
  query GetWorkItemDetail($workItemId: ID!) {
15
15
  planmagnetWorkItem(id: $workItemId) {
16
16
  id
@@ -32,7 +32,7 @@ var x = l`
32
32
  updatedAt
33
33
  }
34
34
  }
35
- `, S = l`
35
+ `, C = u`
36
36
  query GetWorkItemDocs($workItemId: ID!) {
37
37
  planmagnetWorkItemDocs(workItemId: $workItemId) {
38
38
  id
@@ -42,28 +42,28 @@ var x = l`
42
42
  updatedAt
43
43
  }
44
44
  }
45
- `, C = l`
45
+ `, w = u`
46
46
  mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {
47
47
  planmagnetCreateDoc(input: $input) {
48
48
  id
49
49
  }
50
50
  }
51
- `, w = l`
51
+ `, T = u`
52
52
  mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {
53
53
  planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {
54
54
  id
55
55
  }
56
56
  }
57
- `, T = l`
57
+ `, E = u`
58
58
  mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {
59
59
  planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)
60
60
  }
61
- `, E = {
61
+ `, D = {
62
62
  LOW: "bg-gray-100 text-gray-800",
63
63
  MEDIUM: "bg-blue-100 text-blue-800",
64
64
  HIGH: "bg-orange-100 text-orange-800",
65
65
  CRITICAL: "bg-red-100 text-red-800"
66
- }, D = {
66
+ }, O = {
67
67
  BACKLOG: "bg-gray-100 text-gray-800",
68
68
  TODO: "bg-blue-100 text-blue-800",
69
69
  IN_PROGRESS: "bg-yellow-100 text-yellow-800",
@@ -72,276 +72,278 @@ var x = l`
72
72
  BLOCKED: "bg-red-100 text-red-800",
73
73
  TESTING: "bg-teal-100 text-teal-800",
74
74
  CANCELLED: "bg-gray-100 text-gray-800"
75
- }, O = {
75
+ }, k = {
76
76
  DRAFT: "bg-gray-100 text-gray-800",
77
77
  PUBLISHED: "bg-green-100 text-green-800",
78
78
  ARCHIVED: "bg-gray-100 text-gray-500"
79
79
  };
80
- function k({ workItemId: e }) {
81
- let [r, i] = a(!1), [l, m] = a(""), [x, E] = a(""), { data: D, loading: k, error: A, refetch: j } = d(S, {
80
+ function A({ workItemId: e }) {
81
+ let i = t(), [a, u] = o(!1), [h, S] = o(""), [D, O] = o(""), { data: A, loading: j, error: M, refetch: N } = f(C, {
82
82
  variables: { workItemId: e },
83
83
  skip: !e
84
- }), [M, { loading: N }] = u(C), [P] = u(w), [F, { loading: I }] = u(T), [L, R] = a(null), z = D?.planmagnetWorkItemDocs ?? [], B = async () => {
85
- if (!(!l.trim() || !x.trim())) {
86
- R(null);
84
+ }), [P, { loading: F }] = d(w), [I] = d(T), [L, { loading: R }] = d(E), [z, B] = o(null), V = A?.planmagnetWorkItemDocs ?? [], H = async () => {
85
+ if (!(!h.trim() || !D.trim())) {
86
+ B(null);
87
87
  try {
88
- let n = (await t(M({ variables: { input: {
89
- title: l.trim(),
90
- content: x.trim()
88
+ let t = (await r(P({ variables: { input: {
89
+ title: h.trim(),
90
+ content: D.trim()
91
91
  } } }))).data?.planmagnetCreateDoc?.id;
92
- n && await t(P({ variables: {
93
- docId: n,
92
+ t && await r(I({ variables: {
93
+ docId: t,
94
94
  workItemId: e
95
95
  } }));
96
96
  } catch (e) {
97
- R(e instanceof Error ? e.message : "The doc could not be saved.");
97
+ B(e instanceof Error ? e.message : "The doc could not be saved.");
98
98
  return;
99
99
  }
100
- m(""), E(""), i(!1), j();
100
+ S(""), O(""), u(!1), N();
101
101
  }
102
- }, V = async (n) => {
103
- R(null);
102
+ }, U = async (t) => {
103
+ B(null);
104
104
  try {
105
- await t(F({ variables: {
106
- docId: n,
105
+ await r(L({ variables: {
106
+ docId: t,
107
107
  workItemId: e
108
108
  } }));
109
109
  } catch (e) {
110
- R(e instanceof Error ? e.message : "The doc could not be unlinked.");
110
+ B(e instanceof Error ? e.message : "The doc could not be unlinked.");
111
111
  return;
112
112
  }
113
- j();
113
+ N();
114
114
  };
115
- return /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ p(v, {
115
+ return /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ m(y, {
116
116
  className: "flex flex-row items-center justify-between space-y-0",
117
- children: [/* @__PURE__ */ f(y, { children: "Linked Docs" }), !r && /* @__PURE__ */ p(h, {
117
+ children: [/* @__PURE__ */ p(b, { children: "Linked Docs" }), !a && /* @__PURE__ */ m(g, {
118
118
  size: "sm",
119
119
  variant: "outline",
120
- onClick: () => i(!0),
121
- children: [/* @__PURE__ */ f(s, { className: "h-4 w-4 mr-1" }), "New Doc"]
120
+ onClick: () => u(!0),
121
+ children: [/* @__PURE__ */ p(c, { className: "h-4 w-4 mr-1" }), "New Doc"]
122
122
  })]
123
- }), /* @__PURE__ */ p(_, {
123
+ }), /* @__PURE__ */ m(v, {
124
124
  className: "space-y-4",
125
125
  children: [
126
- r && /* @__PURE__ */ p("div", {
126
+ a && /* @__PURE__ */ m("div", {
127
127
  className: "space-y-3 rounded-md border border-input p-3",
128
128
  children: [
129
- /* @__PURE__ */ f(b, {
129
+ /* @__PURE__ */ p(x, {
130
130
  placeholder: "Doc title",
131
- value: l,
132
- onChange: (e) => m(e.target.value)
131
+ value: h,
132
+ onChange: (e) => S(e.target.value)
133
133
  }),
134
- /* @__PURE__ */ f(n, {
135
- value: x,
136
- onChange: E,
134
+ /* @__PURE__ */ p(n, {
135
+ value: D,
136
+ onChange: O,
137
137
  placeholder: "Write the spec/doc content...",
138
138
  minHeight: 140
139
139
  }),
140
- /* @__PURE__ */ p("div", {
140
+ /* @__PURE__ */ m("div", {
141
141
  className: "flex gap-2 justify-end",
142
- children: [/* @__PURE__ */ f(h, {
142
+ children: [/* @__PURE__ */ p(g, {
143
143
  size: "sm",
144
144
  variant: "ghost",
145
145
  onClick: () => {
146
- i(!1), m(""), E("");
146
+ u(!1), S(""), O("");
147
147
  },
148
148
  children: "Cancel"
149
- }), /* @__PURE__ */ f(h, {
149
+ }), /* @__PURE__ */ p(g, {
150
150
  size: "sm",
151
- disabled: N || !l.trim() || !x.trim(),
152
- onClick: B,
153
- children: N ? "Creating..." : "Create & Link"
151
+ disabled: F || !h.trim() || !D.trim(),
152
+ onClick: H,
153
+ children: F ? "Creating..." : "Create & Link"
154
154
  })]
155
155
  })
156
156
  ]
157
157
  }),
158
- k && /* @__PURE__ */ f("p", {
158
+ j && /* @__PURE__ */ p("p", {
159
159
  className: "text-sm text-muted-foreground",
160
160
  children: "Loading docs..."
161
161
  }),
162
- A && /* @__PURE__ */ p("p", {
162
+ M && /* @__PURE__ */ m("p", {
163
163
  className: "text-sm text-red-500",
164
- children: ["Error: ", A.message]
164
+ children: ["Error: ", M.message]
165
165
  }),
166
- L && /* @__PURE__ */ f("p", {
166
+ z && /* @__PURE__ */ p("p", {
167
167
  role: "alert",
168
168
  className: "text-sm text-destructive",
169
- children: L
169
+ children: z
170
170
  }),
171
- !k && !A && z.length === 0 && !r && /* @__PURE__ */ f("p", {
171
+ !j && !M && V.length === 0 && !a && /* @__PURE__ */ p("p", {
172
172
  className: "text-sm text-muted-foreground",
173
173
  children: "No docs linked to this work item yet."
174
174
  }),
175
- z.map((e) => /* @__PURE__ */ p("div", {
175
+ V.map((e) => /* @__PURE__ */ m("div", {
176
176
  className: "flex items-center justify-between gap-3 rounded-md border border-input p-3",
177
- children: [/* @__PURE__ */ p("div", {
177
+ children: [/* @__PURE__ */ m("div", {
178
178
  className: "flex items-center gap-2 min-w-0",
179
- children: [/* @__PURE__ */ f(o, { className: "h-4 w-4 text-muted-foreground shrink-0" }), /* @__PURE__ */ p("div", {
179
+ children: [/* @__PURE__ */ p(s, { className: "h-4 w-4 text-muted-foreground shrink-0" }), /* @__PURE__ */ m("div", {
180
180
  className: "min-w-0",
181
- children: [/* @__PURE__ */ f("p", {
182
- className: "text-sm font-medium truncate",
181
+ children: [/* @__PURE__ */ p("button", {
182
+ type: "button",
183
+ className: "block max-w-full truncate text-left text-sm font-medium hover:underline",
184
+ onClick: () => i(`/docs/doc-detail-page?docId=${encodeURIComponent(e.id)}`),
183
185
  children: e.title
184
- }), /* @__PURE__ */ p("p", {
186
+ }), /* @__PURE__ */ m("p", {
185
187
  className: "text-xs text-muted-foreground",
186
188
  children: ["v", e.version]
187
189
  })]
188
190
  })]
189
- }), /* @__PURE__ */ p("div", {
191
+ }), /* @__PURE__ */ m("div", {
190
192
  className: "flex items-center gap-2 shrink-0",
191
- children: [/* @__PURE__ */ f("span", {
192
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${O[e.status] ?? ""}`,
193
+ children: [/* @__PURE__ */ p("span", {
194
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${k[e.status] ?? ""}`,
193
195
  children: e.status.toLowerCase()
194
- }), /* @__PURE__ */ f(h, {
196
+ }), /* @__PURE__ */ p(g, {
195
197
  size: "icon",
196
198
  variant: "ghost",
197
- disabled: I,
198
- onClick: () => V(e.id),
199
+ disabled: R,
200
+ onClick: () => U(e.id),
199
201
  "aria-label": `Unlink ${e.title}`,
200
- children: /* @__PURE__ */ f(c, { className: "h-4 w-4" })
202
+ children: /* @__PURE__ */ p(l, { className: "h-4 w-4" })
201
203
  })]
202
204
  })]
203
205
  }, e.id))
204
206
  ]
205
207
  })] });
206
208
  }
207
- function A() {
208
- let { workspaceId: t } = e(), n = new URLSearchParams(window.location.search).get("taskId") ?? "", { data: a, loading: o, error: s } = d(x, {
209
+ function j() {
210
+ let { workspaceId: t } = e(), n = new URLSearchParams(window.location.search).get("taskId") ?? "", { data: r, loading: o, error: s } = f(S, {
209
211
  variables: { workItemId: n },
210
212
  skip: !t || !n
211
213
  });
212
- if (o && !a) return /* @__PURE__ */ f("div", {
214
+ if (o && !r) return /* @__PURE__ */ p("div", {
213
215
  className: "flex items-center justify-center p-12",
214
- children: /* @__PURE__ */ f("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
216
+ children: /* @__PURE__ */ p("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
215
217
  });
216
- if (s) return /* @__PURE__ */ p("div", {
218
+ if (s) return /* @__PURE__ */ m("div", {
217
219
  className: "p-6 text-red-500",
218
220
  children: ["Error: ", s.message]
219
221
  });
220
- let c = a?.planmagnetWorkItem;
221
- if (!c) return /* @__PURE__ */ f("div", {
222
+ let c = r?.planmagnetWorkItem;
223
+ if (!c) return /* @__PURE__ */ p("div", {
222
224
  className: "p-6 text-muted-foreground",
223
225
  children: "Task not found."
224
226
  });
225
227
  let l = c.status.toLowerCase().replace("_", " ");
226
- return /* @__PURE__ */ p("div", {
228
+ return /* @__PURE__ */ m("div", {
227
229
  className: "space-y-6 p-6",
228
- children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
230
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h1", {
229
231
  className: "text-2xl font-semibold",
230
232
  children: c.title
231
- }), /* @__PURE__ */ p("p", {
233
+ }), /* @__PURE__ */ m("p", {
232
234
  className: "text-sm text-muted-foreground",
233
235
  children: [
234
236
  c.key,
235
237
  " · ",
236
238
  c.type.toLowerCase()
237
239
  ]
238
- })] }), /* @__PURE__ */ p("div", {
240
+ })] }), /* @__PURE__ */ m("div", {
239
241
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
240
- children: [/* @__PURE__ */ p("div", {
242
+ children: [/* @__PURE__ */ m("div", {
241
243
  className: "lg:col-span-2 space-y-6",
242
244
  children: [
243
- /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ f(y, { children: "Description" }) }), /* @__PURE__ */ f(_, { children: /* @__PURE__ */ f("p", {
245
+ /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: "Description" }) }), /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p("p", {
244
246
  className: "text-sm",
245
247
  children: c.description ?? "No description provided."
246
248
  }) })] }),
247
- /* @__PURE__ */ f(k, { workItemId: c.id }),
248
- /* @__PURE__ */ f(r, { workItemId: c.id }),
249
- /* @__PURE__ */ f(i, { workItemId: c.id })
249
+ /* @__PURE__ */ p(A, { workItemId: c.id }),
250
+ /* @__PURE__ */ p(i, { workItemId: c.id }),
251
+ /* @__PURE__ */ p(a, { workItemId: c.id })
250
252
  ]
251
- }), /* @__PURE__ */ f("div", {
253
+ }), /* @__PURE__ */ p("div", {
252
254
  className: "space-y-6",
253
- children: /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ f(y, { children: "Details" }) }), /* @__PURE__ */ p(_, {
255
+ children: /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: "Details" }) }), /* @__PURE__ */ m(v, {
254
256
  className: "space-y-3 text-sm",
255
257
  children: [
256
- /* @__PURE__ */ p("div", {
258
+ /* @__PURE__ */ m("div", {
257
259
  className: "flex justify-between",
258
- children: [/* @__PURE__ */ f("span", {
260
+ children: [/* @__PURE__ */ p("span", {
259
261
  className: "text-muted-foreground",
260
262
  children: "Status"
261
- }), /* @__PURE__ */ f("span", {
262
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${D[c.status] ?? ""}`,
263
+ }), /* @__PURE__ */ p("span", {
264
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${O[c.status] ?? ""}`,
263
265
  children: l
264
266
  })]
265
267
  }),
266
- /* @__PURE__ */ p("div", {
268
+ /* @__PURE__ */ m("div", {
267
269
  className: "flex justify-between",
268
- children: [/* @__PURE__ */ f("span", {
270
+ children: [/* @__PURE__ */ p("span", {
269
271
  className: "text-muted-foreground",
270
272
  children: "Priority"
271
- }), /* @__PURE__ */ f("span", {
272
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${E[c.priority] ?? ""}`,
273
+ }), /* @__PURE__ */ p("span", {
274
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${D[c.priority] ?? ""}`,
273
275
  children: c.priority.toLowerCase()
274
276
  })]
275
277
  }),
276
- /* @__PURE__ */ p("div", {
278
+ /* @__PURE__ */ m("div", {
277
279
  className: "flex justify-between",
278
- children: [/* @__PURE__ */ f("span", {
280
+ children: [/* @__PURE__ */ p("span", {
279
281
  className: "text-muted-foreground",
280
282
  children: "Type"
281
- }), /* @__PURE__ */ f(m, {
283
+ }), /* @__PURE__ */ p(h, {
282
284
  variant: "outline",
283
285
  className: "capitalize",
284
286
  children: c.type.toLowerCase()
285
287
  })]
286
288
  }),
287
- /* @__PURE__ */ p("div", {
289
+ /* @__PURE__ */ m("div", {
288
290
  className: "flex justify-between",
289
- children: [/* @__PURE__ */ f("span", {
291
+ children: [/* @__PURE__ */ p("span", {
290
292
  className: "text-muted-foreground",
291
293
  children: "Story Points"
292
- }), /* @__PURE__ */ f("span", {
294
+ }), /* @__PURE__ */ p("span", {
293
295
  className: "font-medium",
294
296
  children: c.storyPoints ?? 0
295
297
  })]
296
298
  }),
297
- /* @__PURE__ */ p("div", {
299
+ /* @__PURE__ */ m("div", {
298
300
  className: "flex justify-between",
299
- children: [/* @__PURE__ */ f("span", {
301
+ children: [/* @__PURE__ */ p("span", {
300
302
  className: "text-muted-foreground",
301
303
  children: "Assignee"
302
- }), /* @__PURE__ */ f("span", { children: c.assigneeId ?? "Unassigned" })]
304
+ }), /* @__PURE__ */ p("span", { children: c.assigneeId ?? "Unassigned" })]
303
305
  }),
304
- /* @__PURE__ */ p("div", {
306
+ /* @__PURE__ */ m("div", {
305
307
  className: "flex justify-between",
306
- children: [/* @__PURE__ */ f("span", {
308
+ children: [/* @__PURE__ */ p("span", {
307
309
  className: "text-muted-foreground",
308
310
  children: "Reporter"
309
- }), /* @__PURE__ */ f("span", { children: c.reporterId ?? "Unknown" })]
311
+ }), /* @__PURE__ */ p("span", { children: c.reporterId ?? "Unknown" })]
310
312
  }),
311
- /* @__PURE__ */ p("div", {
313
+ /* @__PURE__ */ m("div", {
312
314
  className: "flex justify-between",
313
- children: [/* @__PURE__ */ f("span", {
315
+ children: [/* @__PURE__ */ p("span", {
314
316
  className: "text-muted-foreground",
315
317
  children: "Key"
316
- }), /* @__PURE__ */ f("span", { children: c.key })]
318
+ }), /* @__PURE__ */ p("span", { children: c.key })]
317
319
  }),
318
- /* @__PURE__ */ p("div", {
320
+ /* @__PURE__ */ m("div", {
319
321
  className: "flex justify-between",
320
- children: [/* @__PURE__ */ f("span", {
322
+ children: [/* @__PURE__ */ p("span", {
321
323
  className: "text-muted-foreground",
322
324
  children: "Due Date"
323
- }), /* @__PURE__ */ f("span", { children: c.dueDate ?? "Not set" })]
325
+ }), /* @__PURE__ */ p("span", { children: c.dueDate ?? "Not set" })]
324
326
  }),
325
- /* @__PURE__ */ p("div", {
327
+ /* @__PURE__ */ m("div", {
326
328
  className: "flex justify-between",
327
- children: [/* @__PURE__ */ f("span", {
329
+ children: [/* @__PURE__ */ p("span", {
328
330
  className: "text-muted-foreground",
329
331
  children: "Created"
330
- }), /* @__PURE__ */ f("span", { children: c.createdAt })]
332
+ }), /* @__PURE__ */ p("span", { children: c.createdAt })]
331
333
  }),
332
- /* @__PURE__ */ p("div", {
334
+ /* @__PURE__ */ m("div", {
333
335
  className: "flex justify-between",
334
- children: [/* @__PURE__ */ f("span", {
336
+ children: [/* @__PURE__ */ p("span", {
335
337
  className: "text-muted-foreground",
336
338
  children: "Updated"
337
- }), /* @__PURE__ */ f("span", { children: c.updatedAt })]
339
+ }), /* @__PURE__ */ p("span", { children: c.updatedAt })]
338
340
  }),
339
- /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("span", {
341
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("span", {
340
342
  className: "text-muted-foreground text-xs",
341
343
  children: "Labels"
342
- }), /* @__PURE__ */ f("div", {
344
+ }), /* @__PURE__ */ p("div", {
343
345
  className: "flex gap-1 mt-1 flex-wrap",
344
- children: (c.labels ?? []).map((e) => /* @__PURE__ */ f("span", {
346
+ children: (c.labels ?? []).map((e) => /* @__PURE__ */ p("span", {
345
347
  className: "text-xs px-2 py-0.5 rounded bg-muted",
346
348
  children: e
347
349
  }, e))
@@ -353,6 +355,6 @@ function A() {
353
355
  });
354
356
  }
355
357
  //#endregion
356
- export { A as TasksTaskDetailPagePage };
358
+ export { j as TasksTaskDetailPagePage };
357
359
 
358
360
  //# sourceMappingURL=TasksTaskDetailPagePage.js.map