@burdenoff/microfe-planmagnet 2026.924.2 → 2026.924.4

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 (75) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +93 -142
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  5. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +150 -149
  6. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  7. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  8. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +180 -172
  9. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  10. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  11. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +113 -116
  12. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  13. package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +1 -1
  14. package/dist/planmagnet/pages/GoalsGoalsPagePage.js +59 -58
  15. package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +1 -1
  16. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  17. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +150 -149
  18. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  19. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  20. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +108 -107
  21. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  22. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +93 -92
  24. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProductsProductsPagePage.js +89 -87
  27. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +94 -93
  30. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +57 -56
  33. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -81
  36. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +72 -71
  39. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +38 -37
  42. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +72 -71
  45. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +47 -46
  48. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +120 -119
  51. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +131 -130
  54. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +77 -75
  57. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ReportsReportsPagePage.js +71 -70
  60. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/TeamTeamPagePage.js +58 -57
  63. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +81 -72
  66. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +15 -0
  68. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -0
  69. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +302 -0
  70. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -0
  71. package/dist/planmagnet/people/People.d.ts +20 -0
  72. package/dist/planmagnet/people/People.d.ts.map +1 -0
  73. package/dist/planmagnet/people/People.js +42 -0
  74. package/dist/planmagnet/people/People.js.map +1 -0
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsReleasesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsReleasesPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { GitBranch, Calendar, Package, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\n\nconst LIST_RELEASES = gql`\n query ListReleases(\n $workspaceId: ID!\n $filter: PlanmagnetReleaseFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetReleases(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\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 createdAt\n updatedAt\n }\n totalCount\n }\n }\n`;\n\ninterface ReleaseNode {\n id: string;\n name: string;\n description: string | null;\n version: string;\n status: string;\n plannedDate: string | null;\n releasedAt: string | null;\n releaseNotes: string | null;\n ownerId: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nconst statusTabs = [\n 'all',\n 'DRAFT',\n 'PLANNING',\n 'IN_PROGRESS',\n 'READY',\n 'RELEASED',\n 'CANCELLED',\n] as const;\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 ProductsReleasesPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [activeTab, setActiveTab] = useState<string>('all');\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>>(LIST_RELEASES, {\n variables: {\n workspaceId,\n filter: activeTab !== 'all' ? { status: activeTab } : undefined,\n pagination: { first: 50 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 releases: {error.message}</div>;\n }\n\n const releases: ReleaseNode[] = data?.planmagnetReleases?.items ?? [];\n const totalCount = data?.planmagnetReleases?.totalCount ?? 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Releases</h1>\n <p className=\"text-sm text-muted-foreground\">{totalCount} releases across all products</p>\n </div>\n <Button size=\"sm\">\n <GitBranch className=\"mr-1 h-4 w-4\" />\n New Release\n </Button>\n </div>\n\n <div className=\"flex gap-1 border-b pb-1\">\n {statusTabs.map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n className={`px-3 py-1.5 text-sm rounded-md capitalize ${activeTab === tab ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {tab === 'all' ? 'All' : tab.toLowerCase().replace('_', ' ')}\n </button>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {releases.map((release) => (\n <Card\n key={release.id}\n {...rowLinkProps(\n () => navigate(detailPath('/products/release-detail-page', release.id)),\n release.name\n )}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg font-semibold\">{release.version}</span>\n </div>\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 <CardTitle className=\"text-sm font-medium\">{release.name}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {release.description ?? 'No description'}\n </p>\n\n <div className=\"flex items-center gap-4 text-sm\">\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <Package className=\"h-3.5 w-3.5\" />\n Owner: {release.ownerId}\n </div>\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <Calendar className=\"h-3.5 w-3.5\" />\n {release.plannedDate\n ? new Date(release.plannedDate).toLocaleDateString()\n : 'No date'}\n </div>\n </div>\n\n {release.tags.length > 0 && (\n <div className=\"flex gap-1 flex-wrap\">\n {release.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n\n {release.releaseNotes && (\n <div className=\"border-t pt-2\">\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">\n Release Notes Preview\n </p>\n <p className=\"text-xs text-muted-foreground line-clamp-3\">\n {release.releaseNotes}\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n {releases.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">No releases match this filter.</p>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CnB,IAAa;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EACK,IAAsC;CAC1C,OAAO;CACP,UAAU;CACV,aAAa;CACb,OAAO;CACP,UAAU;CACV,WAAW;CACX,aAAa;CACd;AAED,SAAgB,IAA2B;CACzC,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAClC,CAAC,GAAW,KAAgB,EAAiB,MAAM,EAEnD,EACJ,SACA,YACA,aAGA,EAA8B,GAAe;EAC3C,WAAW;GACT;GACA,QAAQ,MAAc,QAAgC,KAAA,IAAxB,EAAE,QAAQ,GAAW;GACnD,YAAY,EAAE,OAAO,IAAI;GAC1B;EACD,MAAM,CAAC;EACR,CAAC;AAEJ,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAS,WAAU,8CAA+C,CAAA;EAC9D,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAsC,6BAA0B,EAAM,QAAc;;CAG7F,IAAM,IAA0B,GAAM,oBAAoB,SAAS,EAAE,EAC/D,IAAa,GAAM,oBAAoB,cAAc;AAE3D,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAyB;KAAa,CAAA,EACpD,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA8C,GAAW,gCAAiC;OACtF,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAW,WAAU,gBAAiB,CAAA,EAAA,cAE/B;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAW,KAAK,MACf,kBAAC,UAAD;KAEE,eAAe,EAAa,EAAI;KAChC,WAAW,6CAA6C,MAAc,IAAM,uCAAuC;eAElH,MAAQ,QAAQ,QAAQ,EAAI,aAAa,CAAC,QAAQ,KAAK,IAAI;KACrD,EALF,EAKE,CACT;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,KAAK,MACb,kBAAC,GAAD;KAEE,GAAI,QACI,EAAS,EAAW,iCAAiC,EAAQ,GAAG,CAAC,EACvE,EAAQ,KACT;eALH,CAOE,kBAAC,GAAD;MAAY,WAAU;gBAAtB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,QAAD;SAAM,WAAU;mBAAyB,EAAQ;SAAe,CAAA;QAC5D,CAAA,EACN,kBAAC,QAAD;QACE,WAAW,+CAA+C,EAAY,EAAQ,WAAW;kBAExF,EAAQ,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;QAC1C,CAAA,CACH;UACN,kBAAC,GAAD;OAAW,WAAU;iBAAuB,EAAQ;OAAiB,CAAA,CAC1D;SACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ,eAAe;QACtB,CAAA;OAEJ,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,GAAD,EAAS,WAAU,eAAgB,CAAA;;UAC3B,EAAQ;UACZ;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA,EACnC,EAAQ,cACL,IAAI,KAAK,EAAQ,YAAY,CAAC,oBAAoB,GAClD,UACA;WACF;;OAEL,EAAQ,KAAK,SAAS,KACrB,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAQ,KAAK,KAAK,MACjB,kBAAC,GAAD;SAAiB,SAAQ;SAAU,WAAU;mBAC1C;SACK,EAFI,EAEJ,CACR;QACE,CAAA;OAGP,EAAQ,gBACP,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAiD;SAE1D,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAQ;SACP,CAAA,CACA;;OAEI;QACT;OA1DA,EAAQ,GA0DR,CACP;IACE,CAAA;GACL,EAAS,WAAW,KACnB,kBAAC,KAAD;IAAG,WAAU;cAAyC;IAAkC,CAAA;GAEtF"}
1
+ {"version":3,"file":"ProductsReleasesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsReleasesPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { GitBranch, Calendar, Package, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\n\nconst LIST_RELEASES = gql`\n query ListReleases(\n $workspaceId: ID!\n $filter: PlanmagnetReleaseFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetReleases(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\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 createdAt\n updatedAt\n }\n totalCount\n }\n }\n`;\n\ninterface ReleaseNode {\n id: string;\n name: string;\n description: string | null;\n version: string;\n status: string;\n plannedDate: string | null;\n releasedAt: string | null;\n releaseNotes: string | null;\n ownerId: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nconst statusTabs = [\n 'all',\n 'DRAFT',\n 'PLANNING',\n 'IN_PROGRESS',\n 'READY',\n 'RELEASED',\n 'CANCELLED',\n] as const;\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 ProductsReleasesPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [activeTab, setActiveTab] = useState<string>('all');\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>>(LIST_RELEASES, {\n variables: {\n workspaceId,\n filter: activeTab !== 'all' ? { status: activeTab } : undefined,\n pagination: { first: 50 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 releases: {error.message}</div>;\n }\n\n const releases: ReleaseNode[] = data?.planmagnetReleases?.items ?? [];\n const totalCount = data?.planmagnetReleases?.totalCount ?? 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Releases</h1>\n <p className=\"text-sm text-muted-foreground\">{totalCount} releases across all products</p>\n </div>\n <Button size=\"sm\">\n <GitBranch className=\"mr-1 h-4 w-4\" />\n New Release\n </Button>\n </div>\n\n <div className=\"flex gap-1 border-b pb-1\">\n {statusTabs.map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n className={`px-3 py-1.5 text-sm rounded-md capitalize ${activeTab === tab ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {tab === 'all' ? 'All' : tab.toLowerCase().replace('_', ' ')}\n </button>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {releases.map((release) => (\n <Card\n key={release.id}\n {...rowLinkProps(\n () => navigate(detailPath('/products/release-detail-page', release.id)),\n release.name\n )}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg font-semibold\">{release.version}</span>\n </div>\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 <CardTitle className=\"text-sm font-medium\">{release.name}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {release.description ?? 'No description'}\n </p>\n\n <div className=\"flex items-center gap-4 text-sm\">\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <Package className=\"h-3.5 w-3.5\" />\n Owner: <PersonName id={release.ownerId} />\n </div>\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <Calendar className=\"h-3.5 w-3.5\" />\n {release.plannedDate\n ? new Date(release.plannedDate).toLocaleDateString()\n : 'No date'}\n </div>\n </div>\n\n {release.tags.length > 0 && (\n <div className=\"flex gap-1 flex-wrap\">\n {release.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n\n {release.releaseNotes && (\n <div className=\"border-t pt-2\">\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">\n Release Notes Preview\n </p>\n <p className=\"text-xs text-muted-foreground line-clamp-3\">\n {release.releaseNotes}\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n {releases.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">No releases match this filter.</p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsRoadmapDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,6BAA6B,4CAuL5C"}
1
+ {"version":3,"file":"ProductsRoadmapDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,6BAA6B,4CAyL5C"}
@@ -1,12 +1,13 @@
1
1
  import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { Calendar as t, Loader2 as n, Map as r } from "lucide-react";
3
- import { useParams as i } from "react-router";
4
- import { gql as a } from "@apollo/client";
5
- import { useQuery as o } from "@apollo/client/react";
6
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
- import { Badge as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p } from "@burdenoff/fe-libs/ui";
2
+ import { PersonName as t } from "../people/People.js";
3
+ import { Calendar as n, Loader2 as r, Map as i } from "lucide-react";
4
+ import { useParams as a } from "react-router";
5
+ import { gql as o } from "@apollo/client";
6
+ import { useQuery as s } from "@apollo/client/react";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ import { Badge as u, Card as d, CardContent as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx
9
- var m = a`
10
+ var h = o`
10
11
  query GetRoadmapDetailPage($id: ID!) {
11
12
  planmagnetRoadmap(id: $id) {
12
13
  id
@@ -33,7 +34,7 @@ var m = a`
33
34
  }
34
35
  }
35
36
  }
36
- `, h = {
37
+ `, g = {
37
38
  TODO: "bg-gray-100 text-gray-800",
38
39
  IN_PROGRESS: "bg-blue-100 text-blue-800",
39
40
  DONE: "bg-green-100 text-green-800",
@@ -41,184 +42,184 @@ var m = a`
41
42
  BLOCKED: "bg-red-100 text-red-800",
42
43
  PLANNED: "bg-yellow-100 text-yellow-800"
43
44
  };
44
- function g() {
45
- let { workspaceId: a } = e(), g = i().id ?? "", { data: _, loading: v, error: y } = o(m, {
46
- variables: { id: g },
47
- skip: !g
45
+ function _() {
46
+ let { workspaceId: o } = e(), _ = a().id ?? "", { data: v, loading: y, error: b } = s(h, {
47
+ variables: { id: _ },
48
+ skip: !_
48
49
  });
49
- if (v) return /* @__PURE__ */ s("div", {
50
+ if (y) return /* @__PURE__ */ c("div", {
50
51
  className: "flex items-center justify-center p-12",
51
- children: /* @__PURE__ */ s(n, { className: "h-8 w-8 animate-spin text-muted-foreground" })
52
+ children: /* @__PURE__ */ c(r, { className: "h-8 w-8 animate-spin text-muted-foreground" })
52
53
  });
53
- if (y) return /* @__PURE__ */ c("div", {
54
+ if (b) return /* @__PURE__ */ l("div", {
54
55
  className: "p-6 text-destructive",
55
- children: ["Failed to load roadmap: ", y.message]
56
+ children: ["Failed to load roadmap: ", b.message]
56
57
  });
57
- let b = _?.planmagnetRoadmap;
58
- if (!b) return /* @__PURE__ */ s("div", {
58
+ let x = v?.planmagnetRoadmap;
59
+ if (!x) return /* @__PURE__ */ c("div", {
59
60
  className: "p-6 text-muted-foreground",
60
61
  children: "Roadmap not found."
61
62
  });
62
- let x = (b.items ?? []).slice().sort((e, t) => e.sortOrder - t.sortOrder), S = x.filter((e) => e.status === "COMPLETED" || e.status === "DONE"), C = x.length > 0 ? Math.round(S.length / x.length * 100) : 0, w = {};
63
- for (let e of x) {
63
+ let S = (x.items ?? []).slice().sort((e, t) => e.sortOrder - t.sortOrder), C = S.filter((e) => e.status === "COMPLETED" || e.status === "DONE"), w = S.length > 0 ? Math.round(C.length / S.length * 100) : 0, T = {};
64
+ for (let e of S) {
64
65
  let t = e.swimlane ?? "Uncategorized";
65
- w[t] || (w[t] = []), w[t].push(e);
66
+ T[t] || (T[t] = []), T[t].push(e);
66
67
  }
67
- return /* @__PURE__ */ c("div", {
68
+ return /* @__PURE__ */ l("div", {
68
69
  className: "space-y-6 p-6",
69
70
  children: [
70
- /* @__PURE__ */ c("div", {
71
+ /* @__PURE__ */ l("div", {
71
72
  className: "flex items-center justify-between",
72
- children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ c("div", {
73
+ children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
73
74
  className: "flex items-center gap-2",
74
- children: [/* @__PURE__ */ s(r, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ s("h1", {
75
+ children: [/* @__PURE__ */ c(i, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ c("h1", {
75
76
  className: "text-2xl font-semibold",
76
- children: b.name
77
+ children: x.name
77
78
  })]
78
- }), /* @__PURE__ */ s("p", {
79
+ }), /* @__PURE__ */ c("p", {
79
80
  className: "text-sm text-muted-foreground mt-1",
80
- children: b.description ?? "No description"
81
- })] }), /* @__PURE__ */ c("div", {
81
+ children: x.description ?? "No description"
82
+ })] }), /* @__PURE__ */ l("div", {
82
83
  className: "flex gap-2",
83
- children: [/* @__PURE__ */ s(l, {
84
- variant: b.isPublic ? "default" : "secondary",
84
+ children: [/* @__PURE__ */ c(u, {
85
+ variant: x.isPublic ? "default" : "secondary",
85
86
  className: "capitalize",
86
- children: b.isPublic ? "public" : "private"
87
- }), /* @__PURE__ */ s(l, {
87
+ children: x.isPublic ? "public" : "private"
88
+ }), /* @__PURE__ */ c(u, {
88
89
  variant: "outline",
89
90
  className: "capitalize",
90
- children: b.type.toLowerCase()
91
+ children: x.type.toLowerCase()
91
92
  })]
92
93
  })]
93
94
  }),
94
- /* @__PURE__ */ s("div", {
95
+ /* @__PURE__ */ c("div", {
95
96
  className: "grid grid-cols-2 md:grid-cols-5 gap-4",
96
97
  children: [
97
98
  {
98
99
  label: "Progress",
99
- value: `${C}%`
100
+ value: `${w}%`
100
101
  },
101
102
  {
102
103
  label: "Total Items",
103
- value: x.length
104
+ value: S.length
104
105
  },
105
106
  {
106
107
  label: "Completed",
107
- value: S.length
108
+ value: C.length
108
109
  },
109
110
  {
110
111
  label: "Type",
111
- value: b.type.toLowerCase()
112
+ value: x.type.toLowerCase()
112
113
  },
113
114
  {
114
115
  label: "Visibility",
115
- value: b.isPublic ? "Public" : "Private"
116
+ value: x.isPublic ? "Public" : "Private"
116
117
  }
117
- ].map((e) => /* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
118
+ ].map((e) => /* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
118
119
  className: "pt-4 text-center",
119
- children: [/* @__PURE__ */ s("p", {
120
+ children: [/* @__PURE__ */ c("p", {
120
121
  className: "text-xs text-muted-foreground",
121
122
  children: e.label
122
- }), /* @__PURE__ */ s("p", {
123
+ }), /* @__PURE__ */ c("p", {
123
124
  className: "text-lg font-semibold capitalize",
124
125
  children: e.value
125
126
  })]
126
127
  }) }, e.label))
127
128
  }),
128
- /* @__PURE__ */ c("div", {
129
+ /* @__PURE__ */ l("div", {
129
130
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
130
- children: [/* @__PURE__ */ c("div", {
131
+ children: [/* @__PURE__ */ l("div", {
131
132
  className: "lg:col-span-2 space-y-6",
132
- children: [/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ s(p, { children: "Progress Overview" }) }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
133
+ children: [/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ c(m, { children: "Progress Overview" }) }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
133
134
  className: "flex justify-between text-sm mb-2",
134
- children: [/* @__PURE__ */ s("span", {
135
+ children: [/* @__PURE__ */ c("span", {
135
136
  className: "text-muted-foreground",
136
137
  children: "Overall Completion"
137
- }), /* @__PURE__ */ c("span", {
138
+ }), /* @__PURE__ */ l("span", {
138
139
  className: "font-medium",
139
- children: [C, "%"]
140
+ children: [w, "%"]
140
141
  })]
141
- }), /* @__PURE__ */ s("div", {
142
+ }), /* @__PURE__ */ c("div", {
142
143
  className: "w-full h-4 rounded-full bg-muted overflow-hidden",
143
- children: /* @__PURE__ */ s("div", {
144
+ children: /* @__PURE__ */ c("div", {
144
145
  className: "h-full bg-primary rounded-full transition-all",
145
- style: { width: `${C}%` }
146
+ style: { width: `${w}%` }
146
147
  })
147
- })] })] }), Object.entries(w).map(([e, n]) => /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ c(p, { children: [
148
+ })] })] }), Object.entries(T).map(([e, t]) => /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ l(m, { children: [
148
149
  e,
149
150
  " (",
150
- n.length,
151
+ t.length,
151
152
  ")"
152
- ] }) }), /* @__PURE__ */ s(d, {
153
+ ] }) }), /* @__PURE__ */ c(f, {
153
154
  className: "space-y-3",
154
- children: n.map((e) => /* @__PURE__ */ c("div", {
155
+ children: t.map((e) => /* @__PURE__ */ l("div", {
155
156
  className: "flex items-center justify-between border rounded-md p-3",
156
- children: [/* @__PURE__ */ c("div", { children: [
157
- /* @__PURE__ */ s("p", {
157
+ children: [/* @__PURE__ */ l("div", { children: [
158
+ /* @__PURE__ */ c("p", {
158
159
  className: "text-sm font-medium",
159
160
  children: e.title
160
161
  }),
161
- e.description && /* @__PURE__ */ c("p", {
162
+ e.description && /* @__PURE__ */ l("p", {
162
163
  className: "text-xs text-muted-foreground",
163
164
  children: [e.description.slice(0, 60), "..."]
164
165
  }),
165
- (e.startDate || e.endDate) && /* @__PURE__ */ c("div", {
166
+ (e.startDate || e.endDate) && /* @__PURE__ */ l("div", {
166
167
  className: "flex items-center gap-1 mt-1 text-xs text-muted-foreground",
167
168
  children: [
168
- /* @__PURE__ */ s(t, { className: "h-3 w-3" }),
169
+ /* @__PURE__ */ c(n, { className: "h-3 w-3" }),
169
170
  e.startDate ? new Date(e.startDate).toLocaleDateString() : "?",
170
171
  " - ",
171
172
  e.endDate ? new Date(e.endDate).toLocaleDateString() : "?"
172
173
  ]
173
174
  })
174
- ] }), /* @__PURE__ */ c("div", {
175
+ ] }), /* @__PURE__ */ l("div", {
175
176
  className: "flex items-center gap-2",
176
- children: [e.color && /* @__PURE__ */ s("div", {
177
+ children: [e.color && /* @__PURE__ */ c("div", {
177
178
  className: "h-3 w-3 rounded-full",
178
179
  style: { backgroundColor: e.color }
179
- }), /* @__PURE__ */ s("span", {
180
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${h[e.status] ?? "bg-gray-100"}`,
180
+ }), /* @__PURE__ */ c("span", {
181
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${g[e.status] ?? "bg-gray-100"}`,
181
182
  children: e.status.toLowerCase().replace("_", " ")
182
183
  })]
183
184
  })]
184
185
  }, e.id))
185
186
  })] }, e))]
186
- }), /* @__PURE__ */ s("div", {
187
+ }), /* @__PURE__ */ c("div", {
187
188
  className: "space-y-6",
188
- children: /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ s(p, { children: "Details" }) }), /* @__PURE__ */ c(d, {
189
+ children: /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ c(m, { children: "Details" }) }), /* @__PURE__ */ l(f, {
189
190
  className: "space-y-2 text-sm",
190
191
  children: [
191
- /* @__PURE__ */ c("div", {
192
+ /* @__PURE__ */ l("div", {
192
193
  className: "flex justify-between",
193
- children: [/* @__PURE__ */ s("span", {
194
+ children: [/* @__PURE__ */ c("span", {
194
195
  className: "text-muted-foreground",
195
196
  children: "Type"
196
- }), /* @__PURE__ */ s(l, {
197
+ }), /* @__PURE__ */ c(u, {
197
198
  variant: "outline",
198
199
  className: "text-xs capitalize",
199
- children: b.type.toLowerCase()
200
+ children: x.type.toLowerCase()
200
201
  })]
201
202
  }),
202
- /* @__PURE__ */ c("div", {
203
+ /* @__PURE__ */ l("div", {
203
204
  className: "flex justify-between",
204
- children: [/* @__PURE__ */ s("span", {
205
+ children: [/* @__PURE__ */ c("span", {
205
206
  className: "text-muted-foreground",
206
207
  children: "Owner"
207
- }), /* @__PURE__ */ s("span", { children: b.ownerId })]
208
+ }), /* @__PURE__ */ c("span", { children: /* @__PURE__ */ c(t, { id: x.ownerId }) })]
208
209
  }),
209
- /* @__PURE__ */ c("div", {
210
+ /* @__PURE__ */ l("div", {
210
211
  className: "flex justify-between",
211
- children: [/* @__PURE__ */ s("span", {
212
+ children: [/* @__PURE__ */ c("span", {
212
213
  className: "text-muted-foreground",
213
214
  children: "Created"
214
- }), /* @__PURE__ */ s("span", { children: new Date(b.createdAt).toLocaleDateString() })]
215
+ }), /* @__PURE__ */ c("span", { children: new Date(x.createdAt).toLocaleDateString() })]
215
216
  }),
216
- /* @__PURE__ */ c("div", {
217
+ /* @__PURE__ */ l("div", {
217
218
  className: "flex justify-between",
218
- children: [/* @__PURE__ */ s("span", {
219
+ children: [/* @__PURE__ */ c("span", {
219
220
  className: "text-muted-foreground",
220
221
  children: "Updated"
221
- }), /* @__PURE__ */ s("span", { children: new Date(b.updatedAt).toLocaleDateString() })]
222
+ }), /* @__PURE__ */ c("span", { children: new Date(x.updatedAt).toLocaleDateString() })]
222
223
  })
223
224
  ]
224
225
  })] })
@@ -228,6 +229,6 @@ function g() {
228
229
  });
229
230
  }
230
231
  //#endregion
231
- export { g as ProductsRoadmapDetailPagePage };
232
+ export { _ as ProductsRoadmapDetailPagePage };
232
233
 
233
234
  //# sourceMappingURL=ProductsRoadmapDetailPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsRoadmapDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.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 { Map, Calendar, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapDetailPage($id: ID!) {\n planmagnetRoadmap(id: $id) {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n createdAt\n updatedAt\n items {\n id\n title\n description\n status\n startDate\n endDate\n color\n swimlane\n sortOrder\n projectId\n milestoneId\n }\n }\n }\n`;\n\ninterface RoadmapItemNode {\n id: string;\n title: string;\n description: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n color: string | null;\n swimlane: string | null;\n sortOrder: number;\n projectId: string | null;\n milestoneId: string | null;\n}\n\nconst statusColor: Record<string, string> = {\n TODO: 'bg-gray-100 text-gray-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n DONE: 'bg-green-100 text-green-800',\n COMPLETED: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n PLANNED: 'bg-yellow-100 text-yellow-800',\n};\n\nexport function ProductsRoadmapDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const roadmapId = 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_ROADMAP, {\n variables: { id: roadmapId },\n skip: !roadmapId,\n });\n\n if (loading) {\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 roadmap: {error.message}</div>;\n }\n\n const roadmap = data?.planmagnetRoadmap;\n if (!roadmap) return <div className=\"p-6 text-muted-foreground\">Roadmap not found.</div>;\n\n const items: RoadmapItemNode[] = (roadmap.items ?? [])\n .slice()\n .sort((a: RoadmapItemNode, b: RoadmapItemNode) => a.sortOrder - b.sortOrder);\n const completedItems = items.filter((i) => i.status === 'COMPLETED' || i.status === 'DONE');\n const progress = items.length > 0 ? Math.round((completedItems.length / items.length) * 100) : 0;\n\n // Group items by swimlane\n const swimlaneGroups: Record<string, RoadmapItemNode[]> = {};\n for (const item of items) {\n const lane = item.swimlane ?? 'Uncategorized';\n if (!swimlaneGroups[lane]) swimlaneGroups[lane] = [];\n swimlaneGroups[lane].push(item);\n }\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 <Map className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{roadmap.name}</h1>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {roadmap.description ?? 'No description'}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant={roadmap.isPublic ? 'default' : 'secondary'} className=\"capitalize\">\n {roadmap.isPublic ? 'public' : 'private'}\n </Badge>\n <Badge variant=\"outline\" className=\"capitalize\">\n {roadmap.type.toLowerCase()}\n </Badge>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-5 gap-4\">\n {[\n { label: 'Progress', value: `${progress}%` },\n { label: 'Total Items', value: items.length },\n { label: 'Completed', value: completedItems.length },\n { label: 'Type', value: roadmap.type.toLowerCase() },\n { label: 'Visibility', value: roadmap.isPublic ? 'Public' : 'Private' },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">{s.label}</p>\n <p className=\"text-lg font-semibold capitalize\">{s.value}</p>\n </CardContent>\n </Card>\n ))}\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>Progress Overview</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Overall Completion</span>\n <span className=\"font-medium\">{progress}%</span>\n </div>\n <div className=\"w-full h-4 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </CardContent>\n </Card>\n\n {Object.entries(swimlaneGroups).map(([lane, laneItems]) => (\n <Card key={lane}>\n <CardHeader>\n <CardTitle>\n {lane} ({laneItems.length})\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {laneItems.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 {item.description && (\n <p className=\"text-xs text-muted-foreground\">\n {item.description.slice(0, 60)}...\n </p>\n )}\n {(item.startDate || item.endDate) && (\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {item.startDate ? new Date(item.startDate).toLocaleDateString() : '?'}\n {' - '}\n {item.endDate ? new Date(item.endDate).toLocaleDateString() : '?'}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {item.color && (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[item.status] ?? 'bg-gray-100'}`}\n >\n {item.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"space-y-6\">\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\">Type</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {roadmap.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>{roadmap.ownerId}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(roadmap.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(roadmap.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProductsRoadmapDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.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 { Map, Calendar, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapDetailPage($id: ID!) {\n planmagnetRoadmap(id: $id) {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n createdAt\n updatedAt\n items {\n id\n title\n description\n status\n startDate\n endDate\n color\n swimlane\n sortOrder\n projectId\n milestoneId\n }\n }\n }\n`;\n\ninterface RoadmapItemNode {\n id: string;\n title: string;\n description: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n color: string | null;\n swimlane: string | null;\n sortOrder: number;\n projectId: string | null;\n milestoneId: string | null;\n}\n\nconst statusColor: Record<string, string> = {\n TODO: 'bg-gray-100 text-gray-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n DONE: 'bg-green-100 text-green-800',\n COMPLETED: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n PLANNED: 'bg-yellow-100 text-yellow-800',\n};\n\nexport function ProductsRoadmapDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const roadmapId = 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_ROADMAP, {\n variables: { id: roadmapId },\n skip: !roadmapId,\n });\n\n if (loading) {\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 roadmap: {error.message}</div>;\n }\n\n const roadmap = data?.planmagnetRoadmap;\n if (!roadmap) return <div className=\"p-6 text-muted-foreground\">Roadmap not found.</div>;\n\n const items: RoadmapItemNode[] = (roadmap.items ?? [])\n .slice()\n .sort((a: RoadmapItemNode, b: RoadmapItemNode) => a.sortOrder - b.sortOrder);\n const completedItems = items.filter((i) => i.status === 'COMPLETED' || i.status === 'DONE');\n const progress = items.length > 0 ? Math.round((completedItems.length / items.length) * 100) : 0;\n\n // Group items by swimlane\n const swimlaneGroups: Record<string, RoadmapItemNode[]> = {};\n for (const item of items) {\n const lane = item.swimlane ?? 'Uncategorized';\n if (!swimlaneGroups[lane]) swimlaneGroups[lane] = [];\n swimlaneGroups[lane].push(item);\n }\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 <Map className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{roadmap.name}</h1>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {roadmap.description ?? 'No description'}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant={roadmap.isPublic ? 'default' : 'secondary'} className=\"capitalize\">\n {roadmap.isPublic ? 'public' : 'private'}\n </Badge>\n <Badge variant=\"outline\" className=\"capitalize\">\n {roadmap.type.toLowerCase()}\n </Badge>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-5 gap-4\">\n {[\n { label: 'Progress', value: `${progress}%` },\n { label: 'Total Items', value: items.length },\n { label: 'Completed', value: completedItems.length },\n { label: 'Type', value: roadmap.type.toLowerCase() },\n { label: 'Visibility', value: roadmap.isPublic ? 'Public' : 'Private' },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">{s.label}</p>\n <p className=\"text-lg font-semibold capitalize\">{s.value}</p>\n </CardContent>\n </Card>\n ))}\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>Progress Overview</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Overall Completion</span>\n <span className=\"font-medium\">{progress}%</span>\n </div>\n <div className=\"w-full h-4 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </CardContent>\n </Card>\n\n {Object.entries(swimlaneGroups).map(([lane, laneItems]) => (\n <Card key={lane}>\n <CardHeader>\n <CardTitle>\n {lane} ({laneItems.length})\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {laneItems.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 {item.description && (\n <p className=\"text-xs text-muted-foreground\">\n {item.description.slice(0, 60)}...\n </p>\n )}\n {(item.startDate || item.endDate) && (\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {item.startDate ? new Date(item.startDate).toLocaleDateString() : '?'}\n {' - '}\n {item.endDate ? new Date(item.endDate).toLocaleDateString() : '?'}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {item.color && (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[item.status] ?? 'bg-gray-100'}`}\n >\n {item.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"space-y-6\">\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\">Type</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {roadmap.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>\n <PersonName id={roadmap.ownerId} />\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(roadmap.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(roadmap.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsRoadmapsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapsPagePage.tsx"],"names":[],"mappings":"AAmEA,wBAAgB,wBAAwB,4CAwKvC"}
1
+ {"version":3,"file":"ProductsRoadmapsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapsPagePage.tsx"],"names":[],"mappings":"AAoEA,wBAAgB,wBAAwB,4CA0KvC"}