@burdenoff/microfe-planmagnet 2026.927.2 → 2026.927.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 (106) hide show
  1. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +128 -124
  3. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  4. package/dist/planmagnet/controls/ConfirmButton.d.ts +25 -0
  5. package/dist/planmagnet/controls/ConfirmButton.d.ts.map +1 -0
  6. package/dist/planmagnet/controls/ConfirmButton.js +30 -0
  7. package/dist/planmagnet/controls/ConfirmButton.js.map +1 -0
  8. package/dist/planmagnet/controls/FeatureControls.d.ts +26 -0
  9. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -0
  10. package/dist/planmagnet/controls/FeatureControls.js +318 -0
  11. package/dist/planmagnet/controls/FeatureControls.js.map +1 -0
  12. package/dist/planmagnet/controls/MilestoneControls.d.ts +17 -0
  13. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -0
  14. package/dist/planmagnet/controls/MilestoneControls.js +200 -0
  15. package/dist/planmagnet/controls/MilestoneControls.js.map +1 -0
  16. package/dist/planmagnet/controls/ObjectiveControls.d.ts +31 -0
  17. package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +1 -0
  18. package/dist/planmagnet/controls/ObjectiveControls.js +296 -0
  19. package/dist/planmagnet/controls/ObjectiveControls.js.map +1 -0
  20. package/dist/planmagnet/controls/Pickers.d.ts +26 -0
  21. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -0
  22. package/dist/planmagnet/controls/Pickers.js +171 -0
  23. package/dist/planmagnet/controls/Pickers.js.map +1 -0
  24. package/dist/planmagnet/controls/ProjectControls.d.ts +13 -0
  25. package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -0
  26. package/dist/planmagnet/controls/ProjectControls.js +104 -0
  27. package/dist/planmagnet/controls/ProjectControls.js.map +1 -0
  28. package/dist/planmagnet/controls/ReleaseControls.d.ts +14 -0
  29. package/dist/planmagnet/controls/ReleaseControls.d.ts.map +1 -0
  30. package/dist/planmagnet/controls/ReleaseControls.js +108 -0
  31. package/dist/planmagnet/controls/ReleaseControls.js.map +1 -0
  32. package/dist/planmagnet/controls/WorkItemControls.d.ts +52 -0
  33. package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -0
  34. package/dist/planmagnet/controls/WorkItemControls.js +198 -0
  35. package/dist/planmagnet/controls/WorkItemControls.js.map +1 -0
  36. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  37. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +188 -154
  38. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  39. package/dist/planmagnet/pages/DocsDocsPagePage.js +4 -4
  40. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +63 -56
  42. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +229 -214
  45. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +142 -114
  48. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +134 -105
  51. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +102 -108
  54. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +119 -94
  57. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +97 -90
  60. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +107 -106
  63. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +2 -0
  66. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +150 -111
  69. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +116 -93
  72. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  73. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  74. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +55 -63
  75. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  76. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +4 -4
  77. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  78. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +134 -132
  79. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  80. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  81. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +6 -5
  82. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  83. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
  84. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +167 -116
  85. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  86. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  87. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +139 -107
  88. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  89. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  90. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +205 -158
  91. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  92. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  93. package/dist/planmagnet/pages/TasksTasksPagePage.js +1 -0
  94. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  95. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  96. package/dist/planmagnet/pages/TeamTeamPagePage.js +1 -1
  97. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  98. package/dist/planmagnet/people/People.js +1 -1
  99. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts +34 -0
  100. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +1 -0
  101. package/dist/planmagnet/roadmaps/RoadmapControls.js +301 -0
  102. package/dist/planmagnet/roadmaps/RoadmapControls.js.map +1 -0
  103. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  104. package/dist/planmagnet/sprints/SprintControls.js +194 -215
  105. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  106. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsMilestoneDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsMilestoneDetailPagePage.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 { Target, Calendar, FolderKanban, User } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { PersonName } from '../people/People';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\n\nconst GET_MILESTONES_FOR_DETAIL = gql`\n query GetMilestonesForDetail($id: ID!) {\n planmagnetMilestone(id: $id) {\n id\n name\n description\n projectId\n project {\n id\n name\n }\n status\n dueDate\n ownerId\n createdAt\n completedAt\n }\n }\n`;\n\nconst statusColor: Record<string, string> = {\n PENDING: 'bg-gray-100 text-gray-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n COMPLETED: 'bg-green-100 text-green-800',\n MISSED: 'bg-red-100 text-red-800',\n CANCELLED: 'bg-red-100 text-red-800',\n};\n\nexport function ProjectsMilestoneDetailPagePage() {\n const milestoneId = useEntityId('milestoneId');\n const navigate = usePlanMagnetNavigate();\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_MILESTONES_FOR_DETAIL, {\n variables: { id: milestoneId },\n skip: !milestoneId,\n });\n\n if (!milestoneId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No milestone selected. Open one from the list.\n </div>\n );\n // Only before the first load: a refetch must not blank the page (it\n // unmounts every component on it and loses their state).\n if (loading && !data)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error)\n return <div className=\"p-6 text-red-500\">Error loading milestone: {error.message}</div>;\n\n const ms = data?.planmagnetMilestone;\n if (!ms) return <div className=\"p-6 text-muted-foreground\">Milestone not found.</div>;\n\n const isCompleted = ms.status === 'COMPLETED';\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Target className=\"h-6 w-6 text-primary\" />\n <div>\n <h1 className=\"text-2xl font-semibold\">{ms.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n Project: {ms.project?.name ?? 'not available'}\n </p>\n </div>\n </div>\n <span\n className={`text-xs px-3 py-1 rounded-full capitalize ${statusColor[ms.status] ?? 'bg-gray-100'}`}\n >\n {ms.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\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 <p className=\"text-sm\">{ms.description ?? 'No description provided.'}</p>\n <div>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant={isCompleted ? 'default' : 'secondary'} className=\"capitalize\">\n {ms.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Due Date</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.completedAt ? new Date(ms.completedAt).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Details</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\">Due:</span>\n <span className=\"font-medium\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n {/* The project's name, linked — this printed the raw project UUID (BOFF-7949). */}\n {ms.project ? (\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() =>\n navigate(detailPath('/projects/project-detail-page', ms.project.id))\n }\n >\n {ms.project.name}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">not available</span>\n )}\n </div>\n {ms.ownerId && (\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Owner:</span>\n <span className=\"font-medium\">\n <PersonName id={ms.ownerId} />\n </span>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Created:</span>\n <span className=\"font-medium\">\n {ms.createdAt ? new Date(ms.createdAt).toLocaleDateString() : '—'}\n </span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectsMilestoneDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsMilestoneDetailPagePage.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 { Target, Calendar, FolderKanban, User } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { PersonName } from '../people/People';\nimport { MilestoneHeaderActions } from '../controls/MilestoneControls';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\n\nconst GET_MILESTONES_FOR_DETAIL = gql`\n query GetMilestonesForDetail($id: ID!) {\n planmagnetMilestone(id: $id) {\n id\n name\n description\n projectId\n project {\n id\n name\n }\n status\n dueDate\n ownerId\n createdAt\n completedAt\n }\n }\n`;\n\nexport function ProjectsMilestoneDetailPagePage() {\n const milestoneId = useEntityId('milestoneId');\n const navigate = usePlanMagnetNavigate();\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_MILESTONES_FOR_DETAIL, {\n variables: { id: milestoneId },\n skip: !milestoneId,\n });\n\n if (!milestoneId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No milestone selected. Open one from the list.\n </div>\n );\n // Only before the first load: a refetch must not blank the page (it\n // unmounts every component on it and loses their state).\n if (loading && !data)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error)\n return <div className=\"p-6 text-red-500\">Error loading milestone: {error.message}</div>;\n\n const ms = data?.planmagnetMilestone;\n if (!ms) return <div className=\"p-6 text-muted-foreground\">Milestone not found.</div>;\n\n const isCompleted = ms.status === 'COMPLETED';\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Target className=\"h-6 w-6 text-primary\" />\n <div>\n <h1 className=\"text-2xl font-semibold\">{ms.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n Project: {ms.project?.name ?? 'not available'}\n </p>\n </div>\n </div>\n {/* Status, Edit and Delete (BOFF-7953): the milestone could never move past Pending. */}\n <MilestoneHeaderActions milestone={ms} />\n </div>\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 <p className=\"text-sm\">{ms.description ?? 'No description provided.'}</p>\n <div>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant={isCompleted ? 'default' : 'secondary'} className=\"capitalize\">\n {ms.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Due Date</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm font-bold\">\n {ms.completedAt ? new Date(ms.completedAt).toLocaleDateString() : '—'}\n </p>\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Details</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\">Due:</span>\n <span className=\"font-medium\">\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n {/* The project's name, linked — this printed the raw project UUID (BOFF-7949). */}\n {ms.project ? (\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() =>\n navigate(detailPath('/projects/project-detail-page', ms.project.id))\n }\n >\n {ms.project.name}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">not available</span>\n )}\n </div>\n {ms.ownerId && (\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Owner:</span>\n <span className=\"font-medium\">\n <PersonName id={ms.ownerId} />\n </span>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Created:</span>\n <span className=\"font-medium\">\n {ms.createdAt ? new Date(ms.createdAt).toLocaleDateString() : '—'}\n </span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { throwOnError as n } from "../utils/mutationResult.js";
3
- import { detailPath as r } from "../utils/rowNavigation.js";
4
- import { endBeforeStart as i, parseIntField as a } from "../utils/formValidation.js";
3
+ import { endBeforeStart as r, parseIntField as i } from "../utils/formValidation.js";
4
+ import { detailPath as a } from "../utils/rowNavigation.js";
5
5
  import { useEntityId as o } from "../hooks/useEntityId.js";
6
6
  import { SprintLifecycleActions as s } from "../sprints/SprintControls.js";
7
7
  import { useMemo as c, useState as l } from "react";
@@ -63,7 +63,7 @@ function T() {
63
63
  let n = { ...t };
64
64
  for (let [t, r] of Object.entries(e)) r !== L[t] && (n[t] = r);
65
65
  return n;
66
- }), [z, B] = l(null), V = i(L.startDate, L.endDate), H = a(L.capacity, { min: 0 }), [U, { loading: W }] = p(w, { refetchQueries: [
66
+ }), [z, B] = l(null), V = r(L.startDate, L.endDate), H = i(L.capacity, { min: 0 }), [U, { loading: W }] = p(w, { refetchQueries: [
67
67
  "GetSprints",
68
68
  "GetSprintDetail",
69
69
  "GetSprintForEdit",
@@ -86,7 +86,7 @@ function T() {
86
86
  variant: "ghost",
87
87
  size: "sm",
88
88
  "aria-label": "Back to the sprint",
89
- onClick: () => E(r("/projects/planning-detail-page", T)),
89
+ onClick: () => E(a("/projects/planning-detail-page", T)),
90
90
  children: /* @__PURE__ */ h(u, { className: "h-4 w-4" })
91
91
  }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h1", {
92
92
  className: "text-2xl font-semibold",
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsProjectDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx"],"names":[],"mappings":"AAsEA,wBAAgB,6BAA6B,4CAoT5C"}
1
+ {"version":3,"file":"ProjectsProjectDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,6BAA6B,4CAqU5C"}
@@ -1,12 +1,13 @@
1
1
  import { PersonName as e } from "../people/People.js";
2
2
  import { useEntityId as t } from "../hooks/useEntityId.js";
3
- import { Calendar as n, CheckSquare as r, FolderKanban as i, Users as a, Zap as o } from "lucide-react";
4
- import { gql as s } from "@apollo/client";
5
- import { useQuery as c } from "@apollo/client/react";
6
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
- import { Badge as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h } from "@burdenoff/fe-libs/ui";
3
+ import { ProjectHeaderActions as n } from "../controls/ProjectControls.js";
4
+ import { Calendar as r, CheckSquare as i, FolderKanban as a, Users as o, Zap as s } from "lucide-react";
5
+ import { gql as c } from "@apollo/client";
6
+ import { useQuery as l } from "@apollo/client/react";
7
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
+ import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx
9
- var g = s`
10
+ var _ = c`
10
11
  query GetProjectDetail($id: ID!) {
11
12
  planmagnetProject(id: $id) {
12
13
  id
@@ -56,7 +57,7 @@ var g = s`
56
57
  }
57
58
  }
58
59
  }
59
- `, _ = {
60
+ `, v = {
60
61
  ACTIVE: "bg-green-100 text-green-800",
61
62
  ON_HOLD: "bg-orange-100 text-orange-800",
62
63
  CANCELLED: "bg-red-100 text-red-800",
@@ -64,292 +65,293 @@ var g = s`
64
65
  PLANNING: "bg-gray-100 text-gray-800",
65
66
  ARCHIVED: "bg-gray-100 text-gray-800"
66
67
  };
67
- function v() {
68
- let s = t("projectId"), { data: v, loading: y, error: b } = c(g, {
69
- variables: { id: s },
70
- skip: !s
68
+ function y() {
69
+ let c = t("projectId"), { data: y, loading: b, error: x } = l(_, {
70
+ variables: { id: c },
71
+ skip: !c
71
72
  });
72
- if (!s) return /* @__PURE__ */ l("div", {
73
+ if (!c) return /* @__PURE__ */ u("div", {
73
74
  className: "p-6 text-muted-foreground",
74
75
  children: "No project selected. Open one from the list."
75
76
  });
76
- if (y && !v) return /* @__PURE__ */ l("div", {
77
+ if (b && !y) return /* @__PURE__ */ u("div", {
77
78
  className: "flex items-center justify-center p-12",
78
- children: /* @__PURE__ */ l("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
79
+ children: /* @__PURE__ */ u("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
79
80
  });
80
- if (b) return /* @__PURE__ */ u("div", {
81
+ if (x) return /* @__PURE__ */ d("div", {
81
82
  className: "p-6 text-red-500",
82
- children: ["Error loading project: ", b.message]
83
+ children: ["Error loading project: ", x.message]
83
84
  });
84
- let x = v?.planmagnetProject;
85
- if (!x) return /* @__PURE__ */ l("div", {
85
+ let S = y?.planmagnetProject;
86
+ if (!S) return /* @__PURE__ */ u("div", {
86
87
  className: "p-6 text-muted-foreground",
87
88
  children: "Project not found."
88
89
  });
89
- let S = x.workItems ?? [], C = x.sprints ?? [], w = x.milestones ?? [], T = C.find((e) => e.status === "ACTIVE"), E = S.length, D = S.filter((e) => e.status === "DONE").length;
90
- return /* @__PURE__ */ u("div", {
90
+ let C = S.workItems ?? [], w = S.sprints ?? [], T = S.milestones ?? [], E = w.find((e) => e.status === "ACTIVE"), D = w.filter((e) => e.status === "COMPLETED" && e.velocity != null).sort((e, t) => (t.endDate ?? "").localeCompare(e.endDate ?? ""))[0], O = C.length, k = C.filter((e) => e.status === "DONE").length;
91
+ return /* @__PURE__ */ d("div", {
91
92
  className: "space-y-6 p-6",
92
93
  children: [
93
- /* @__PURE__ */ u("div", {
94
+ /* @__PURE__ */ d("div", {
94
95
  className: "flex items-center justify-between",
95
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("div", {
96
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("div", {
96
97
  className: "flex items-center gap-2",
97
98
  children: [
98
- /* @__PURE__ */ l(i, { className: "h-5 w-5 text-primary" }),
99
- /* @__PURE__ */ l("h1", {
99
+ /* @__PURE__ */ u(a, { className: "h-5 w-5 text-primary" }),
100
+ /* @__PURE__ */ u("h1", {
100
101
  className: "text-2xl font-semibold",
101
- children: x.name
102
+ children: S.name
102
103
  }),
103
- /* @__PURE__ */ l("span", {
104
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${_[x.status] ?? "bg-gray-100"}`,
105
- children: x.status.toLowerCase().replace("_", " ")
104
+ /* @__PURE__ */ u("span", {
105
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${v[S.status] ?? "bg-gray-100"}`,
106
+ children: S.status.toLowerCase().replace("_", " ")
106
107
  })
107
108
  ]
108
- }), /* @__PURE__ */ l("p", {
109
+ }), /* @__PURE__ */ u("p", {
109
110
  className: "text-sm text-muted-foreground mt-1",
110
- children: x.description ?? "No description"
111
- })] }), /* @__PURE__ */ u("div", {
112
- className: "flex gap-2",
113
- children: [/* @__PURE__ */ l(d, {
114
- className: "capitalize",
115
- children: x.status.toLowerCase().replace("_", " ")
116
- }), /* @__PURE__ */ l(d, {
111
+ children: S.description ?? "No description"
112
+ })] }), /* @__PURE__ */ d("div", {
113
+ className: "flex flex-col items-end gap-2",
114
+ children: [/* @__PURE__ */ u(n, {
115
+ projectId: S.id,
116
+ name: S.name,
117
+ status: S.status
118
+ }), /* @__PURE__ */ u(f, {
117
119
  variant: "outline",
118
120
  className: "capitalize",
119
- children: x.methodology.toLowerCase()
121
+ children: S.methodology.toLowerCase()
120
122
  })]
121
123
  })]
122
124
  }),
123
- /* @__PURE__ */ u("div", {
125
+ /* @__PURE__ */ d("div", {
124
126
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
125
127
  children: [
126
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
128
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
127
129
  className: "pt-4",
128
- children: [/* @__PURE__ */ u("div", {
130
+ children: [/* @__PURE__ */ d("div", {
129
131
  className: "flex items-center gap-2 text-muted-foreground text-xs",
130
- children: [/* @__PURE__ */ l(r, { className: "h-4 w-4" }), "Work Items"]
131
- }), /* @__PURE__ */ u("p", {
132
+ children: [/* @__PURE__ */ u(i, { className: "h-4 w-4" }), "Work Items"]
133
+ }), /* @__PURE__ */ d("p", {
132
134
  className: "text-xl font-bold mt-1",
133
135
  children: [
134
- D,
136
+ k,
135
137
  "/",
136
- E
138
+ O
137
139
  ]
138
140
  })]
139
141
  }) }),
140
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
142
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
141
143
  className: "pt-4",
142
- children: [/* @__PURE__ */ u("div", {
144
+ children: [/* @__PURE__ */ d("div", {
143
145
  className: "flex items-center gap-2 text-muted-foreground text-xs",
144
- children: [/* @__PURE__ */ l(o, { className: "h-4 w-4" }), "Sprints"]
145
- }), /* @__PURE__ */ l("p", {
146
+ children: [/* @__PURE__ */ u(s, { className: "h-4 w-4" }), "Sprints"]
147
+ }), /* @__PURE__ */ u("p", {
146
148
  className: "text-xl font-bold mt-1",
147
- children: C.length
149
+ children: w.length
148
150
  })]
149
151
  }) }),
150
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
152
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
151
153
  className: "pt-4",
152
- children: [/* @__PURE__ */ u("div", {
154
+ children: [/* @__PURE__ */ d("div", {
153
155
  className: "flex items-center gap-2 text-muted-foreground text-xs",
154
- children: [/* @__PURE__ */ l(n, { className: "h-4 w-4" }), "Milestones"]
155
- }), /* @__PURE__ */ l("p", {
156
+ children: [/* @__PURE__ */ u(r, { className: "h-4 w-4" }), "Milestones"]
157
+ }), /* @__PURE__ */ u("p", {
156
158
  className: "text-xl font-bold mt-1",
157
- children: w.length
159
+ children: T.length
158
160
  })]
159
161
  }) }),
160
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
162
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
161
163
  className: "pt-4",
162
- children: [/* @__PURE__ */ u("div", {
164
+ children: [/* @__PURE__ */ d("div", {
163
165
  className: "flex items-center gap-2 text-muted-foreground text-xs",
164
- children: [/* @__PURE__ */ l(a, { className: "h-4 w-4" }), "Owner"]
165
- }), /* @__PURE__ */ l("p", {
166
+ children: [/* @__PURE__ */ u(o, { className: "h-4 w-4" }), "Owner"]
167
+ }), /* @__PURE__ */ u("p", {
166
168
  className: "text-sm font-bold mt-1 truncate",
167
- children: /* @__PURE__ */ l(e, { id: x.ownerId })
169
+ children: /* @__PURE__ */ u(e, { id: S.ownerId })
168
170
  })]
169
171
  }) })
170
172
  ]
171
173
  }),
172
- /* @__PURE__ */ u("div", {
174
+ /* @__PURE__ */ d("div", {
173
175
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
174
- children: [/* @__PURE__ */ u("div", {
176
+ children: [/* @__PURE__ */ d("div", {
175
177
  className: "lg:col-span-2 space-y-6",
176
178
  children: [
177
- /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Timeline" }) }), /* @__PURE__ */ u(p, { children: [
178
- /* @__PURE__ */ u("div", {
179
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Timeline" }) }), /* @__PURE__ */ d(m, { children: [
180
+ /* @__PURE__ */ d("div", {
179
181
  className: "flex justify-between text-sm mb-2",
180
- children: [/* @__PURE__ */ l("span", {
182
+ children: [/* @__PURE__ */ u("span", {
181
183
  className: "text-muted-foreground",
182
184
  children: "Duration"
183
- }), /* @__PURE__ */ l("span", {
185
+ }), /* @__PURE__ */ u("span", {
184
186
  className: "font-medium",
185
- children: E > 0 ? `${Math.round(D / E * 100)}% tasks done` : "No tasks yet"
187
+ children: O > 0 ? `${Math.round(k / O * 100)}% tasks done` : "No tasks yet"
186
188
  })]
187
189
  }),
188
- /* @__PURE__ */ l("div", {
190
+ /* @__PURE__ */ u("div", {
189
191
  className: "w-full h-4 rounded-full bg-muted overflow-hidden",
190
- children: /* @__PURE__ */ l("div", {
192
+ children: /* @__PURE__ */ u("div", {
191
193
  className: "h-full bg-primary rounded-full",
192
- style: { width: `${E > 0 ? Math.round(D / E * 100) : 0}%` }
194
+ style: { width: `${O > 0 ? Math.round(k / O * 100) : 0}%` }
193
195
  })
194
196
  }),
195
- /* @__PURE__ */ u("div", {
197
+ /* @__PURE__ */ d("div", {
196
198
  className: "flex justify-between text-xs text-muted-foreground mt-2",
197
- children: [/* @__PURE__ */ l("span", { children: x.startDate ? new Date(x.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ l("span", { children: x.endDate ? new Date(x.endDate).toLocaleDateString() : "Not set" })]
199
+ children: [/* @__PURE__ */ u("span", { children: S.startDate ? new Date(S.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ u("span", { children: S.endDate ? new Date(S.endDate).toLocaleDateString() : "Not set" })]
198
200
  })
199
201
  ] })] }),
200
- T && /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, {
202
+ E && /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, {
201
203
  className: "flex items-center gap-2",
202
- children: [/* @__PURE__ */ l(o, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
203
- }) }), /* @__PURE__ */ u(p, {
204
+ children: [/* @__PURE__ */ u(s, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
205
+ }) }), /* @__PURE__ */ d(m, {
204
206
  className: "space-y-3",
205
207
  children: [
206
- /* @__PURE__ */ u("div", {
208
+ /* @__PURE__ */ d("div", {
207
209
  className: "flex justify-between",
208
- children: [/* @__PURE__ */ l("span", {
210
+ children: [/* @__PURE__ */ u("span", {
209
211
  className: "font-medium",
210
- children: T.name
211
- }), /* @__PURE__ */ l(d, { children: "Active" })]
212
+ children: E.name
213
+ }), /* @__PURE__ */ u(f, { children: "Active" })]
212
214
  }),
213
- T.goal && /* @__PURE__ */ l("p", {
215
+ E.goal && /* @__PURE__ */ u("p", {
214
216
  className: "text-sm text-muted-foreground",
215
- children: T.goal
217
+ children: E.goal
216
218
  }),
217
- /* @__PURE__ */ u("div", {
219
+ /* @__PURE__ */ d("div", {
218
220
  className: "grid grid-cols-3 gap-4 text-center",
219
221
  children: [
220
- /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("p", {
222
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("p", {
221
223
  className: "text-lg font-semibold",
222
224
  children: [
223
- T.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
225
+ E.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
224
226
  "/",
225
- T.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
227
+ E.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
226
228
  ]
227
- }), /* @__PURE__ */ l("p", {
229
+ }), /* @__PURE__ */ u("p", {
228
230
  className: "text-xs text-muted-foreground",
229
231
  children: "Points"
230
232
  })] }),
231
- /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("p", {
233
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("p", {
232
234
  className: "text-lg font-semibold",
233
235
  children: [
234
- T.workItems?.filter((e) => e.status === "DONE").length ?? 0,
236
+ E.workItems?.filter((e) => e.status === "DONE").length ?? 0,
235
237
  "/",
236
- T.workItems?.length ?? 0
238
+ E.workItems?.length ?? 0
237
239
  ]
238
- }), /* @__PURE__ */ l("p", {
240
+ }), /* @__PURE__ */ u("p", {
239
241
  className: "text-xs text-muted-foreground",
240
242
  children: "Tasks"
241
243
  })] }),
242
- /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
244
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
243
245
  className: "text-lg font-semibold",
244
- children: T.velocity ?? 0
245
- }), /* @__PURE__ */ l("p", {
246
+ children: D ? `${D.velocity} pts` : "—"
247
+ }), /* @__PURE__ */ u("p", {
246
248
  className: "text-xs text-muted-foreground",
247
- children: "Velocity"
249
+ children: "Velocity of the last sprint"
248
250
  })] })
249
251
  ]
250
252
  })
251
253
  ]
252
254
  })] }),
253
- /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, { children: [
255
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, { children: [
254
256
  "Recent Work Items (",
255
- S.length,
257
+ C.length,
256
258
  ")"
257
- ] }) }), /* @__PURE__ */ u(p, {
259
+ ] }) }), /* @__PURE__ */ d(m, {
258
260
  className: "space-y-2",
259
- children: [S.slice(0, 5).map((e) => /* @__PURE__ */ u("div", {
261
+ children: [C.slice(0, 5).map((e) => /* @__PURE__ */ d("div", {
260
262
  className: "flex items-center justify-between border rounded-md p-2.5",
261
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
263
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
262
264
  className: "text-sm font-medium",
263
265
  children: e.key
264
- }), /* @__PURE__ */ l("div", {
266
+ }), /* @__PURE__ */ u("div", {
265
267
  className: "flex gap-1 mt-1",
266
- children: e.labels.map((e) => /* @__PURE__ */ l("span", {
268
+ children: e.labels.map((e) => /* @__PURE__ */ u("span", {
267
269
  className: "text-[10px] px-1.5 py-0.5 rounded bg-muted",
268
270
  children: e
269
271
  }, e))
270
- })] }), /* @__PURE__ */ u("div", {
272
+ })] }), /* @__PURE__ */ d("div", {
271
273
  className: "flex items-center gap-2",
272
- children: [/* @__PURE__ */ u("span", {
274
+ children: [/* @__PURE__ */ d("span", {
273
275
  className: "text-xs text-muted-foreground",
274
276
  children: [e.storyPoints ?? 0, " pts"]
275
- }), /* @__PURE__ */ l(d, {
277
+ }), /* @__PURE__ */ u(f, {
276
278
  variant: "secondary",
277
279
  className: "capitalize text-xs",
278
280
  children: e.status.toLowerCase().replace("_", " ")
279
281
  })]
280
282
  })]
281
- }, e.id)), S.length === 0 && /* @__PURE__ */ l("p", {
283
+ }, e.id)), C.length === 0 && /* @__PURE__ */ u("p", {
282
284
  className: "text-sm text-muted-foreground text-center py-4",
283
285
  children: "No work items yet."
284
286
  })]
285
287
  })] })
286
288
  ]
287
- }), /* @__PURE__ */ u("div", {
289
+ }), /* @__PURE__ */ d("div", {
288
290
  className: "space-y-6",
289
- children: [/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, { children: [
291
+ children: [/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, { children: [
290
292
  "Milestones (",
291
- w.length,
293
+ T.length,
292
294
  ")"
293
- ] }) }), /* @__PURE__ */ u(p, {
295
+ ] }) }), /* @__PURE__ */ d(m, {
294
296
  className: "space-y-3",
295
- children: [w.map((e) => /* @__PURE__ */ u("div", {
297
+ children: [T.map((e) => /* @__PURE__ */ d("div", {
296
298
  className: "border-b pb-2 last:border-0",
297
- children: [/* @__PURE__ */ u("div", {
299
+ children: [/* @__PURE__ */ d("div", {
298
300
  className: "flex justify-between",
299
- children: [/* @__PURE__ */ l("span", {
301
+ children: [/* @__PURE__ */ u("span", {
300
302
  className: "text-sm font-medium",
301
303
  children: e.name
302
- }), /* @__PURE__ */ l(d, {
304
+ }), /* @__PURE__ */ u(f, {
303
305
  variant: "outline",
304
306
  className: "text-xs capitalize",
305
307
  children: e.status.toLowerCase().replace("_", " ")
306
308
  })]
307
- }), /* @__PURE__ */ u("div", {
309
+ }), /* @__PURE__ */ d("div", {
308
310
  className: "flex items-center gap-1 text-xs text-muted-foreground mt-1",
309
- children: [/* @__PURE__ */ l(n, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
311
+ children: [/* @__PURE__ */ u(r, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
310
312
  })]
311
- }, e.id)), w.length === 0 && /* @__PURE__ */ l("p", {
313
+ }, e.id)), T.length === 0 && /* @__PURE__ */ u("p", {
312
314
  className: "text-sm text-muted-foreground text-center py-2",
313
315
  children: "No milestones."
314
316
  })]
315
- })] }), /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Details" }) }), /* @__PURE__ */ u(p, {
317
+ })] }), /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Details" }) }), /* @__PURE__ */ d(m, {
316
318
  className: "space-y-2 text-sm",
317
319
  children: [
318
- /* @__PURE__ */ u("div", {
320
+ /* @__PURE__ */ d("div", {
319
321
  className: "flex justify-between",
320
- children: [/* @__PURE__ */ l("span", {
322
+ children: [/* @__PURE__ */ u("span", {
321
323
  className: "text-muted-foreground",
322
324
  children: "Owner"
323
- }), /* @__PURE__ */ l("span", { children: /* @__PURE__ */ l(e, { id: x.ownerId }) })]
325
+ }), /* @__PURE__ */ u("span", { children: /* @__PURE__ */ u(e, { id: S.ownerId }) })]
324
326
  }),
325
- /* @__PURE__ */ u("div", {
327
+ /* @__PURE__ */ d("div", {
326
328
  className: "flex justify-between",
327
- children: [/* @__PURE__ */ l("span", {
329
+ children: [/* @__PURE__ */ u("span", {
328
330
  className: "text-muted-foreground",
329
331
  children: "Key"
330
- }), /* @__PURE__ */ l("span", {
332
+ }), /* @__PURE__ */ u("span", {
331
333
  className: "font-mono",
332
- children: x.key
334
+ children: S.key
333
335
  })]
334
336
  }),
335
- /* @__PURE__ */ u("div", {
337
+ /* @__PURE__ */ d("div", {
336
338
  className: "flex justify-between",
337
- children: [/* @__PURE__ */ l("span", {
339
+ children: [/* @__PURE__ */ u("span", {
338
340
  className: "text-muted-foreground",
339
341
  children: "Methodology"
340
- }), /* @__PURE__ */ l("span", {
342
+ }), /* @__PURE__ */ u("span", {
341
343
  className: "capitalize",
342
- children: x.methodology.toLowerCase()
344
+ children: S.methodology.toLowerCase()
343
345
  })]
344
346
  }),
345
- x.tags.length > 0 && /* @__PURE__ */ u("div", {
347
+ S.tags.length > 0 && /* @__PURE__ */ d("div", {
346
348
  className: "flex justify-between items-start",
347
- children: [/* @__PURE__ */ l("span", {
349
+ children: [/* @__PURE__ */ u("span", {
348
350
  className: "text-muted-foreground",
349
351
  children: "Tags"
350
- }), /* @__PURE__ */ l("div", {
352
+ }), /* @__PURE__ */ u("div", {
351
353
  className: "flex gap-1 flex-wrap justify-end",
352
- children: x.tags.map((e) => /* @__PURE__ */ l(d, {
354
+ children: S.tags.map((e) => /* @__PURE__ */ u(f, {
353
355
  variant: "outline",
354
356
  className: "text-xs",
355
357
  children: e
@@ -364,6 +366,6 @@ function v() {
364
366
  });
365
367
  }
366
368
  //#endregion
367
- export { v as ProjectsProjectDetailPagePage };
369
+ export { y as ProjectsProjectDetailPagePage };
368
370
 
369
371
  //# sourceMappingURL=ProjectsProjectDetailPagePage.js.map