@burdenoff/microfe-planmagnet 2026.525.1 → 2026.715.1

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 (151) hide show
  1. package/dist/dev/main.d.ts +2 -0
  2. package/dist/dev/main.d.ts.map +1 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/planmagnet/PlanMagnetRoot.d.ts +5 -0
  6. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -0
  7. package/dist/planmagnet/PlanMagnetRoutes.d.ts +2 -0
  8. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -0
  9. package/dist/planmagnet/index.d.ts +5 -0
  10. package/dist/planmagnet/index.d.ts.map +1 -0
  11. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
  12. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
  13. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +4 -4
  14. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  15. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +2 -0
  16. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +1 -0
  17. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +1 -1
  18. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +1 -1
  19. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +2 -0
  20. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +1 -0
  21. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +2 -0
  22. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +1 -0
  23. package/dist/planmagnet/pages/CollaborationFilesPagePage.js +1 -1
  24. package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +2 -0
  26. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +1 -0
  27. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +1 -1
  28. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +1 -1
  29. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +2 -0
  30. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +1 -0
  31. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +1 -1
  32. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +1 -1
  33. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts +2 -0
  34. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -0
  35. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +2 -0
  36. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +1 -0
  37. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +2 -2
  38. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +1 -1
  39. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts +2 -0
  40. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -0
  41. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts +2 -0
  42. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -0
  43. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts +2 -0
  44. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -0
  45. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts +2 -0
  46. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -0
  47. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts +2 -0
  48. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -0
  49. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +1 -1
  50. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -1
  51. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts +2 -0
  52. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -0
  53. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts +2 -0
  54. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -0
  55. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +1 -1
  56. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  57. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts +2 -0
  58. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -0
  59. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +1 -1
  60. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts +2 -0
  62. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -0
  63. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +2 -2
  64. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  65. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts +2 -0
  66. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -0
  67. package/dist/planmagnet/pages/ProductsProductsPagePage.js +3 -3
  68. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  69. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts +2 -0
  70. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -0
  71. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts +2 -0
  72. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -0
  73. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +1 -1
  74. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  75. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts +2 -0
  76. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -0
  77. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +1 -1
  78. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
  79. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts +2 -0
  80. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -0
  81. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts +2 -0
  82. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -0
  83. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +1 -1
  84. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  85. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts +2 -0
  86. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -0
  87. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts +2 -0
  88. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -0
  89. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts +2 -0
  90. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -0
  91. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts +2 -0
  92. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -0
  93. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts +2 -0
  94. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -0
  95. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts +2 -0
  96. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -0
  97. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts +2 -0
  98. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -0
  99. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts +2 -0
  100. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -0
  101. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts +2 -0
  102. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -0
  103. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts +2 -0
  104. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -0
  105. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +2 -0
  106. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -0
  107. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +1 -1
  108. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -1
  109. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +2 -0
  110. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -0
  111. package/dist/planmagnet/pages/ReportsReportsPagePage.js +3 -3
  112. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  113. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts +2 -0
  114. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -0
  115. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +2 -2
  116. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  117. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts +2 -0
  118. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -0
  119. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts +2 -0
  120. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -0
  121. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts +2 -0
  122. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -0
  123. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts +2 -0
  124. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -0
  125. package/dist/planmagnet/pages/TasksTasksPagePage.js +1 -1
  126. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  127. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts +2 -0
  128. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -0
  129. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +1 -1
  130. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -1
  131. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts +2 -0
  132. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -0
  133. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +1 -1
  134. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -1
  135. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts +2 -0
  136. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -0
  137. package/dist/planmagnet/pages/TeamTeamPagePage.js +2 -2
  138. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  139. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts +2 -0
  140. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -0
  141. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts +31 -0
  142. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +1 -0
  143. package/dist/planmagnet/store/planmagnetStore.d.ts +30 -0
  144. package/dist/planmagnet/store/planmagnetStore.d.ts.map +1 -0
  145. package/dist/planmagnet/types/index.d.ts +317 -0
  146. package/dist/planmagnet/types/index.d.ts.map +1 -0
  147. package/dist/planmagnet/utils/cn.d.ts +4 -0
  148. package/dist/planmagnet/utils/cn.d.ts.map +1 -0
  149. package/dist/planmagnet/utils/navigation.d.ts +2 -0
  150. package/dist/planmagnet/utils/navigation.d.ts.map +1 -0
  151. package/package.json +2 -2
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/dev/main.tsx"],"names":[],"mappings":"AAIA,OAAO,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './planmagnet';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { FC } from 'react';
2
+ import { PlanMagnetRootProps } from './types';
3
+
4
+ export declare const PlanMagnetRoot: FC<PlanMagnetRootProps>;
5
+ //# sourceMappingURL=PlanMagnetRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanMagnetRoot.d.ts","sourceRoot":"","sources":["../../src/planmagnet/PlanMagnetRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAgChC,OAAO,KAAK,EAAW,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAI5D,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAkSlD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function PlanMagnetRoutes(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PlanMagnetRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanMagnetRoutes.d.ts","sourceRoot":"","sources":["../../src/planmagnet/PlanMagnetRoutes.tsx"],"names":[],"mappings":"AA2MA,wBAAgB,gBAAgB,4CA8F/B"}
@@ -0,0 +1,5 @@
1
+ export { PlanMagnetRoot } from './PlanMagnetRoot';
2
+ export type { PlanMagnetRootProps, NavItem, FooterItem } from './types';
3
+ export { usePlanMagnet, usePlanMagnetNavigate } from './providers/PlanMagnetProvider';
4
+ export { usePlanMagnetStore } from './store/planmagnetStore';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/planmagnet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function AnalyticsAnalyticsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AnalyticsAnalyticsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsAnalyticsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx"],"names":[],"mappings":"AAyGA,wBAAgB,0BAA0B,4CAkSzC"}
@@ -9,10 +9,10 @@ import { Badge as d, Card as f, CardContent as p, CardHeader as m, CardTitle as
9
9
  var g = o`
10
10
  query GetAnalyticsData(
11
11
  $workspaceId: ID!
12
- $projectPagination: PaginationInput
13
- $workItemPagination: PaginationInput
14
- $sprintPagination: PaginationInput
15
- $milestonePagination: PaginationInput
12
+ $projectPagination: PlanmagnetPaginationInput
13
+ $workItemPagination: PlanmagnetPaginationInput
14
+ $sprintPagination: PlanmagnetPaginationInput
15
+ $milestonePagination: PlanmagnetPaginationInput
16
16
  ) {
17
17
  planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {
18
18
  items {
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsAnalyticsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/AnalyticsAnalyticsPagePage.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 { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { TrendingUp, Zap, FolderKanban, BarChart3, Target } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_ANALYTICS_DATA = gql`\n query GetAnalyticsData(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $workItemPagination: PaginationInput\n $sprintPagination: PaginationInput\n $milestonePagination: PaginationInput\n ) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {\n items {\n id\n name\n key\n status\n startDate\n endDate\n tags\n }\n totalCount\n }\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: $workItemPagination) {\n items {\n id\n status\n priority\n storyPoints\n assigneeId\n }\n totalCount\n }\n planmagnetSprints(workspaceId: $workspaceId, pagination: $sprintPagination) {\n items {\n id\n name\n status\n velocity\n capacity\n startDate\n endDate\n }\n totalCount\n }\n planmagnetMilestones(workspaceId: $workspaceId, pagination: $milestonePagination) {\n items {\n id\n name\n status\n dueDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n tags: string[];\n}\n\ninterface WorkItemNode {\n id: string;\n status: string;\n priority: string;\n storyPoints: number | null;\n assigneeId: string | null;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n status: string;\n velocity: number | null;\n capacity: number | null;\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface MilestoneNode {\n id: string;\n name: string;\n status: string;\n dueDate: string | null;\n}\n\ninterface AnalyticsData {\n projects: { items: ProjectNode[]; totalCount: number };\n workItems: { items: WorkItemNode[]; totalCount: number };\n sprints: { items: SprintNode[]; totalCount: number };\n milestones: { items: MilestoneNode[]; totalCount: number };\n}\n\nexport function AnalyticsAnalyticsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const { t } = useI18n();\n\n const { data, loading, error } = useQuery<AnalyticsData>(GET_ANALYTICS_DATA, {\n variables: {\n workspaceId,\n projectPagination: { first: 100 },\n workItemPagination: { first: 500 },\n sprintPagination: { first: 100 },\n milestonePagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return (\n <div className=\"p-6 text-red-500\">\n {t('planmagnet.analytics.errorLoading', 'Error loading analytics')}: {error.message}\n </div>\n );\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n const sprints = data?.planmagnetSprints?.items ?? [];\n const milestones = data?.planmagnetMilestones?.items ?? [];\n\n const totalTasks = tasks.length;\n const doneTasks = tasks.filter((t) => t.status === 'DONE').length;\n const blockedTasks = tasks.filter((t) => t.status === 'BLOCKED').length;\n const totalPoints = tasks.reduce((s, t) => s + (t.storyPoints ?? 0), 0);\n const completedPoints = tasks\n .filter((t) => t.status === 'DONE')\n .reduce((s, t) => s + (t.storyPoints ?? 0), 0);\n\n const sprintsWithVelocity = sprints.filter((s) => s.velocity != null && s.velocity > 0);\n const avgVelocity =\n sprintsWithVelocity.length > 0\n ? Math.round(\n sprintsWithVelocity.reduce((s, sp) => s + (sp.velocity ?? 0), 0) /\n sprintsWithVelocity.length\n )\n : 0;\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE').length;\n const atRiskMs = milestones.filter(\n (m) => m.status === 'AT_RISK' || m.status === 'OVERDUE'\n ).length;\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE').length;\n\n const completionRate = totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;\n\n const velocityBySprintData = sprintsWithVelocity.slice(-6).map((sp) => ({\n label: sp.name,\n pts: sp.velocity ?? 0,\n }));\n const maxPts =\n velocityBySprintData.length > 0 ? Math.max(...velocityBySprintData.map((d) => d.pts)) : 1;\n\n const tasksByStatus = tasks.reduce(\n (acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n );\n const statusColors: Record<string, string> = {\n BACKLOG: 'bg-gray-400',\n TODO: 'bg-blue-400',\n IN_PROGRESS: 'bg-yellow-400',\n IN_REVIEW: 'bg-purple-400',\n DONE: 'bg-green-400',\n BLOCKED: 'bg-red-400',\n };\n\n const metrics = [\n {\n label: t('planmagnet.analytics.metrics.totalWorkItems.label', 'Total Work Items'),\n value: String(totalTasks),\n trend: `${completionRate}% ${t('planmagnet.analytics.metrics.totalWorkItems.trend', 'completed')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.storyPoints.label', 'Story Points'),\n value: String(totalPoints),\n trend: `${completedPoints} ${t('planmagnet.analytics.metrics.storyPoints.trend', 'completed')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.activeProjects.label', 'Active Projects'),\n value: String(activeProjects),\n trend: `${projects.length} ${t('planmagnet.analytics.metrics.activeProjects.trend', 'total')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.blockedItems.label', 'Blocked Items'),\n value: String(blockedTasks),\n trend:\n blockedTasks > 0\n ? t('planmagnet.analytics.metrics.blockedItems.attention', 'Needs attention')\n : t('planmagnet.analytics.metrics.blockedItems.clear', 'All clear'),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {t('planmagnet.analytics.title', 'Analytics Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.analytics.subtitle', 'Overview of project health and team performance')}\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {metrics.map((m) => (\n <Card key={m.label}>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">{m.label}</p>\n <p className=\"text-xl font-bold mt-1\">{m.value}</p>\n <p className=\"text-xs text-green-600 mt-1\">{m.trend}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4\" />\n {t('planmagnet.analytics.velocity.title', 'Sprint Velocity')} (\n {velocityBySprintData.length} {t('planmagnet.analytics.velocity.sprints', 'Sprints')})\n </CardTitle>\n </CardHeader>\n <CardContent>\n {velocityBySprintData.length > 0 ? (\n <div className=\"flex items-end gap-2 h-40\">\n {velocityBySprintData.map((d) => (\n <div key={d.label} className=\"flex-1 flex flex-col items-center gap-1\">\n <div className=\"w-full flex justify-center\">\n <div\n className=\"w-6 bg-primary rounded-t\"\n style={{ height: `${(d.pts / maxPts) * 130}px` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground truncate max-w-full\">\n {d.label}\n </span>\n <span className=\"text-[10px] font-medium\">{d.pts}</span>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground py-8 text-center\">\n {t('planmagnet.analytics.velocity.empty', 'No sprint velocity data available yet')}\n </p>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {t('planmagnet.analytics.taskDistribution.title', 'Task Distribution')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(tasksByStatus).map(([status, count]) => {\n const pct = totalTasks > 0 ? Math.round((count / totalTasks) * 100) : 0;\n return (\n <div key={status}>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"capitalize\">{status.toLowerCase().replace('_', ' ')}</span>\n <span className=\"font-medium\">\n {count} ({pct}%)\n </span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${statusColors[status] ?? 'bg-gray-300'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n {Object.keys(tasksByStatus).length === 0 && (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">\n {t('planmagnet.analytics.taskDistribution.empty', 'No work items found')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <FolderKanban className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.activeProjects', 'Active Projects')}\n </div>\n <p className=\"text-xl font-bold mt-1\">{activeProjects}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Zap className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.activeSprints', 'Active Sprints')}\n </div>\n <p className=\"text-xl font-bold mt-1\">{activeSprints}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <TrendingUp className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.avgVelocity', 'Avg Velocity')}\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {avgVelocity} {t('planmagnet.analytics.summary.pointsShort', 'pts')}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Target className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.atRisk', 'At Risk')}\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {atRiskMs} {t('planmagnet.analytics.summary.milestones', 'milestones')}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('planmagnet.analytics.projectHealth.title', 'Project Health')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {projects\n .filter((p) => p.status === 'ACTIVE')\n .map((p) => {\n const projectTasks = tasks.filter((t) => t.assigneeId != null);\n const projectDone = projectTasks.filter((t) => t.status === 'DONE').length;\n const progress =\n projectTasks.length > 0\n ? Math.round((projectDone / projectTasks.length) * 100)\n : 0;\n const hasOverdue = p.endDate && new Date(p.endDate) < new Date() && progress < 100;\n const health = hasOverdue ? 'at_risk' : progress >= 75 ? 'on_track' : 'in_progress';\n return (\n <div key={p.id} className=\"flex items-center gap-4\">\n <span className=\"text-sm font-medium w-40 truncate\">{p.name}</span>\n <div className=\"flex-1\">\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${health === 'at_risk' ? 'bg-orange-400' : health === 'on_track' ? 'bg-green-400' : 'bg-blue-400'}`}\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n <span className=\"text-sm w-12 text-right\">{progress}%</span>\n <Badge variant=\"outline\" className=\"capitalize text-xs w-20 justify-center\">\n {health.replace('_', ' ')}\n </Badge>\n </div>\n );\n })}\n {projects.filter((p) => p.status === 'ACTIVE').length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {t('planmagnet.analytics.projectHealth.empty', 'No active projects found')}\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnalyticsAnalyticsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/AnalyticsAnalyticsPagePage.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 { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { TrendingUp, Zap, FolderKanban, BarChart3, Target } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_ANALYTICS_DATA = gql`\n query GetAnalyticsData(\n $workspaceId: ID!\n $projectPagination: PlanmagnetPaginationInput\n $workItemPagination: PlanmagnetPaginationInput\n $sprintPagination: PlanmagnetPaginationInput\n $milestonePagination: PlanmagnetPaginationInput\n ) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {\n items {\n id\n name\n key\n status\n startDate\n endDate\n tags\n }\n totalCount\n }\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: $workItemPagination) {\n items {\n id\n status\n priority\n storyPoints\n assigneeId\n }\n totalCount\n }\n planmagnetSprints(workspaceId: $workspaceId, pagination: $sprintPagination) {\n items {\n id\n name\n status\n velocity\n capacity\n startDate\n endDate\n }\n totalCount\n }\n planmagnetMilestones(workspaceId: $workspaceId, pagination: $milestonePagination) {\n items {\n id\n name\n status\n dueDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n tags: string[];\n}\n\ninterface WorkItemNode {\n id: string;\n status: string;\n priority: string;\n storyPoints: number | null;\n assigneeId: string | null;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n status: string;\n velocity: number | null;\n capacity: number | null;\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface MilestoneNode {\n id: string;\n name: string;\n status: string;\n dueDate: string | null;\n}\n\ninterface AnalyticsData {\n projects: { items: ProjectNode[]; totalCount: number };\n workItems: { items: WorkItemNode[]; totalCount: number };\n sprints: { items: SprintNode[]; totalCount: number };\n milestones: { items: MilestoneNode[]; totalCount: number };\n}\n\nexport function AnalyticsAnalyticsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const { t } = useI18n();\n\n const { data, loading, error } = useQuery<AnalyticsData>(GET_ANALYTICS_DATA, {\n variables: {\n workspaceId,\n projectPagination: { first: 100 },\n workItemPagination: { first: 500 },\n sprintPagination: { first: 100 },\n milestonePagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return (\n <div className=\"p-6 text-red-500\">\n {t('planmagnet.analytics.errorLoading', 'Error loading analytics')}: {error.message}\n </div>\n );\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n const sprints = data?.planmagnetSprints?.items ?? [];\n const milestones = data?.planmagnetMilestones?.items ?? [];\n\n const totalTasks = tasks.length;\n const doneTasks = tasks.filter((t) => t.status === 'DONE').length;\n const blockedTasks = tasks.filter((t) => t.status === 'BLOCKED').length;\n const totalPoints = tasks.reduce((s, t) => s + (t.storyPoints ?? 0), 0);\n const completedPoints = tasks\n .filter((t) => t.status === 'DONE')\n .reduce((s, t) => s + (t.storyPoints ?? 0), 0);\n\n const sprintsWithVelocity = sprints.filter((s) => s.velocity != null && s.velocity > 0);\n const avgVelocity =\n sprintsWithVelocity.length > 0\n ? Math.round(\n sprintsWithVelocity.reduce((s, sp) => s + (sp.velocity ?? 0), 0) /\n sprintsWithVelocity.length\n )\n : 0;\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE').length;\n const atRiskMs = milestones.filter(\n (m) => m.status === 'AT_RISK' || m.status === 'OVERDUE'\n ).length;\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE').length;\n\n const completionRate = totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;\n\n const velocityBySprintData = sprintsWithVelocity.slice(-6).map((sp) => ({\n label: sp.name,\n pts: sp.velocity ?? 0,\n }));\n const maxPts =\n velocityBySprintData.length > 0 ? Math.max(...velocityBySprintData.map((d) => d.pts)) : 1;\n\n const tasksByStatus = tasks.reduce(\n (acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n );\n const statusColors: Record<string, string> = {\n BACKLOG: 'bg-gray-400',\n TODO: 'bg-blue-400',\n IN_PROGRESS: 'bg-yellow-400',\n IN_REVIEW: 'bg-purple-400',\n DONE: 'bg-green-400',\n BLOCKED: 'bg-red-400',\n };\n\n const metrics = [\n {\n label: t('planmagnet.analytics.metrics.totalWorkItems.label', 'Total Work Items'),\n value: String(totalTasks),\n trend: `${completionRate}% ${t('planmagnet.analytics.metrics.totalWorkItems.trend', 'completed')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.storyPoints.label', 'Story Points'),\n value: String(totalPoints),\n trend: `${completedPoints} ${t('planmagnet.analytics.metrics.storyPoints.trend', 'completed')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.activeProjects.label', 'Active Projects'),\n value: String(activeProjects),\n trend: `${projects.length} ${t('planmagnet.analytics.metrics.activeProjects.trend', 'total')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.blockedItems.label', 'Blocked Items'),\n value: String(blockedTasks),\n trend:\n blockedTasks > 0\n ? t('planmagnet.analytics.metrics.blockedItems.attention', 'Needs attention')\n : t('planmagnet.analytics.metrics.blockedItems.clear', 'All clear'),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {t('planmagnet.analytics.title', 'Analytics Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.analytics.subtitle', 'Overview of project health and team performance')}\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {metrics.map((m) => (\n <Card key={m.label}>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">{m.label}</p>\n <p className=\"text-xl font-bold mt-1\">{m.value}</p>\n <p className=\"text-xs text-green-600 mt-1\">{m.trend}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4\" />\n {t('planmagnet.analytics.velocity.title', 'Sprint Velocity')} (\n {velocityBySprintData.length} {t('planmagnet.analytics.velocity.sprints', 'Sprints')})\n </CardTitle>\n </CardHeader>\n <CardContent>\n {velocityBySprintData.length > 0 ? (\n <div className=\"flex items-end gap-2 h-40\">\n {velocityBySprintData.map((d) => (\n <div key={d.label} className=\"flex-1 flex flex-col items-center gap-1\">\n <div className=\"w-full flex justify-center\">\n <div\n className=\"w-6 bg-primary rounded-t\"\n style={{ height: `${(d.pts / maxPts) * 130}px` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground truncate max-w-full\">\n {d.label}\n </span>\n <span className=\"text-[10px] font-medium\">{d.pts}</span>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground py-8 text-center\">\n {t('planmagnet.analytics.velocity.empty', 'No sprint velocity data available yet')}\n </p>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {t('planmagnet.analytics.taskDistribution.title', 'Task Distribution')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(tasksByStatus).map(([status, count]) => {\n const pct = totalTasks > 0 ? Math.round((count / totalTasks) * 100) : 0;\n return (\n <div key={status}>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"capitalize\">{status.toLowerCase().replace('_', ' ')}</span>\n <span className=\"font-medium\">\n {count} ({pct}%)\n </span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${statusColors[status] ?? 'bg-gray-300'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n {Object.keys(tasksByStatus).length === 0 && (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">\n {t('planmagnet.analytics.taskDistribution.empty', 'No work items found')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <FolderKanban className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.activeProjects', 'Active Projects')}\n </div>\n <p className=\"text-xl font-bold mt-1\">{activeProjects}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Zap className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.activeSprints', 'Active Sprints')}\n </div>\n <p className=\"text-xl font-bold mt-1\">{activeSprints}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <TrendingUp className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.avgVelocity', 'Avg Velocity')}\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {avgVelocity} {t('planmagnet.analytics.summary.pointsShort', 'pts')}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Target className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.atRisk', 'At Risk')}\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {atRiskMs} {t('planmagnet.analytics.summary.milestones', 'milestones')}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('planmagnet.analytics.projectHealth.title', 'Project Health')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {projects\n .filter((p) => p.status === 'ACTIVE')\n .map((p) => {\n const projectTasks = tasks.filter((t) => t.assigneeId != null);\n const projectDone = projectTasks.filter((t) => t.status === 'DONE').length;\n const progress =\n projectTasks.length > 0\n ? Math.round((projectDone / projectTasks.length) * 100)\n : 0;\n const hasOverdue = p.endDate && new Date(p.endDate) < new Date() && progress < 100;\n const health = hasOverdue ? 'at_risk' : progress >= 75 ? 'on_track' : 'in_progress';\n return (\n <div key={p.id} className=\"flex items-center gap-4\">\n <span className=\"text-sm font-medium w-40 truncate\">{p.name}</span>\n <div className=\"flex-1\">\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${health === 'at_risk' ? 'bg-orange-400' : health === 'on_track' ? 'bg-green-400' : 'bg-blue-400'}`}\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n <span className=\"text-sm w-12 text-right\">{progress}%</span>\n <Badge variant=\"outline\" className=\"capitalize text-xs w-20 justify-center\">\n {health.replace('_', ' ')}\n </Badge>\n </div>\n );\n })}\n {projects.filter((p) => p.status === 'ACTIVE').length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {t('planmagnet.analytics.projectHealth.empty', 'No active projects found')}\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationCollaborationPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationCollaborationPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationCollaborationPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,kCAAkC,4CAsFjD"}
@@ -6,7 +6,7 @@ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
6
  import { Button as c, Card as l, CardContent as u } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/planmagnet/pages/CollaborationCollaborationPagePage.tsx
8
8
  var d = i`
9
- query GetProjectsForChannels($workspaceId: ID!, $pagination: PaginationInput) {
9
+ query GetProjectsForChannels($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
10
10
  planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {
11
11
  items {
12
12
  id
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationCollaborationPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { Plus, Hash, Lock, Users } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_CHANNELS = gql`\n query GetProjectsForChannels($workspaceId: ID!, $pagination: PaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n tags\n startDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n tags: string[];\n startDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationCollaborationPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_CHANNELS, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE');\n\n const channels = activeProjects.map((project) => ({\n id: project.id,\n name: project.name,\n description: `Discussion channel for ${project.key}`,\n type: 'public' as const,\n membersCount: 0,\n key: project.key,\n status: project.status,\n }));\n\n const totalChannels = channels.length;\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\">Collaboration</h1>\n <p className=\"text-sm text-muted-foreground\">\n {totalChannels} project channels &middot; {projects.length} total projects\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/collaboration/create-channel')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n New Channel\n </Button>\n </div>\n <div className=\"space-y-3\">\n {channels.map((ch) => (\n <Card key={ch.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{ch.name}</span>\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-full bg-green-100 text-green-700\">\n {ch.key}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">{ch.description}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{ch.status.toLowerCase()}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n {channels.length === 0 && (\n <div className=\"text-center py-12\">\n <Hash className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No active projects found. Create a project to start collaborating.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AASA,IAAM,IAA4B,CAAG;;;;;;;;;;;;;;;AA6BrC,SAAgB,IAAqC;CACnD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAA2B;EACjF,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAGhD,IAFiB,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAEpC,KAAK,OAAa;EAChD,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,aAAa,0BAA0B,EAAQ;EAC/C,MAAM;EACN,cAAc;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EACjB,EAAE,EAEG,IAAgB,EAAS;AAE/B,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAkB,CAAA,EACzD,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG;KAAc;KAA4B,EAAS;KAAO;KACzD;MACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;IAAK,eAAe,EAAS,gCAAgC;cAA1E,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,cAE1B;MACL;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAS,KAAK,MACb,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,iCAAkC,CAAA,EAClD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAuB,EAAG;QAAY,CAAA,EACtD,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG;QACC,CAAA,CACH;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAG;OAAgB,CAAA,CAC7D,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,QAAD;OAAM,WAAU;iBAAc,EAAG,OAAO,aAAa;OAAQ,CAAA;MACzD,CAAA,CACM;;IACT,EAlBI,EAAG,GAkBP,CACP,EACD,EAAS,WAAW,KACnB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
1
+ {"version":3,"file":"CollaborationCollaborationPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { Plus, Hash, Lock, Users } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_CHANNELS = gql`\n query GetProjectsForChannels($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n tags\n startDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n tags: string[];\n startDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationCollaborationPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_CHANNELS, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE');\n\n const channels = activeProjects.map((project) => ({\n id: project.id,\n name: project.name,\n description: `Discussion channel for ${project.key}`,\n type: 'public' as const,\n membersCount: 0,\n key: project.key,\n status: project.status,\n }));\n\n const totalChannels = channels.length;\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\">Collaboration</h1>\n <p className=\"text-sm text-muted-foreground\">\n {totalChannels} project channels &middot; {projects.length} total projects\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/collaboration/create-channel')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n New Channel\n </Button>\n </div>\n <div className=\"space-y-3\">\n {channels.map((ch) => (\n <Card key={ch.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{ch.name}</span>\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-full bg-green-100 text-green-700\">\n {ch.key}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">{ch.description}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{ch.status.toLowerCase()}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n {channels.length === 0 && (\n <div className=\"text-center py-12\">\n <Hash className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No active projects found. Create a project to start collaborating.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AASA,IAAM,IAA4B,CAAG;;;;;;;;;;;;;;;AA6BrC,SAAgB,IAAqC;CACnD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAA2B;EACjF,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAGhD,IAFiB,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAEpC,KAAK,OAAa;EAChD,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,aAAa,0BAA0B,EAAQ;EAC/C,MAAM;EACN,cAAc;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EACjB,EAAE,EAEG,IAAgB,EAAS;AAE/B,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAkB,CAAA,EACzD,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG;KAAc;KAA4B,EAAS;KAAO;KACzD;MACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;IAAK,eAAe,EAAS,gCAAgC;cAA1E,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,cAE1B;MACL;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAS,KAAK,MACb,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,iCAAkC,CAAA,EAClD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAuB,EAAG;QAAY,CAAA,EACtD,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG;QACC,CAAA,CACH;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAG;OAAgB,CAAA,CAC7D,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,QAAD;OAAM,WAAU;iBAAc,EAAG,OAAO,aAAa;OAAQ,CAAA;MACzD,CAAA,CACM;;IACT,EAlBI,EAAG,GAkBP,CACP,EACD,EAAS,WAAW,KACnB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationCreateChannelPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationCreateChannelPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationCreateChannelPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,kCAAkC,4CA8EjD"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationFilesPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationFilesPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationFilesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationFilesPagePage.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,0BAA0B,4CAyFzC"}
@@ -6,7 +6,7 @@ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
6
  import { Card as c, CardContent as l } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/planmagnet/pages/CollaborationFilesPagePage.tsx
8
8
  var u = i`
9
- query GetProjectsForFiles($workspaceId: ID!, $pagination: PaginationInput) {
9
+ query GetProjectsForFiles($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
10
10
  planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {
11
11
  items {
12
12
  id
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationFilesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationFilesPagePage.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 } from '@burdenoff/fe-libs/ui';\nimport { FileText, File, FolderKanban, Calendar } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_FILES = gql`\n query GetProjectsForFiles($workspaceId: ID!, $pagination: PaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n methodology\n tags\n startDate\n endDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n methodology: string | null;\n tags: string[];\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationFilesPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_FILES, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const projectFiles = projects.map((project) => ({\n id: project.id,\n name: project.name,\n key: project.key,\n status: project.status,\n methodology: project.methodology,\n tags: project.tags,\n startDate: project.startDate,\n endDate: project.endDate,\n }));\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Shared Files</h1>\n <p className=\"text-sm text-muted-foreground\">\n {projects.length} projects with associated resources\n </p>\n </div>\n <div className=\"space-y-2\">\n {projectFiles.map((pf) => (\n <Card key={pf.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <FolderKanban className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium\">{pf.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {pf.key} &middot; {pf.methodology ?? 'No methodology'}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-6 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{pf.status.toLowerCase()}</span>\n {pf.tags.length > 0 && (\n <div className=\"flex gap-1\">\n {pf.tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"px-1.5 py-0.5 bg-muted rounded text-[10px]\">\n {tag}\n </span>\n ))}\n </div>\n )}\n {pf.startDate && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {pf.startDate}\n </span>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n {projectFiles.length === 0 && (\n <div className=\"text-center py-12\">\n <File className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No projects found. Files will appear once projects are created.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAAyB,CAAG;;;;;;;;;;;;;;;;;AAiClC,SAAgB,IAA6B;CAC3C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAAwB;EAC9E,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAEhD,IAAe,EAAS,KAAK,OAAa;EAC9C,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EAChB,aAAa,EAAQ;EACrB,MAAM,EAAQ;EACd,WAAW,EAAQ;EACnB,SAAS,EAAQ;EAClB,EAAE;AAEH,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAiB,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAU;aAAb,CACG,EAAS,QAAO,sCACf;KACA,EAAA,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAa,KAAK,MACjB,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA,EAC1D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuB,EAAG;OAAS,CAAA,EAChD,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAG;QAAI;QAAW,EAAG,eAAe;QACnC;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD;QAAM,WAAU;kBAAc,EAAG,OAAO,aAAa;QAAQ,CAAA;OAC5D,EAAG,KAAK,SAAS,KAChB,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MACxB,kBAAC,QAAD;SAAgB,WAAU;mBACvB;SACI,EAFI,EAEJ,CACP;QACE,CAAA;OAEP,EAAG,aACF,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAC/B,EAAG,UACC;;OAEL;QACM;;IACT,EA9BI,EAAG,GA8BP,CACP,EACD,EAAa,WAAW,KACvB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
1
+ {"version":3,"file":"CollaborationFilesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationFilesPagePage.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 } from '@burdenoff/fe-libs/ui';\nimport { FileText, File, FolderKanban, Calendar } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_FILES = gql`\n query GetProjectsForFiles($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n methodology\n tags\n startDate\n endDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n methodology: string | null;\n tags: string[];\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationFilesPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_FILES, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const projectFiles = projects.map((project) => ({\n id: project.id,\n name: project.name,\n key: project.key,\n status: project.status,\n methodology: project.methodology,\n tags: project.tags,\n startDate: project.startDate,\n endDate: project.endDate,\n }));\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Shared Files</h1>\n <p className=\"text-sm text-muted-foreground\">\n {projects.length} projects with associated resources\n </p>\n </div>\n <div className=\"space-y-2\">\n {projectFiles.map((pf) => (\n <Card key={pf.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <FolderKanban className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium\">{pf.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {pf.key} &middot; {pf.methodology ?? 'No methodology'}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-6 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{pf.status.toLowerCase()}</span>\n {pf.tags.length > 0 && (\n <div className=\"flex gap-1\">\n {pf.tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"px-1.5 py-0.5 bg-muted rounded text-[10px]\">\n {tag}\n </span>\n ))}\n </div>\n )}\n {pf.startDate && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {pf.startDate}\n </span>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n {projectFiles.length === 0 && (\n <div className=\"text-center py-12\">\n <File className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No projects found. Files will appear once projects are created.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAAyB,CAAG;;;;;;;;;;;;;;;;;AAiClC,SAAgB,IAA6B;CAC3C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAAwB;EAC9E,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAEhD,IAAe,EAAS,KAAK,OAAa;EAC9C,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EAChB,aAAa,EAAQ;EACrB,MAAM,EAAQ;EACd,WAAW,EAAQ;EACnB,SAAS,EAAQ;EAClB,EAAE;AAEH,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAiB,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAU;aAAb,CACG,EAAS,QAAO,sCACf;KACA,EAAA,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAa,KAAK,MACjB,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA,EAC1D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuB,EAAG;OAAS,CAAA,EAChD,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAG;QAAI;QAAW,EAAG,eAAe;QACnC;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD;QAAM,WAAU;kBAAc,EAAG,OAAO,aAAa;QAAQ,CAAA;OAC5D,EAAG,KAAK,SAAS,KAChB,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MACxB,kBAAC,QAAD;SAAgB,WAAU;mBACvB;SACI,EAFI,EAEJ,CACP;QACE,CAAA;OAEP,EAAG,aACF,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAC/B,EAAG,UACC;;OAEL;QACM;;IACT,EA9BI,EAAG,GA8BP,CACP,EACD,EAAa,WAAW,KACvB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationMessagesPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationMessagesPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationMessagesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationMessagesPagePage.tsx"],"names":[],"mappings":"AA0DA,wBAAgB,6BAA6B,4CAqG5C"}
@@ -6,7 +6,7 @@ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
6
  import { Card as s, CardContent as c } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/planmagnet/pages/CollaborationMessagesPagePage.tsx
8
8
  var l = r`
9
- query GetRecentWorkItemsForMessages($workspaceId: ID!, $pagination: PaginationInput) {
9
+ query GetRecentWorkItemsForMessages($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
10
10
  planmagnetWorkItems(workspaceId: $workspaceId, pagination: $pagination) {
11
11
  items {
12
12
  id
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationMessagesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationMessagesPagePage.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 } from '@burdenoff/fe-libs/ui';\nimport { MessageSquare, Hash } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_RECENT_WORK_ITEMS = gql`\n query GetRecentWorkItemsForMessages($workspaceId: ID!, $pagination: PaginationInput) {\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n key\n title\n status\n priority\n assigneeId\n labels\n tags\n createdAt\n }\n totalCount\n }\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n }\n totalCount\n }\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n key: string;\n title: string;\n status: string;\n priority: string;\n assigneeId: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n}\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n}\n\ninterface MessagesData {\n workItems: { items: WorkItemNode[]; totalCount: number };\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationMessagesPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const { data, loading, error } = useQuery<MessagesData>(GET_RECENT_WORK_ITEMS, {\n variables: {\n workspaceId,\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 <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const workItems = data?.planmagnetWorkItems?.items ?? [];\n const projects = data?.planmagnetProjects?.items ?? [];\n const projectMap = new Map(projects.map((p) => [p.id, p]));\n\n const recentActivity = workItems.slice(0, 20).map((wi) => ({\n id: wi.id,\n key: wi.key,\n title: wi.title,\n status: wi.status,\n priority: wi.priority,\n assigneeId: wi.assigneeId,\n createdAt: wi.createdAt,\n labels: wi.labels,\n }));\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Messages</h1>\n <p className=\"text-sm text-muted-foreground\">Recent activity across all projects</p>\n </div>\n <div className=\"space-y-4\">\n {recentActivity.map((activity) => (\n <Card key={activity.id}>\n <CardContent className=\"py-3\">\n <div className=\"flex items-start gap-3\">\n <div className=\"h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary shrink-0 mt-0.5\">\n {activity.key.slice(0, 2)}\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{activity.title}</span>\n <span className=\"text-xs text-muted-foreground flex items-center gap-0.5\">\n <Hash className=\"h-3 w-3\" />\n {activity.key}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(activity.createdAt).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n })}\n </span>\n </div>\n <p className=\"text-sm mt-1 text-muted-foreground\">\n Status: {activity.status.toLowerCase().replace('_', ' ')} &middot; Priority:{' '}\n {activity.priority.toLowerCase()}\n </p>\n <div className=\"flex items-center gap-3 mt-2\">\n <div className=\"flex gap-1\">\n {activity.labels.slice(0, 3).map((label) => (\n <span key={label} className=\"text-xs bg-muted px-1.5 py-0.5 rounded-full\">\n {label}\n </span>\n ))}\n </div>\n {activity.assigneeId && (\n <span className=\"text-xs text-primary flex items-center gap-1\">\n <MessageSquare className=\"h-3 w-3\" />\n Assigned\n </span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n {recentActivity.length === 0 && (\n <div className=\"text-center py-12\">\n <MessageSquare className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No recent activity. Create work items to see updates here.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAAwB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDjC,SAAgB,IAAgC;CAC9C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAAuB;EAC7E,WAAW;GACT;GACA,YAAY,EAAE,OAAO,IAAI;GAC1B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAY,GAAM,qBAAqB,SAAS,EAAE,EAClD,IAAW,GAAM,oBAAoB,SAAS,EAAE;AACnC,KAAI,IAAI,EAAS,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;CAE1D,IAAM,IAAiB,EAAU,MAAM,GAAG,GAAG,CAAC,KAAK,OAAQ;EACzD,IAAI,EAAG;EACP,KAAK,EAAG;EACR,OAAO,EAAG;EACV,QAAQ,EAAG;EACX,UAAU,EAAG;EACb,YAAY,EAAG;EACf,WAAW,EAAG;EACd,QAAQ,EAAG;EACZ,EAAE;AAEH,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAa,CAAA,EACpD,kBAAC,KAAD;GAAG,WAAU;aAAgC;GAAuC,CAAA,CAChF,EAAA,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAe,KAAK,MACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAS,IAAI,MAAM,GAAG,EAAE;MACrB,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,QAAD;UAAM,WAAU;oBAAuB,EAAS;UAAa,CAAA;SAC7D,kBAAC,QAAD;UAAM,WAAU;oBAAhB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAS,IACL;;SACP,kBAAC,QAAD;UAAM,WAAU;oBACb,IAAI,KAAK,EAAS,UAAU,CAAC,mBAAmB,EAAE,EAAE;WACnD,MAAM;WACN,QAAQ;WACT,CAAC;UACG,CAAA;SACH;;OACN,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAAkD;SACvC,EAAS,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;SAAC;SAAoB;SAC5E,EAAS,SAAS,aAAa;SAC9B;;OACJ,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBACZ,EAAS,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK,MAChC,kBAAC,QAAD;UAAkB,WAAU;oBACzB;UACI,EAFI,EAEJ,CACP;SACE,CAAA,EACL,EAAS,cACR,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,WAEhC;WAEL;;OACF;QACF;;IACM,CAAA,EACT,EA1CI,EAAS,GA0Cb,CACP,EACD,EAAe,WAAW,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAe,WAAU,gDAAiD,CAAA,EAC1E,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
1
+ {"version":3,"file":"CollaborationMessagesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationMessagesPagePage.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 } from '@burdenoff/fe-libs/ui';\nimport { MessageSquare, Hash } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_RECENT_WORK_ITEMS = gql`\n query GetRecentWorkItemsForMessages($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n key\n title\n status\n priority\n assigneeId\n labels\n tags\n createdAt\n }\n totalCount\n }\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n }\n totalCount\n }\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n key: string;\n title: string;\n status: string;\n priority: string;\n assigneeId: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n}\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n}\n\ninterface MessagesData {\n workItems: { items: WorkItemNode[]; totalCount: number };\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationMessagesPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const { data, loading, error } = useQuery<MessagesData>(GET_RECENT_WORK_ITEMS, {\n variables: {\n workspaceId,\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 <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const workItems = data?.planmagnetWorkItems?.items ?? [];\n const projects = data?.planmagnetProjects?.items ?? [];\n const projectMap = new Map(projects.map((p) => [p.id, p]));\n\n const recentActivity = workItems.slice(0, 20).map((wi) => ({\n id: wi.id,\n key: wi.key,\n title: wi.title,\n status: wi.status,\n priority: wi.priority,\n assigneeId: wi.assigneeId,\n createdAt: wi.createdAt,\n labels: wi.labels,\n }));\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Messages</h1>\n <p className=\"text-sm text-muted-foreground\">Recent activity across all projects</p>\n </div>\n <div className=\"space-y-4\">\n {recentActivity.map((activity) => (\n <Card key={activity.id}>\n <CardContent className=\"py-3\">\n <div className=\"flex items-start gap-3\">\n <div className=\"h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary shrink-0 mt-0.5\">\n {activity.key.slice(0, 2)}\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{activity.title}</span>\n <span className=\"text-xs text-muted-foreground flex items-center gap-0.5\">\n <Hash className=\"h-3 w-3\" />\n {activity.key}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(activity.createdAt).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n })}\n </span>\n </div>\n <p className=\"text-sm mt-1 text-muted-foreground\">\n Status: {activity.status.toLowerCase().replace('_', ' ')} &middot; Priority:{' '}\n {activity.priority.toLowerCase()}\n </p>\n <div className=\"flex items-center gap-3 mt-2\">\n <div className=\"flex gap-1\">\n {activity.labels.slice(0, 3).map((label) => (\n <span key={label} className=\"text-xs bg-muted px-1.5 py-0.5 rounded-full\">\n {label}\n </span>\n ))}\n </div>\n {activity.assigneeId && (\n <span className=\"text-xs text-primary flex items-center gap-1\">\n <MessageSquare className=\"h-3 w-3\" />\n Assigned\n </span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n {recentActivity.length === 0 && (\n <div className=\"text-center py-12\">\n <MessageSquare className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No recent activity. Create work items to see updates here.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAAwB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDjC,SAAgB,IAAgC;CAC9C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAAuB;EAC7E,WAAW;GACT;GACA,YAAY,EAAE,OAAO,IAAI;GAC1B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAY,GAAM,qBAAqB,SAAS,EAAE,EAClD,IAAW,GAAM,oBAAoB,SAAS,EAAE;AACnC,KAAI,IAAI,EAAS,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;CAE1D,IAAM,IAAiB,EAAU,MAAM,GAAG,GAAG,CAAC,KAAK,OAAQ;EACzD,IAAI,EAAG;EACP,KAAK,EAAG;EACR,OAAO,EAAG;EACV,QAAQ,EAAG;EACX,UAAU,EAAG;EACb,YAAY,EAAG;EACf,WAAW,EAAG;EACd,QAAQ,EAAG;EACZ,EAAE;AAEH,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAa,CAAA,EACpD,kBAAC,KAAD;GAAG,WAAU;aAAgC;GAAuC,CAAA,CAChF,EAAA,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAe,KAAK,MACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAS,IAAI,MAAM,GAAG,EAAE;MACrB,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,QAAD;UAAM,WAAU;oBAAuB,EAAS;UAAa,CAAA;SAC7D,kBAAC,QAAD;UAAM,WAAU;oBAAhB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAS,IACL;;SACP,kBAAC,QAAD;UAAM,WAAU;oBACb,IAAI,KAAK,EAAS,UAAU,CAAC,mBAAmB,EAAE,EAAE;WACnD,MAAM;WACN,QAAQ;WACT,CAAC;UACG,CAAA;SACH;;OACN,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAAkD;SACvC,EAAS,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;SAAC;SAAoB;SAC5E,EAAS,SAAS,aAAa;SAC9B;;OACJ,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBACZ,EAAS,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK,MAChC,kBAAC,QAAD;UAAkB,WAAU;oBACzB;UACI,EAFI,EAEJ,CACP;SACE,CAAA,EACL,EAAS,cACR,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,WAEhC;WAEL;;OACF;QACF;;IACM,CAAA,EACT,EA1CI,EAAS,GA0Cb,CACP,EACD,EAAe,WAAW,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAe,WAAU,gDAAiD,CAAA,EAC1E,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationNewDiscussionPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationNewDiscussionPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationNewDiscussionPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationNewDiscussionPagePage.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,kCAAkC,4CAiGjD"}
@@ -7,7 +7,7 @@ import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
7
  import { Button as u, Card as d, CardContent as f, CardHeader as p, CardTitle as m, Input as h } from "@burdenoff/fe-libs/ui";
8
8
  //#region src/planmagnet/pages/CollaborationNewDiscussionPagePage.tsx
9
9
  var g = o`
10
- query GetProjectsForDiscussion($workspaceId: ID!, $pagination: PaginationInput) {
10
+ query GetProjectsForDiscussion($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
11
11
  planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {
12
12
  items {
13
13
  id
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationNewDiscussionPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationNewDiscussionPagePage.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, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, MessageCircle } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_DISCUSSION = gql`\n query GetProjectsForDiscussion($workspaceId: ID!, $pagination: PaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationNewDiscussionPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [form, setForm] = useState({ title: '', content: '', projectId: '' });\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_DISCUSSION, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const handlePost = () => {\n if (!form.title.trim() || !form.content.trim()) return;\n navigate('/collaboration');\n };\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">New Discussion</h1>\n <p className=\"text-sm text-muted-foreground\">\n Start a new discussion thread with your team.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/collaboration')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handlePost}>\n <Save className=\"mr-1 h-4 w-4\" />\n Post Discussion\n </Button>\n </div>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageCircle className=\"h-4 w-4\" />\n Discussion Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Title</label>\n <Input\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. RFC: Search Architecture Proposal\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Project (optional)</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.projectId}\n onChange={(e) => setForm({ ...form, projectId: e.target.value })}\n >\n <option value=\"\">General</option>\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name} ({p.key})\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Content</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[200px] font-mono\"\n value={form.content}\n onChange={(e) => setForm({ ...form, content: e.target.value })}\n placeholder=\"Write your discussion content... (Markdown supported)\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AASA,IAAM,IAA8B,CAAG;;;;;;;;;;;;AAuBvC,SAAgB,IAAqC;CACnD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAClC,CAAC,GAAM,KAAW,EAAS;EAAE,OAAO;EAAI,SAAS;EAAI,WAAW;EAAI,CAAC,EAErE,EAAE,SAAM,YAAS,aAAU,EAAuB,GAA6B;EACnF,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC,EAEI,IAAW,GAAM,oBAAoB,SAAS,EAAE;AAmBtD,QAZI,IAEA,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA,GAIN,IACK,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;MAIrE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAmB,CAAA,EAC1D,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;KAAU,MAAK;KAAK,eAAe,EAAS,iBAAiB;eAA7E,CACE,kBAAC,GAAD,EAAG,WAAU,gBAAiB,CAAA,EAAA,SAEvB;QACT,kBAAC,GAAD;KAAQ,MAAK;KAAK,eA/BD;AACnB,OAAC,EAAK,MAAM,MAAM,IAAI,CAAC,EAAK,QAAQ,MAAM,IAC9C,EAAS,iBAAiB;;eA6BpB,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,kBAE1B;OACL;MACF;MACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,qBAE3B;MACD,CAAA,EACb,kBAAC,GAAD;GAAa,WAAU;aAAvB;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAa,CAAA,EACpD,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,OAAO,EAAE,OAAO;MAAO,CAAC;KAC5D,WAAU;KACV,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAA0B,CAAA,EACjE,kBAAC,UAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,WAAW,EAAE,OAAO;MAAO,CAAC;eAHlE,CAKE,kBAAC,UAAD;MAAQ,OAAM;gBAAG;MAAgB,CAAA,EAChC,EAAS,KAAK,MACb,kBAAC,UAAD;MAAmB,OAAO,EAAE;gBAA5B;OACG,EAAE;OAAK;OAAG,EAAE;OAAI;OACV;QAFI,EAAE,GAEN,CACT,CACK;OACL,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAe,CAAA,EACtD,kBAAC,YAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,SAAS,EAAE,OAAO;MAAO,CAAC;KAC9D,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACM;KACT,EAAA,CAAA,CACH"}
1
+ {"version":3,"file":"CollaborationNewDiscussionPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationNewDiscussionPagePage.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, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, MessageCircle } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_DISCUSSION = gql`\n query GetProjectsForDiscussion($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationNewDiscussionPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [form, setForm] = useState({ title: '', content: '', projectId: '' });\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_DISCUSSION, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const handlePost = () => {\n if (!form.title.trim() || !form.content.trim()) return;\n navigate('/collaboration');\n };\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">New Discussion</h1>\n <p className=\"text-sm text-muted-foreground\">\n Start a new discussion thread with your team.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/collaboration')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handlePost}>\n <Save className=\"mr-1 h-4 w-4\" />\n Post Discussion\n </Button>\n </div>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageCircle className=\"h-4 w-4\" />\n Discussion Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Title</label>\n <Input\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. RFC: Search Architecture Proposal\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Project (optional)</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.projectId}\n onChange={(e) => setForm({ ...form, projectId: e.target.value })}\n >\n <option value=\"\">General</option>\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name} ({p.key})\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Content</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[200px] font-mono\"\n value={form.content}\n onChange={(e) => setForm({ ...form, content: e.target.value })}\n placeholder=\"Write your discussion content... (Markdown supported)\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AASA,IAAM,IAA8B,CAAG;;;;;;;;;;;;AAuBvC,SAAgB,IAAqC;CACnD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAClC,CAAC,GAAM,KAAW,EAAS;EAAE,OAAO;EAAI,SAAS;EAAI,WAAW;EAAI,CAAC,EAErE,EAAE,SAAM,YAAS,aAAU,EAAuB,GAA6B;EACnF,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC,EAEI,IAAW,GAAM,oBAAoB,SAAS,EAAE;AAmBtD,QAZI,IAEA,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA,GAIN,IACK,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;MAIrE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAmB,CAAA,EAC1D,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;KAAU,MAAK;KAAK,eAAe,EAAS,iBAAiB;eAA7E,CACE,kBAAC,GAAD,EAAG,WAAU,gBAAiB,CAAA,EAAA,SAEvB;QACT,kBAAC,GAAD;KAAQ,MAAK;KAAK,eA/BD;AACnB,OAAC,EAAK,MAAM,MAAM,IAAI,CAAC,EAAK,QAAQ,MAAM,IAC9C,EAAS,iBAAiB;;eA6BpB,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,kBAE1B;OACL;MACF;MACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,qBAE3B;MACD,CAAA,EACb,kBAAC,GAAD;GAAa,WAAU;aAAvB;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAa,CAAA,EACpD,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,OAAO,EAAE,OAAO;MAAO,CAAC;KAC5D,WAAU;KACV,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAA0B,CAAA,EACjE,kBAAC,UAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,WAAW,EAAE,OAAO;MAAO,CAAC;eAHlE,CAKE,kBAAC,UAAD;MAAQ,OAAM;gBAAG;MAAgB,CAAA,EAChC,EAAS,KAAK,MACb,kBAAC,UAAD;MAAmB,OAAO,EAAE;gBAA5B;OACG,EAAE;OAAK;OAAG,EAAE;OAAI;OACV;QAFI,EAAE,GAEN,CACT,CACK;OACL,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAe,CAAA,EACtD,kBAAC,YAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,SAAS,EAAE,OAAO;MAAO,CAAC;KAC9D,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACM;KACT,EAAA,CAAA,CACH"}
@@ -0,0 +1,2 @@
1
+ export declare function DashboardDashboardPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=DashboardDashboardPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardDashboardPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/DashboardDashboardPagePage.tsx"],"names":[],"mappings":"AAuFA,wBAAgB,0BAA0B,4CAwUzC"}
@@ -0,0 +1,2 @@
1
+ export declare function MeetingsScheduleMeetingPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=MeetingsScheduleMeetingPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingsScheduleMeetingPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/MeetingsScheduleMeetingPagePage.tsx"],"names":[],"mappings":"AAiEA,wBAAgB,+BAA+B,4CAwN9C"}
@@ -9,8 +9,8 @@ import { Badge as u, Button as d, Card as f, CardContent as p, CardHeader as m,
9
9
  var _ = o`
10
10
  query GetProjectsAndSprintsForMeetings(
11
11
  $workspaceId: ID!
12
- $projectPagination: PaginationInput
13
- $sprintPagination: PaginationInput
12
+ $projectPagination: PlanmagnetPaginationInput
13
+ $sprintPagination: PlanmagnetPaginationInput
14
14
  ) {
15
15
  planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {
16
16
  items {
@@ -1 +1 @@
1
- {"version":3,"file":"MeetingsScheduleMeetingPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/MeetingsScheduleMeetingPagePage.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 {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Button,\n Input,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport { Save, CalendarDays, Clock, MapPin } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_AND_SPRINTS = gql`\n query GetProjectsAndSprintsForMeetings(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $sprintPagination: PaginationInput\n ) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {\n items {\n id\n name\n key\n status\n }\n totalCount\n }\n planmagnetSprints(workspaceId: $workspaceId, pagination: $sprintPagination) {\n items {\n id\n name\n status\n startDate\n endDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface MeetingsQueryData {\n projects: { items: ProjectNode[]; totalCount: number };\n sprints: { items: SprintNode[]; totalCount: number };\n}\n\nexport function MeetingsScheduleMeetingPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [form, setForm] = useState({\n title: '',\n description: '',\n type: 'standup',\n date: '',\n startTime: '',\n endTime: '',\n projectId: '',\n location: '',\n });\n const types = [\n 'standup',\n 'sprint_review',\n 'retrospective',\n 'planning',\n 'one_on_one',\n 'general',\n ] as const;\n\n const { data, loading, error } = useQuery<MeetingsQueryData>(GET_PROJECTS_AND_SPRINTS, {\n variables: {\n workspaceId,\n projectPagination: { first: 100 },\n sprintPagination: { first: 50 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const sprints = data?.planmagnetSprints?.items ?? [];\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE');\n\n const upcomingMeetings = activeSprints.map((sprint) => ({\n id: sprint.id,\n title: `${sprint.name} Standup`,\n description: `Daily standup for ${sprint.name}`,\n type: 'standup' as const,\n date: sprint.startDate ?? '',\n startTime: '09:00',\n endTime: '09:15',\n location: 'Virtual',\n sprintName: sprint.name,\n }));\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\">Meeting Scheduler</h1>\n <p className=\"text-sm text-muted-foreground\">\n {activeSprints.length} active sprints &middot; {projects.length} projects\n </p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CalendarDays className=\"h-4 w-4\" />\n Schedule New Meeting\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Title</label>\n <Input\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. Sprint 14 Review\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Description</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[60px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Type</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.type}\n onChange={(e) => setForm({ ...form, type: e.target.value })}\n >\n {types.map((t) => (\n <option key={t} value={t}>\n {t.replace('_', ' ')}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.projectId}\n onChange={(e) => setForm({ ...form, projectId: e.target.value })}\n >\n <option value=\"\">None</option>\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name} ({p.key})\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Date</label>\n <Input\n type=\"date\"\n value={form.date}\n onChange={(e) => setForm({ ...form, date: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Start</label>\n <Input\n type=\"time\"\n value={form.startTime}\n onChange={(e) => setForm({ ...form, startTime: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">End</label>\n <Input\n type=\"time\"\n value={form.endTime}\n onChange={(e) => setForm({ ...form, endTime: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Location</label>\n <Input\n value={form.location}\n onChange={(e) => setForm({ ...form, location: e.target.value })}\n className=\"mt-1\"\n placeholder=\"Zoom / Conference Room A\"\n />\n </div>\n <Button size=\"sm\" className=\"w-full\">\n <Save className=\"mr-1 h-4 w-4\" />\n Schedule Meeting\n </Button>\n </CardContent>\n </Card>\n\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Sprint-Based Meetings</h2>\n {upcomingMeetings.map((mtg) => (\n <Card key={mtg.id}>\n <CardContent className=\"py-3 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{mtg.title}</span>\n <Badge variant=\"outline\" className=\"capitalize text-xs\">\n {mtg.type.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">{mtg.description}</p>\n <div className=\"flex gap-3 text-xs text-muted-foreground\">\n {mtg.date && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3 w-3\" />\n {mtg.date}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {mtg.startTime}-{mtg.endTime}\n </span>\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {mtg.location}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n {upcomingMeetings.length === 0 && (\n <Card>\n <CardContent className=\"py-8 text-center\">\n <CalendarDays className=\"h-10 w-10 text-muted-foreground mx-auto mb-2\" />\n <p className=\"text-sm text-muted-foreground\">\n No active sprints found. Start a sprint to generate meeting suggestions.\n </p>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MeetingsScheduleMeetingPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/MeetingsScheduleMeetingPagePage.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 {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Button,\n Input,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport { Save, CalendarDays, Clock, MapPin } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_AND_SPRINTS = gql`\n query GetProjectsAndSprintsForMeetings(\n $workspaceId: ID!\n $projectPagination: PlanmagnetPaginationInput\n $sprintPagination: PlanmagnetPaginationInput\n ) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {\n items {\n id\n name\n key\n status\n }\n totalCount\n }\n planmagnetSprints(workspaceId: $workspaceId, pagination: $sprintPagination) {\n items {\n id\n name\n status\n startDate\n endDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface MeetingsQueryData {\n projects: { items: ProjectNode[]; totalCount: number };\n sprints: { items: SprintNode[]; totalCount: number };\n}\n\nexport function MeetingsScheduleMeetingPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [form, setForm] = useState({\n title: '',\n description: '',\n type: 'standup',\n date: '',\n startTime: '',\n endTime: '',\n projectId: '',\n location: '',\n });\n const types = [\n 'standup',\n 'sprint_review',\n 'retrospective',\n 'planning',\n 'one_on_one',\n 'general',\n ] as const;\n\n const { data, loading, error } = useQuery<MeetingsQueryData>(GET_PROJECTS_AND_SPRINTS, {\n variables: {\n workspaceId,\n projectPagination: { first: 100 },\n sprintPagination: { first: 50 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const sprints = data?.planmagnetSprints?.items ?? [];\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE');\n\n const upcomingMeetings = activeSprints.map((sprint) => ({\n id: sprint.id,\n title: `${sprint.name} Standup`,\n description: `Daily standup for ${sprint.name}`,\n type: 'standup' as const,\n date: sprint.startDate ?? '',\n startTime: '09:00',\n endTime: '09:15',\n location: 'Virtual',\n sprintName: sprint.name,\n }));\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\">Meeting Scheduler</h1>\n <p className=\"text-sm text-muted-foreground\">\n {activeSprints.length} active sprints &middot; {projects.length} projects\n </p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CalendarDays className=\"h-4 w-4\" />\n Schedule New Meeting\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Title</label>\n <Input\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. Sprint 14 Review\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Description</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[60px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Type</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.type}\n onChange={(e) => setForm({ ...form, type: e.target.value })}\n >\n {types.map((t) => (\n <option key={t} value={t}>\n {t.replace('_', ' ')}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.projectId}\n onChange={(e) => setForm({ ...form, projectId: e.target.value })}\n >\n <option value=\"\">None</option>\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name} ({p.key})\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Date</label>\n <Input\n type=\"date\"\n value={form.date}\n onChange={(e) => setForm({ ...form, date: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Start</label>\n <Input\n type=\"time\"\n value={form.startTime}\n onChange={(e) => setForm({ ...form, startTime: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">End</label>\n <Input\n type=\"time\"\n value={form.endTime}\n onChange={(e) => setForm({ ...form, endTime: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Location</label>\n <Input\n value={form.location}\n onChange={(e) => setForm({ ...form, location: e.target.value })}\n className=\"mt-1\"\n placeholder=\"Zoom / Conference Room A\"\n />\n </div>\n <Button size=\"sm\" className=\"w-full\">\n <Save className=\"mr-1 h-4 w-4\" />\n Schedule Meeting\n </Button>\n </CardContent>\n </Card>\n\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Sprint-Based Meetings</h2>\n {upcomingMeetings.map((mtg) => (\n <Card key={mtg.id}>\n <CardContent className=\"py-3 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{mtg.title}</span>\n <Badge variant=\"outline\" className=\"capitalize text-xs\">\n {mtg.type.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">{mtg.description}</p>\n <div className=\"flex gap-3 text-xs text-muted-foreground\">\n {mtg.date && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3 w-3\" />\n {mtg.date}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {mtg.startTime}-{mtg.endTime}\n </span>\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {mtg.location}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n {upcomingMeetings.length === 0 && (\n <Card>\n <CardContent className=\"py-8 text-center\">\n <CalendarDays className=\"h-10 w-10 text-muted-foreground mx-auto mb-2\" />\n <p className=\"text-sm text-muted-foreground\">\n No active sprints found. Start a sprint to generate meeting suggestions.\n </p>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsCreateProductPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsCreateProductPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsCreateProductPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsCreateProductPagePage.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,6BAA6B,4CAqK5C"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsCreateRoadmapPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsCreateRoadmapPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsCreateRoadmapPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsCreateRoadmapPagePage.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,6BAA6B,4CA2H5C"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsEditProductPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsEditProductPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsEditProductPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsEditProductPagePage.tsx"],"names":[],"mappings":"AA0DA,wBAAgB,2BAA2B,4CA4N1C"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsEditReleasePagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsEditReleasePagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsEditReleasePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsEditReleasePagePage.tsx"],"names":[],"mappings":"AA2CA,wBAAgB,2BAA2B,4CAqM1C"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsFeatureAnalyticsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsFeatureAnalyticsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsFeatureAnalyticsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsFeatureAnalyticsPagePage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,gCAAgC,4CA6P/C"}
@@ -35,7 +35,7 @@ var g = c`
35
35
  }
36
36
  }
37
37
  `, _ = c`
38
- query ListAllFeaturesAnalytics($workspaceId: ID!, $pagination: PaginationInput) {
38
+ query ListAllFeaturesAnalytics($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
39
39
  planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {
40
40
  items {
41
41
  id