@burdenoff/microfe-planmagnet 2026.509.103

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 (222) hide show
  1. package/README.md +12 -0
  2. package/dist/dev/main.d.ts +2 -0
  3. package/dist/dev/main.d.ts.map +1 -0
  4. package/dist/generated/global-operations.d.ts +2 -0
  5. package/dist/generated/global-operations.d.ts.map +1 -0
  6. package/dist/generated/global-types.d.ts +21253 -0
  7. package/dist/generated/global-types.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.d.ts +8370 -0
  9. package/dist/generated/wspace-operations.d.ts.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +4182 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
  16. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  17. package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
  18. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  19. package/dist/planmagnet/PlanMagnetRoot.d.ts +5 -0
  20. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -0
  21. package/dist/planmagnet/PlanMagnetRoot.js +292 -0
  22. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -0
  23. package/dist/planmagnet/PlanMagnetRoutes.d.ts +2 -0
  24. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -0
  25. package/dist/planmagnet/PlanMagnetRoutes.js +211 -0
  26. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -0
  27. package/dist/planmagnet/index.d.ts +5 -0
  28. package/dist/planmagnet/index.d.ts.map +1 -0
  29. package/dist/planmagnet/index.js +3 -0
  30. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
  31. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
  32. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +312 -0
  33. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
  34. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +2 -0
  35. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +1 -0
  36. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +110 -0
  37. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +1 -0
  38. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js +96 -0
  41. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +2 -0
  43. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +1 -0
  44. package/dist/planmagnet/pages/CollaborationFilesPagePage.js +112 -0
  45. package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +1 -0
  46. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +2 -0
  47. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +1 -0
  48. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +141 -0
  49. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +1 -0
  50. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +2 -0
  51. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +1 -0
  52. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +124 -0
  53. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +1 -0
  54. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts +2 -0
  55. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -0
  56. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +350 -0
  57. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -0
  58. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +2 -0
  59. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +1 -0
  60. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +290 -0
  61. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +1 -0
  62. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts +2 -0
  63. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -0
  64. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +189 -0
  65. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -0
  66. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts +2 -0
  67. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -0
  68. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +151 -0
  69. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -0
  70. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts +2 -0
  71. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -0
  72. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +257 -0
  73. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -0
  74. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts +2 -0
  75. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -0
  76. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +221 -0
  77. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -0
  78. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts +2 -0
  79. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -0
  80. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +284 -0
  81. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -0
  82. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts +2 -0
  83. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -0
  84. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +291 -0
  85. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -0
  86. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts +2 -0
  87. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -0
  88. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +257 -0
  89. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -0
  90. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts +2 -0
  91. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -0
  92. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +222 -0
  93. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -0
  94. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts +2 -0
  95. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -0
  96. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +288 -0
  97. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -0
  98. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts +2 -0
  99. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -0
  100. package/dist/planmagnet/pages/ProductsProductsPagePage.js +225 -0
  101. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -0
  102. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts +2 -0
  103. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -0
  104. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +262 -0
  105. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -0
  106. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts +2 -0
  107. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -0
  108. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +162 -0
  109. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -0
  110. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts +2 -0
  111. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -0
  112. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +342 -0
  113. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -0
  114. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts +2 -0
  115. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -0
  116. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +233 -0
  117. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -0
  118. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts +2 -0
  119. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -0
  120. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +193 -0
  121. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -0
  122. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts +2 -0
  123. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -0
  124. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +116 -0
  125. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -0
  126. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts +2 -0
  127. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -0
  128. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +199 -0
  129. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -0
  130. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts +2 -0
  131. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -0
  132. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +197 -0
  133. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -0
  134. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts +2 -0
  135. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -0
  136. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +173 -0
  137. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -0
  138. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts +2 -0
  139. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -0
  140. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +119 -0
  141. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -0
  142. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts +2 -0
  143. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -0
  144. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +257 -0
  145. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -0
  146. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts +2 -0
  147. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -0
  148. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +222 -0
  149. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -0
  150. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts +2 -0
  151. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -0
  152. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +142 -0
  153. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -0
  154. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts +2 -0
  155. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -0
  156. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +363 -0
  157. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -0
  158. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts +2 -0
  159. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -0
  160. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +176 -0
  161. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -0
  162. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +2 -0
  163. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -0
  164. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +173 -0
  165. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -0
  166. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +2 -0
  167. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -0
  168. package/dist/planmagnet/pages/ReportsReportsPagePage.js +221 -0
  169. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -0
  170. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts +2 -0
  171. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -0
  172. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +282 -0
  173. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -0
  174. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts +2 -0
  175. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -0
  176. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +227 -0
  177. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -0
  178. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts +2 -0
  179. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -0
  180. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +234 -0
  181. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -0
  182. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts +2 -0
  183. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -0
  184. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +232 -0
  185. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -0
  186. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts +2 -0
  187. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -0
  188. package/dist/planmagnet/pages/TasksTasksPagePage.js +206 -0
  189. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -0
  190. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts +2 -0
  191. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -0
  192. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +138 -0
  193. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -0
  194. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts +2 -0
  195. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -0
  196. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +161 -0
  197. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -0
  198. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts +2 -0
  199. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -0
  200. package/dist/planmagnet/pages/TeamTeamPagePage.js +203 -0
  201. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -0
  202. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts +2 -0
  203. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -0
  204. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +97 -0
  205. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -0
  206. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts +31 -0
  207. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +1 -0
  208. package/dist/planmagnet/providers/PlanMagnetProvider.js +119 -0
  209. package/dist/planmagnet/providers/PlanMagnetProvider.js.map +1 -0
  210. package/dist/planmagnet/store/planmagnetStore.d.ts +30 -0
  211. package/dist/planmagnet/store/planmagnetStore.d.ts.map +1 -0
  212. package/dist/planmagnet/store/planmagnetStore.js +42 -0
  213. package/dist/planmagnet/store/planmagnetStore.js.map +1 -0
  214. package/dist/planmagnet/types/index.d.ts +317 -0
  215. package/dist/planmagnet/types/index.d.ts.map +1 -0
  216. package/dist/planmagnet/utils/cn.d.ts +4 -0
  217. package/dist/planmagnet/utils/cn.d.ts.map +1 -0
  218. package/dist/planmagnet/utils/navigation.d.ts +2 -0
  219. package/dist/planmagnet/utils/navigation.d.ts.map +1 -0
  220. package/dist/planmagnet/utils/navigation.js +8 -0
  221. package/dist/planmagnet/utils/navigation.js.map +1 -0
  222. package/package.json +107 -0
@@ -0,0 +1,203 @@
1
+ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
+ import { gql as t } from "@apollo/client";
3
+ import { useQuery as n } from "@apollo/client/react";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ import { Badge as a, Card as o, CardContent as s, CardHeader as c, CardTitle as l } from "@burdenoff/fe-libs/ui";
6
+ //#region src/planmagnet/pages/TeamTeamPagePage.tsx
7
+ var u = t`
8
+ query GetTeamData(
9
+ $workspaceId: ID!
10
+ $projectPagination: PaginationInput
11
+ $workItemPagination: PaginationInput
12
+ ) {
13
+ planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {
14
+ items {
15
+ id
16
+ name
17
+ key
18
+ status
19
+ ownerId
20
+ methodology
21
+ }
22
+ totalCount
23
+ }
24
+ planmagnetWorkItems(workspaceId: $workspaceId, pagination: $workItemPagination) {
25
+ items {
26
+ id
27
+ status
28
+ assigneeId
29
+ storyPoints
30
+ }
31
+ totalCount
32
+ }
33
+ }
34
+ `, d = {
35
+ active: "bg-green-400",
36
+ away: "bg-yellow-400",
37
+ busy: "bg-red-400",
38
+ offline: "bg-gray-300"
39
+ };
40
+ function f() {
41
+ let { workspaceId: t } = e(), { data: f, loading: p, error: m } = n(u, {
42
+ variables: {
43
+ workspaceId: t,
44
+ projectPagination: { first: 100 },
45
+ workItemPagination: { first: 500 }
46
+ },
47
+ skip: !t
48
+ });
49
+ if (p) return /* @__PURE__ */ r("div", {
50
+ className: "flex items-center justify-center p-12",
51
+ children: /* @__PURE__ */ r("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
52
+ });
53
+ if (m) return /* @__PURE__ */ i("div", {
54
+ className: "p-6 text-red-500",
55
+ children: ["Error: ", m.message]
56
+ });
57
+ let h = f?.planmagnetProjects?.items ?? [], g = f?.planmagnetWorkItems?.items ?? [], _ = new Set(g.filter((e) => e.assigneeId).map((e) => e.assigneeId)), v = new Set(h.filter((e) => e.ownerId).map((e) => e.ownerId)), y = new Set([..._, ...v]), b = Array.from(y).map((e) => {
58
+ let t = g.filter((t) => t.assigneeId === e), n = t.length, r = t.filter((e) => e.status === "DONE").length, i = t.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0);
59
+ return {
60
+ id: e,
61
+ name: e,
62
+ role: h.filter((t) => t.ownerId === e).length > 0 ? "Project Owner" : "Contributor",
63
+ department: "Engineering",
64
+ tasksAssigned: n,
65
+ tasksCompleted: r,
66
+ velocity: i,
67
+ status: n > 0 ? "active" : "offline"
68
+ };
69
+ }), x = h.reduce((e, t) => {
70
+ let n = t.methodology ?? "unassigned";
71
+ return e[n] || (e[n] = {
72
+ projects: [],
73
+ ownerIds: /* @__PURE__ */ new Set()
74
+ }), e[n].projects.push(t), t.ownerId && e[n].ownerIds.add(t.ownerId), e;
75
+ }, {}), S = Object.entries(x).map(([e, t]) => ({
76
+ id: e,
77
+ name: `${e.charAt(0).toUpperCase()}${e.slice(1)} Team`,
78
+ description: `Projects using ${e} methodology`,
79
+ projectsCount: t.projects.length,
80
+ leadId: Array.from(t.ownerIds)[0] ?? "Unassigned"
81
+ }));
82
+ return /* @__PURE__ */ i("div", {
83
+ className: "space-y-6 p-6",
84
+ children: [
85
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("h1", {
86
+ className: "text-2xl font-semibold",
87
+ children: "Team Overview"
88
+ }), /* @__PURE__ */ i("p", {
89
+ className: "text-sm text-muted-foreground",
90
+ children: [
91
+ b.length,
92
+ " contributors across ",
93
+ S.length,
94
+ " teams"
95
+ ]
96
+ })] }),
97
+ /* @__PURE__ */ i("div", {
98
+ className: "space-y-4",
99
+ children: [/* @__PURE__ */ r("h2", {
100
+ className: "text-lg font-medium",
101
+ children: "Teams"
102
+ }), /* @__PURE__ */ i("div", {
103
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
104
+ children: [S.map((e) => /* @__PURE__ */ i(o, { children: [/* @__PURE__ */ r(c, {
105
+ className: "pb-2",
106
+ children: /* @__PURE__ */ i("div", {
107
+ className: "flex items-center justify-between",
108
+ children: [/* @__PURE__ */ r(l, {
109
+ className: "text-base",
110
+ children: e.name
111
+ }), /* @__PURE__ */ i(a, {
112
+ variant: "outline",
113
+ children: [e.projectsCount, " projects"]
114
+ })]
115
+ })
116
+ }), /* @__PURE__ */ i(s, { children: [/* @__PURE__ */ r("p", {
117
+ className: "text-sm text-muted-foreground",
118
+ children: e.description
119
+ }), /* @__PURE__ */ i("p", {
120
+ className: "text-xs text-muted-foreground mt-2",
121
+ children: ["Lead: ", e.leadId]
122
+ })] })] }, e.id)), S.length === 0 && /* @__PURE__ */ r("p", {
123
+ className: "text-sm text-muted-foreground col-span-2 text-center py-4",
124
+ children: "No teams found. Create projects to see team groupings."
125
+ })]
126
+ })]
127
+ }),
128
+ /* @__PURE__ */ i("div", {
129
+ className: "space-y-4",
130
+ children: [/* @__PURE__ */ r("h2", {
131
+ className: "text-lg font-medium",
132
+ children: "Members"
133
+ }), /* @__PURE__ */ i("div", {
134
+ className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
135
+ children: [b.map((e) => /* @__PURE__ */ r(o, { children: /* @__PURE__ */ i(s, {
136
+ className: "pt-4 space-y-3",
137
+ children: [
138
+ /* @__PURE__ */ i("div", {
139
+ className: "flex items-center gap-3",
140
+ children: [/* @__PURE__ */ i("div", {
141
+ className: "relative",
142
+ children: [/* @__PURE__ */ r("div", {
143
+ className: "h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center text-sm font-medium text-primary",
144
+ children: e.name.split(/[\s-]+/).slice(0, 2).map((e) => e[0]?.toUpperCase() ?? "").join("")
145
+ }), /* @__PURE__ */ r("div", { className: `absolute -bottom-0.5 -right-0.5 h-3 w-3 rounded-full border-2 border-background ${d[e.status]}` })]
146
+ }), /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("p", {
147
+ className: "text-sm font-medium",
148
+ children: e.name
149
+ }), /* @__PURE__ */ r("p", {
150
+ className: "text-xs text-muted-foreground",
151
+ children: e.role
152
+ })] })]
153
+ }),
154
+ /* @__PURE__ */ i("div", {
155
+ className: "grid grid-cols-3 gap-2 text-center text-xs",
156
+ children: [
157
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("p", {
158
+ className: "font-semibold",
159
+ children: e.tasksAssigned
160
+ }), /* @__PURE__ */ r("p", {
161
+ className: "text-muted-foreground",
162
+ children: "Assigned"
163
+ })] }),
164
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("p", {
165
+ className: "font-semibold",
166
+ children: e.tasksCompleted
167
+ }), /* @__PURE__ */ r("p", {
168
+ className: "text-muted-foreground",
169
+ children: "Done"
170
+ })] }),
171
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("p", {
172
+ className: "font-semibold",
173
+ children: e.velocity
174
+ }), /* @__PURE__ */ r("p", {
175
+ className: "text-muted-foreground",
176
+ children: "Velocity"
177
+ })] })
178
+ ]
179
+ }),
180
+ /* @__PURE__ */ i("div", {
181
+ className: "flex justify-between text-xs",
182
+ children: [/* @__PURE__ */ r("span", {
183
+ className: "text-muted-foreground",
184
+ children: e.department
185
+ }), /* @__PURE__ */ r("span", {
186
+ className: "capitalize text-muted-foreground",
187
+ children: e.status
188
+ })]
189
+ })
190
+ ]
191
+ }) }, e.id)), b.length === 0 && /* @__PURE__ */ r("p", {
192
+ className: "text-sm text-muted-foreground col-span-3 text-center py-4",
193
+ children: "No team members found. Assign work items to see members here."
194
+ })]
195
+ })]
196
+ })
197
+ ]
198
+ });
199
+ }
200
+ //#endregion
201
+ export { f as TeamTeamPagePage };
202
+
203
+ //# sourceMappingURL=TeamTeamPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamTeamPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TeamTeamPagePage.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 { Users } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_TEAM_DATA = gql`\n query GetTeamData(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $workItemPagination: PaginationInput\n ) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {\n items {\n id\n name\n key\n status\n ownerId\n methodology\n }\n totalCount\n }\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: $workItemPagination) {\n items {\n id\n status\n assigneeId\n storyPoints\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n ownerId: string | null;\n methodology: string | null;\n}\n\ninterface WorkItemNode {\n id: string;\n status: string;\n assigneeId: string | null;\n storyPoints: number | null;\n}\n\ninterface TeamData {\n projects: { items: ProjectNode[]; totalCount: number };\n workItems: { items: WorkItemNode[]; totalCount: number };\n}\n\nconst statusColor: Record<string, string> = {\n active: 'bg-green-400',\n away: 'bg-yellow-400',\n busy: 'bg-red-400',\n offline: 'bg-gray-300',\n};\n\nexport function TeamTeamPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const { data, loading, error } = useQuery<TeamData>(GET_TEAM_DATA, {\n variables: {\n workspaceId,\n projectPagination: { first: 100 },\n workItemPagination: { first: 500 },\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 workItems = data?.planmagnetWorkItems?.items ?? [];\n\n const assigneeIds = new Set(\n workItems.filter((wi) => wi.assigneeId).map((wi) => wi.assigneeId as string)\n );\n const ownerIds = new Set(projects.filter((p) => p.ownerId).map((p) => p.ownerId as string));\n const allMemberIds = new Set([...assigneeIds, ...ownerIds]);\n\n const members = Array.from(allMemberIds).map((memberId) => {\n const memberWorkItems = workItems.filter((wi) => wi.assigneeId === memberId);\n const assigned = memberWorkItems.length;\n const completed = memberWorkItems.filter((wi) => wi.status === 'DONE').length;\n const velocity = memberWorkItems\n .filter((wi) => wi.status === 'DONE')\n .reduce((s, wi) => s + (wi.storyPoints ?? 0), 0);\n const memberProjects = projects.filter((p) => p.ownerId === memberId);\n\n return {\n id: memberId,\n name: memberId,\n role: memberProjects.length > 0 ? 'Project Owner' : 'Contributor',\n department: 'Engineering',\n tasksAssigned: assigned,\n tasksCompleted: completed,\n velocity,\n status: assigned > 0 ? 'active' : 'offline',\n };\n });\n\n const teamsByMethodology = projects.reduce(\n (acc, p) => {\n const method = p.methodology ?? 'unassigned';\n if (!acc[method]) {\n acc[method] = { projects: [], ownerIds: new Set<string>() };\n }\n acc[method].projects.push(p);\n if (p.ownerId) acc[method].ownerIds.add(p.ownerId);\n return acc;\n },\n {} as Record<string, { projects: ProjectNode[]; ownerIds: Set<string> }>\n );\n\n const teams = Object.entries(teamsByMethodology).map(([methodology, group]) => ({\n id: methodology,\n name: `${methodology.charAt(0).toUpperCase()}${methodology.slice(1)} Team`,\n description: `Projects using ${methodology} methodology`,\n projectsCount: group.projects.length,\n leadId: Array.from(group.ownerIds)[0] ?? 'Unassigned',\n }));\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Team Overview</h1>\n <p className=\"text-sm text-muted-foreground\">\n {members.length} contributors across {teams.length} teams\n </p>\n </div>\n\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Teams</h2>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {teams.map((team) => (\n <Card key={team.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{team.name}</CardTitle>\n <Badge variant=\"outline\">{team.projectsCount} projects</Badge>\n </div>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-muted-foreground\">{team.description}</p>\n <p className=\"text-xs text-muted-foreground mt-2\">Lead: {team.leadId}</p>\n </CardContent>\n </Card>\n ))}\n {teams.length === 0 && (\n <p className=\"text-sm text-muted-foreground col-span-2 text-center py-4\">\n No teams found. Create projects to see team groupings.\n </p>\n )}\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Members</h2>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {members.map((member) => (\n <Card key={member.id}>\n <CardContent className=\"pt-4 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center text-sm font-medium text-primary\">\n {member.name\n .split(/[\\s-]+/)\n .slice(0, 2)\n .map((n) => n[0]?.toUpperCase() ?? '')\n .join('')}\n </div>\n <div\n className={`absolute -bottom-0.5 -right-0.5 h-3 w-3 rounded-full border-2 border-background ${statusColor[member.status]}`}\n />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{member.name}</p>\n <p className=\"text-xs text-muted-foreground\">{member.role}</p>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-center text-xs\">\n <div>\n <p className=\"font-semibold\">{member.tasksAssigned}</p>\n <p className=\"text-muted-foreground\">Assigned</p>\n </div>\n <div>\n <p className=\"font-semibold\">{member.tasksCompleted}</p>\n <p className=\"text-muted-foreground\">Done</p>\n </div>\n <div>\n <p className=\"font-semibold\">{member.velocity}</p>\n <p className=\"text-muted-foreground\">Velocity</p>\n </div>\n </div>\n <div className=\"flex justify-between text-xs\">\n <span className=\"text-muted-foreground\">{member.department}</span>\n <span className=\"capitalize text-muted-foreground\">{member.status}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n {members.length === 0 && (\n <p className=\"text-sm text-muted-foreground col-span-3 text-center py-4\">\n No team members found. Assign work items to see members here.\n </p>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function WorkspaceCreateWorkspacePagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=WorkspaceCreateWorkspacePagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceCreateWorkspacePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/WorkspaceCreateWorkspacePagePage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,gCAAgC,4CAmF/C"}
@@ -0,0 +1,97 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { useState as n } from "react";
3
+ import { Building2 as r, Save as i, X as a } from "lucide-react";
4
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
+ import { Button as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, Input as p } from "@burdenoff/fe-libs/ui";
6
+ //#region src/planmagnet/pages/WorkspaceCreateWorkspacePagePage.tsx
7
+ function m() {
8
+ let { workspaceId: m } = e(), h = t(), [g, _] = n({
9
+ name: "",
10
+ description: "",
11
+ slug: ""
12
+ });
13
+ return /* @__PURE__ */ s("div", {
14
+ className: "space-y-6 p-6 max-w-4xl",
15
+ children: [/* @__PURE__ */ s("div", {
16
+ className: "flex items-center justify-between",
17
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
18
+ className: "text-2xl font-semibold",
19
+ children: "Create Workspace"
20
+ }), /* @__PURE__ */ o("p", {
21
+ className: "text-sm text-muted-foreground",
22
+ children: "Set up a new workspace for your organization."
23
+ })] }), /* @__PURE__ */ s("div", {
24
+ className: "flex gap-2",
25
+ children: [/* @__PURE__ */ s(c, {
26
+ variant: "outline",
27
+ size: "sm",
28
+ onClick: () => h("/"),
29
+ children: [/* @__PURE__ */ o(a, { className: "mr-1 h-4 w-4" }), "Cancel"]
30
+ }), /* @__PURE__ */ s(c, {
31
+ size: "sm",
32
+ onClick: () => {
33
+ g.name.trim() && h("/");
34
+ },
35
+ children: [/* @__PURE__ */ o(i, { className: "mr-1 h-4 w-4" }), "Create Workspace"]
36
+ })]
37
+ })]
38
+ }), /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ s(f, {
39
+ className: "flex items-center gap-2",
40
+ children: [/* @__PURE__ */ o(r, { className: "h-4 w-4" }), "Workspace Details"]
41
+ }) }), /* @__PURE__ */ s(u, {
42
+ className: "space-y-4",
43
+ children: [
44
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
45
+ className: "text-sm font-medium",
46
+ children: "Workspace Name"
47
+ }), /* @__PURE__ */ o(p, {
48
+ value: g.name,
49
+ onChange: (e) => _({
50
+ ...g,
51
+ name: e.target.value,
52
+ slug: e.target.value.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "")
53
+ }),
54
+ className: "mt-1",
55
+ placeholder: "e.g. PlanMagnet HQ"
56
+ })] }),
57
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
58
+ className: "text-sm font-medium",
59
+ children: "URL Slug"
60
+ }), /* @__PURE__ */ s("div", {
61
+ className: "mt-1 flex items-center gap-1",
62
+ children: [/* @__PURE__ */ o("span", {
63
+ className: "text-sm text-muted-foreground",
64
+ children: "planmagnet.com/"
65
+ }), /* @__PURE__ */ o(p, {
66
+ value: g.slug,
67
+ onChange: (e) => _({
68
+ ...g,
69
+ slug: e.target.value
70
+ }),
71
+ placeholder: "planmagnet-hq"
72
+ })]
73
+ })] }),
74
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
75
+ className: "text-sm font-medium",
76
+ children: "Description"
77
+ }), /* @__PURE__ */ o("textarea", {
78
+ className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]",
79
+ value: g.description,
80
+ onChange: (e) => _({
81
+ ...g,
82
+ description: e.target.value
83
+ }),
84
+ placeholder: "Describe what this workspace is for..."
85
+ })] }),
86
+ m && /* @__PURE__ */ s("p", {
87
+ className: "text-xs text-muted-foreground",
88
+ children: ["Current workspace: ", m]
89
+ })
90
+ ]
91
+ })] })]
92
+ });
93
+ }
94
+ //#endregion
95
+ export { m as WorkspaceCreateWorkspacePagePage };
96
+
97
+ //# sourceMappingURL=WorkspaceCreateWorkspacePagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceCreateWorkspacePagePage.js","names":[],"sources":["../../../src/planmagnet/pages/WorkspaceCreateWorkspacePagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, Building2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nexport function WorkspaceCreateWorkspacePagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [form, setForm] = useState({ name: '', description: '', slug: '' });\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n navigate('/');\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\">Create Workspace</h1>\n <p className=\"text-sm text-muted-foreground\">\n Set up a new workspace for your organization.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleCreate}>\n <Save className=\"mr-1 h-4 w-4\" />\n Create Workspace\n </Button>\n </div>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4\" />\n Workspace Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Workspace Name</label>\n <Input\n value={form.name}\n onChange={(e) =>\n setForm({\n ...form,\n name: e.target.value,\n slug: e.target.value\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, ''),\n })\n }\n className=\"mt-1\"\n placeholder=\"e.g. PlanMagnet HQ\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">URL Slug</label>\n <div className=\"mt-1 flex items-center gap-1\">\n <span className=\"text-sm text-muted-foreground\">planmagnet.com/</span>\n <Input\n value={form.slug}\n onChange={(e) => setForm({ ...form, slug: e.target.value })}\n placeholder=\"planmagnet-hq\"\n />\n </div>\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-[80px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"Describe what this workspace is for...\"\n />\n </div>\n {workspaceId && (\n <p className=\"text-xs text-muted-foreground\">Current workspace: {workspaceId}</p>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,IAAmC;CACjD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAClC,CAAC,GAAM,KAAW,EAAS;EAAE,MAAM;EAAI,aAAa;EAAI,MAAM;EAAI,CAAC;AAOzE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAqB,CAAA,EAC5D,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,IAAI;eAAhE,CACE,kBAAC,GAAD,EAAG,WAAU,gBAAiB,CAAA,EAAA,SAEvB;QACT,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAnBC;AACpB,QAAK,KAAK,MAAM,IACrB,EAAS,IAAI;;eAiBP,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,mBAE1B;OACL;MACF;MACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,oBAEvB;MACD,CAAA,EACb,kBAAC,GAAD;GAAa,WAAU;aAAvB;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAsB,CAAA,EAC7D,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,MACT,EAAQ;MACN,GAAG;MACH,MAAM,EAAE,OAAO;MACf,MAAM,EAAE,OAAO,MACZ,aAAa,CACb,QAAQ,QAAQ,IAAI,CACpB,QAAQ,eAAe,GAAG;MAC9B,CAAC;KAEJ,WAAU;KACV,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAgB,CAAA,EACvD,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD;MAAM,WAAU;gBAAgC;MAAsB,CAAA,EACtE,kBAAC,GAAD;MACE,OAAO,EAAK;MACZ,WAAW,MAAM,EAAQ;OAAE,GAAG;OAAM,MAAM,EAAE,OAAO;OAAO,CAAC;MAC3D,aAAY;MACZ,CAAA,CACE;OACF,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAmB,CAAA,EAC1D,kBAAC,YAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,aAAa,EAAE,OAAO;MAAO,CAAC;KAClE,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACL,KACC,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA6C,uBAAoB,EAAgB;;IAEvE;KACT,EAAA,CAAA,CACH"}
@@ -0,0 +1,31 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ import { PlanMagnetRootProps } from '../types';
3
+
4
+ /**
5
+ * Hook to access PlanMagnet context
6
+ */
7
+ export declare const usePlanMagnet: () => PlanMagnetRootProps;
8
+ /**
9
+ * Hook for navigation within the PlanMagnet microfrontend.
10
+ * Uses the shell's navigate function if available, falling back to
11
+ * React Router's useNavigate. Automatically prepends basePath.
12
+ *
13
+ * Usage:
14
+ * const navigate = usePlanMagnetNavigate();
15
+ * navigate('/products/123'); // navigates to /planmagnet/products/123
16
+ */
17
+ export declare const usePlanMagnetNavigate: () => (path: string) => void;
18
+ /**
19
+ * Provider component for PlanMagnet microfrontend.
20
+ * Sets up routing, Apollo Client with auth error detection, and context.
21
+ *
22
+ * The Apollo Client is configured with:
23
+ * - An onError link that detects UNAUTHENTICATED / FORBIDDEN responses and
24
+ * invokes the `onAuthError` prop so the host shell can trigger logout.
25
+ * - A dynamic auth link that reads the token per-request (not baked in at
26
+ * client creation time), so token refreshes take effect immediately.
27
+ * - InMemoryCache with type policies for proper cache normalization.
28
+ * - Default fetch policy: cache-and-network.
29
+ */
30
+ export declare const PlanMagnetProvider: FC<PropsWithChildren<PlanMagnetRootProps>>;
31
+ //# sourceMappingURL=PlanMagnetProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanMagnetProvider.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/providers/PlanMagnetProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AASnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAoBpD;;GAEG;AACH,eAAO,MAAM,aAAa,2BAMzB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,eAKvB,MAAM,SAUhB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CA8HzE,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { CombinedGraphQLErrors as e } from "../../node_modules/@apollo/client/errors/CombinedGraphQLErrors.js";
2
+ import { createContext as t, useCallback as n, useContext as r, useMemo as i } from "react";
3
+ import { MemoryRouter as a, useNavigate as o } from "react-router-dom";
4
+ import { ApolloClient as s, HttpLink as c, InMemoryCache as l, from as u } from "@apollo/client";
5
+ import { onError as d } from "@apollo/client/link/error";
6
+ import { setContext as f } from "@apollo/client/link/context";
7
+ import { ApolloProvider as p } from "@apollo/client/react";
8
+ import { QueryClient as m, QueryClientProvider as h } from "@tanstack/react-query";
9
+ import { jsx as g } from "react/jsx-runtime";
10
+ //#region src/planmagnet/providers/PlanMagnetProvider.tsx
11
+ var _ = new m({ defaultOptions: { queries: {
12
+ staleTime: 300 * 1e3,
13
+ retry: 1,
14
+ refetchOnWindowFocus: !1
15
+ } } }), v = t(null), y = () => {
16
+ let e = r(v);
17
+ if (!e) throw Error("usePlanMagnet must be used within PlanMagnetProvider");
18
+ return e;
19
+ }, b = () => {
20
+ let { navigate: e, basePath: t } = y(), r = o();
21
+ return n((n) => {
22
+ let i = t && t !== "/" ? `${t}${n}` : n;
23
+ e ? e(i) : r(i);
24
+ }, [
25
+ e,
26
+ t,
27
+ r
28
+ ]);
29
+ }, x = ({ children: t, basePath: n, navigate: r, currentUser: o, workspaceId: m, tenantId: y, apiGatewayUrl: b, authToken: x, workspaceToken: S, registerNavItems: C, registerFooterItems: w, onAuthError: T }) => {
30
+ let E = i(() => new s({
31
+ link: u([
32
+ d(({ error: t }) => {
33
+ if (e.is(t)) for (let e of t.errors) {
34
+ let t = e.extensions?.code;
35
+ if (t === "UNAUTHENTICATED" || t === "FORBIDDEN") {
36
+ console.warn("[PlanMagnet] Auth error detected — notifying host shell"), T?.();
37
+ return;
38
+ }
39
+ }
40
+ else if (t) {
41
+ let e = t.message ?? "";
42
+ (e.includes("401") || e.includes("403") || e.includes("Unauthorized")) && (console.warn("[PlanMagnet] Auth network error — notifying host shell"), T?.());
43
+ }
44
+ }),
45
+ f((e, { headers: t }) => ({ headers: {
46
+ ...t,
47
+ ...x ? { Authorization: `Bearer ${x}` } : {},
48
+ ...S ? { "X-Workspace-Authorization": `Bearer ${S}` } : {},
49
+ ...m ? { "x-workspace-id": m } : {}
50
+ } })),
51
+ new c({ uri: b ? `${b}/workspaces/graphql` : "/workspaces/graphql" })
52
+ ]),
53
+ cache: new l({ typePolicies: {
54
+ Query: { fields: {
55
+ roadmaps: { merge: !1 },
56
+ featureRequests: { merge: !1 },
57
+ releases: { merge: !1 },
58
+ competitors: { merge: !1 },
59
+ roadmapItems: { merge: !1 },
60
+ projects: { merge: !1 },
61
+ workItems: { merge: !1 },
62
+ sprints: { merge: !1 },
63
+ milestones: { merge: !1 }
64
+ } },
65
+ Roadmap: { keyFields: ["id"] },
66
+ RoadmapItem: { keyFields: ["id"] },
67
+ Release: { keyFields: ["id"] },
68
+ FeatureRequest: { keyFields: ["id"] },
69
+ FeatureVote: { keyFields: ["id"] },
70
+ Competitor: { keyFields: ["id"] },
71
+ Project: { keyFields: ["id"] },
72
+ WorkItem: { keyFields: ["id"] },
73
+ Sprint: { keyFields: ["id"] },
74
+ Milestone: { keyFields: ["id"] },
75
+ Team: { keyFields: ["id"] },
76
+ TeamMember: { keyFields: ["id"] }
77
+ } }),
78
+ defaultOptions: {
79
+ watchQuery: {
80
+ fetchPolicy: "cache-and-network",
81
+ errorPolicy: "all"
82
+ },
83
+ query: { errorPolicy: "all" },
84
+ mutate: { errorPolicy: "all" }
85
+ }
86
+ }), [
87
+ b,
88
+ x,
89
+ S,
90
+ m,
91
+ T
92
+ ]), D = {
93
+ basePath: n,
94
+ navigate: r,
95
+ currentUser: o,
96
+ workspaceId: m,
97
+ tenantId: y,
98
+ apiGatewayUrl: b,
99
+ authToken: x,
100
+ workspaceToken: S,
101
+ registerNavItems: C,
102
+ registerFooterItems: w,
103
+ onAuthError: T
104
+ }, O = !!n, k = /* @__PURE__ */ g(h, {
105
+ client: _,
106
+ children: /* @__PURE__ */ g(v.Provider, {
107
+ value: D,
108
+ children: t
109
+ })
110
+ });
111
+ return O ? k : /* @__PURE__ */ g(p, {
112
+ client: E,
113
+ children: /* @__PURE__ */ g(a, { children: k })
114
+ });
115
+ };
116
+ //#endregion
117
+ export { x as PlanMagnetProvider, y as usePlanMagnet, b as usePlanMagnetNavigate };
118
+
119
+ //# sourceMappingURL=PlanMagnetProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanMagnetProvider.js","names":[],"sources":["../../../src/planmagnet/providers/PlanMagnetProvider.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router-dom';\nimport { ApolloClient, InMemoryCache, HttpLink, from } from '@apollo/client';\nimport { onError } from '@apollo/client/link/error';\nimport { CombinedGraphQLErrors } from '@apollo/client/errors';\nimport { setContext } from '@apollo/client/link/context';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport type { PlanMagnetRootProps } from '../types';\n\n// Create a shared QueryClient for React Query (retained for any REST/non-GraphQL needs)\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\n/**\n * Context value for PlanMagnet microfrontend\n */\ntype PlanMagnetContextValue = PlanMagnetRootProps;\n\nconst PlanMagnetContext = createContext<PlanMagnetContextValue | null>(null);\n\n/**\n * Hook to access PlanMagnet context\n */\nexport const usePlanMagnet = () => {\n const context = useContext(PlanMagnetContext);\n if (!context) {\n throw new Error('usePlanMagnet must be used within PlanMagnetProvider');\n }\n return context;\n};\n\n/**\n * Hook for navigation within the PlanMagnet microfrontend.\n * Uses the shell's navigate function if available, falling back to\n * React Router's useNavigate. Automatically prepends basePath.\n *\n * Usage:\n * const navigate = usePlanMagnetNavigate();\n * navigate('/products/123'); // navigates to /planmagnet/products/123\n */\nexport const usePlanMagnetNavigate = () => {\n const { navigate: shellNavigate, basePath } = usePlanMagnet();\n const routerNavigate = useRouterNavigate();\n\n return useCallback(\n (path: string) => {\n const fullPath = basePath && basePath !== '/' ? `${basePath}${path}` : path;\n if (shellNavigate) {\n shellNavigate(fullPath);\n } else {\n routerNavigate(fullPath);\n }\n },\n [shellNavigate, basePath, routerNavigate]\n );\n};\n\n/**\n * Provider component for PlanMagnet microfrontend.\n * Sets up routing, Apollo Client with auth error detection, and context.\n *\n * The Apollo Client is configured with:\n * - An onError link that detects UNAUTHENTICATED / FORBIDDEN responses and\n * invokes the `onAuthError` prop so the host shell can trigger logout.\n * - A dynamic auth link that reads the token per-request (not baked in at\n * client creation time), so token refreshes take effect immediately.\n * - InMemoryCache with type policies for proper cache normalization.\n * - Default fetch policy: cache-and-network.\n */\nexport const PlanMagnetProvider: FC<PropsWithChildren<PlanMagnetRootProps>> = ({\n children,\n basePath,\n navigate,\n currentUser,\n workspaceId,\n tenantId,\n apiGatewayUrl,\n authToken,\n workspaceToken,\n registerNavItems,\n registerFooterItems,\n onAuthError,\n}) => {\n // Build Apollo Client with error link + dynamic auth link\n const apolloClient = useMemo(() => {\n // Error link (Apollo v4 pattern): detect authentication failures\n const errorLink = onError(({ error }) => {\n if (CombinedGraphQLErrors.is(error)) {\n for (const graphQLError of error.errors) {\n const code = graphQLError.extensions?.code;\n if (code === 'UNAUTHENTICATED' || code === 'FORBIDDEN') {\n console.warn('[PlanMagnet] Auth error detected — notifying host shell');\n onAuthError?.();\n return; // Only fire once per batch\n }\n }\n } else if (error) {\n // Network-level errors (e.g., gateway returning 401/403 as non-JSON)\n const msg = error.message ?? '';\n if (msg.includes('401') || msg.includes('403') || msg.includes('Unauthorized')) {\n console.warn('[PlanMagnet] Auth network error — notifying host shell');\n onAuthError?.();\n }\n }\n });\n\n // Auth link: dynamically attach dual-token auth and workspace context per-request.\n // The workspace gateway requires:\n // Authorization: Bearer <authToken> (platform identity)\n // X-Workspace-Authorization: Bearer <workspaceToken> (workspace access)\n const authLink = setContext((_, { headers }) => ({\n headers: {\n ...headers,\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n ...(workspaceToken ? { 'X-Workspace-Authorization': `Bearer ${workspaceToken}` } : {}),\n ...(workspaceId ? { 'x-workspace-id': workspaceId } : {}),\n },\n }));\n\n const httpLink = new HttpLink({\n uri: apiGatewayUrl ? `${apiGatewayUrl}/workspaces/graphql` : '/workspaces/graphql',\n });\n\n return new ApolloClient({\n link: from([errorLink, authLink, httpLink]),\n cache: new InMemoryCache({\n typePolicies: {\n Query: {\n fields: {\n // Merge paginated results for common list queries\n roadmaps: { merge: false },\n featureRequests: { merge: false },\n releases: { merge: false },\n competitors: { merge: false },\n roadmapItems: { merge: false },\n projects: { merge: false },\n workItems: { merge: false },\n sprints: { merge: false },\n milestones: { merge: false },\n },\n },\n Roadmap: { keyFields: ['id'] },\n RoadmapItem: { keyFields: ['id'] },\n Release: { keyFields: ['id'] },\n FeatureRequest: { keyFields: ['id'] },\n FeatureVote: { keyFields: ['id'] },\n Competitor: { keyFields: ['id'] },\n Project: { keyFields: ['id'] },\n WorkItem: { keyFields: ['id'] },\n Sprint: { keyFields: ['id'] },\n Milestone: { keyFields: ['id'] },\n Team: { keyFields: ['id'] },\n TeamMember: { keyFields: ['id'] },\n },\n }),\n defaultOptions: {\n watchQuery: { fetchPolicy: 'cache-and-network', errorPolicy: 'all' },\n query: { errorPolicy: 'all' },\n mutate: { errorPolicy: 'all' },\n },\n });\n }, [apiGatewayUrl, authToken, workspaceToken, workspaceId, onAuthError]);\n\n const contextValue: PlanMagnetContextValue = {\n basePath,\n navigate,\n currentUser,\n workspaceId,\n tenantId,\n apiGatewayUrl,\n authToken,\n workspaceToken,\n registerNavItems,\n registerFooterItems,\n onAuthError,\n };\n\n const isIntegrated = !!basePath;\n\n // Core providers that wrap the children\n const content = (\n <QueryClientProvider client={queryClient}>\n <PlanMagnetContext.Provider value={contextValue}>{children}</PlanMagnetContext.Provider>\n </QueryClientProvider>\n );\n\n // When integrated into a shell (basePath provided), the shell already has a router and ApolloProvider\n // so we don't create another one. When standalone (no basePath), use MemoryRouter and ApolloProvider.\n return isIntegrated ? (\n content\n ) : (\n <ApolloProvider client={apolloClient}>\n <MemoryRouter>{content}</MemoryRouter>\n </ApolloProvider>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ interface PlanMagnetUIState {
2
+ selectedView: 'board' | 'list' | 'timeline' | 'calendar';
3
+ sidebarCollapsed: boolean;
4
+ activeProjectId: string | null;
5
+ activeBoardId: string | null;
6
+ activeSprintId: string | null;
7
+ taskFilters: {
8
+ status: string | null;
9
+ priority: string | null;
10
+ assignee: string | null;
11
+ type: string | null;
12
+ search: string;
13
+ };
14
+ projectFilters: {
15
+ status: string | null;
16
+ methodology: string | null;
17
+ search: string;
18
+ };
19
+ setSelectedView: (view: 'board' | 'list' | 'timeline' | 'calendar') => void;
20
+ setSidebarCollapsed: (collapsed: boolean) => void;
21
+ setActiveProjectId: (id: string | null) => void;
22
+ setActiveBoardId: (id: string | null) => void;
23
+ setActiveSprintId: (id: string | null) => void;
24
+ setTaskFilter: (key: string, value: string | null) => void;
25
+ setProjectFilter: (key: string, value: string | null) => void;
26
+ resetFilters: () => void;
27
+ }
28
+ export declare const usePlanMagnetStore: import('zustand').UseBoundStore<import('zustand').StoreApi<PlanMagnetUIState>>;
29
+ export {};
30
+ //# sourceMappingURL=planmagnetStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planmagnetStore.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/store/planmagnetStore.ts"],"names":[],"mappings":"AAEA,UAAU,iBAAiB;IAEzB,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAG1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAG9B,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC;IAC5E,mBAAmB,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9D,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAgBD,eAAO,MAAM,kBAAkB,gFA2B5B,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { create as e } from "zustand";
2
+ //#region src/planmagnet/store/planmagnetStore.ts
3
+ var t = {
4
+ status: null,
5
+ priority: null,
6
+ assignee: null,
7
+ type: null,
8
+ search: ""
9
+ }, n = {
10
+ status: null,
11
+ methodology: null,
12
+ search: ""
13
+ }, r = e((e) => ({
14
+ selectedView: "board",
15
+ sidebarCollapsed: !1,
16
+ activeProjectId: null,
17
+ activeBoardId: null,
18
+ activeSprintId: null,
19
+ taskFilters: { ...t },
20
+ projectFilters: { ...n },
21
+ setSelectedView: (t) => e({ selectedView: t }),
22
+ setSidebarCollapsed: (t) => e({ sidebarCollapsed: t }),
23
+ setActiveProjectId: (t) => e({ activeProjectId: t }),
24
+ setActiveBoardId: (t) => e({ activeBoardId: t }),
25
+ setActiveSprintId: (t) => e({ activeSprintId: t }),
26
+ setTaskFilter: (t, n) => e((e) => ({ taskFilters: {
27
+ ...e.taskFilters,
28
+ [t]: n
29
+ } })),
30
+ setProjectFilter: (t, n) => e((e) => ({ projectFilters: {
31
+ ...e.projectFilters,
32
+ [t]: n
33
+ } })),
34
+ resetFilters: () => e({
35
+ taskFilters: { ...t },
36
+ projectFilters: { ...n }
37
+ })
38
+ }));
39
+ //#endregion
40
+ export { r as usePlanMagnetStore };
41
+
42
+ //# sourceMappingURL=planmagnetStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planmagnetStore.js","names":[],"sources":["../../../src/planmagnet/store/planmagnetStore.ts"],"sourcesContent":["import { create } from 'zustand';\n\ninterface PlanMagnetUIState {\n // View preferences\n selectedView: 'board' | 'list' | 'timeline' | 'calendar';\n sidebarCollapsed: boolean;\n\n // Active context\n activeProjectId: string | null;\n activeBoardId: string | null;\n activeSprintId: string | null;\n\n // Filter state\n taskFilters: {\n status: string | null;\n priority: string | null;\n assignee: string | null;\n type: string | null;\n search: string;\n };\n\n projectFilters: {\n status: string | null;\n methodology: string | null;\n search: string;\n };\n\n // Actions\n setSelectedView: (view: 'board' | 'list' | 'timeline' | 'calendar') => void;\n setSidebarCollapsed: (collapsed: boolean) => void;\n setActiveProjectId: (id: string | null) => void;\n setActiveBoardId: (id: string | null) => void;\n setActiveSprintId: (id: string | null) => void;\n setTaskFilter: (key: string, value: string | null) => void;\n setProjectFilter: (key: string, value: string | null) => void;\n resetFilters: () => void;\n}\n\nconst defaultTaskFilters = {\n status: null,\n priority: null,\n assignee: null,\n type: null,\n search: '',\n};\n\nconst defaultProjectFilters = {\n status: null,\n methodology: null,\n search: '',\n};\n\nexport const usePlanMagnetStore = create<PlanMagnetUIState>((set) => ({\n selectedView: 'board',\n sidebarCollapsed: false,\n activeProjectId: null,\n activeBoardId: null,\n activeSprintId: null,\n taskFilters: { ...defaultTaskFilters },\n projectFilters: { ...defaultProjectFilters },\n\n setSelectedView: (view) => set({ selectedView: view }),\n setSidebarCollapsed: (collapsed) => set({ sidebarCollapsed: collapsed }),\n setActiveProjectId: (id) => set({ activeProjectId: id }),\n setActiveBoardId: (id) => set({ activeBoardId: id }),\n setActiveSprintId: (id) => set({ activeSprintId: id }),\n setTaskFilter: (key, value) =>\n set((state) => ({\n taskFilters: { ...state.taskFilters, [key]: value },\n })),\n setProjectFilter: (key, value) =>\n set((state) => ({\n projectFilters: { ...state.projectFilters, [key]: value },\n })),\n resetFilters: () =>\n set({\n taskFilters: { ...defaultTaskFilters },\n projectFilters: { ...defaultProjectFilters },\n }),\n}));\n"],"mappings":";;AAsCA,IAAM,IAAqB;CACzB,QAAQ;CACR,UAAU;CACV,UAAU;CACV,MAAM;CACN,QAAQ;CACT,EAEK,IAAwB;CAC5B,QAAQ;CACR,aAAa;CACb,QAAQ;CACT,EAEY,IAAqB,GAA2B,OAAS;CACpE,cAAc;CACd,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,gBAAgB;CAChB,aAAa,EAAE,GAAG,GAAoB;CACtC,gBAAgB,EAAE,GAAG,GAAuB;CAE5C,kBAAkB,MAAS,EAAI,EAAE,cAAc,GAAM,CAAC;CACtD,sBAAsB,MAAc,EAAI,EAAE,kBAAkB,GAAW,CAAC;CACxE,qBAAqB,MAAO,EAAI,EAAE,iBAAiB,GAAI,CAAC;CACxD,mBAAmB,MAAO,EAAI,EAAE,eAAe,GAAI,CAAC;CACpD,oBAAoB,MAAO,EAAI,EAAE,gBAAgB,GAAI,CAAC;CACtD,gBAAgB,GAAK,MACnB,GAAK,OAAW,EACd,aAAa;EAAE,GAAG,EAAM;GAAc,IAAM;EAAO,EACpD,EAAE;CACL,mBAAmB,GAAK,MACtB,GAAK,OAAW,EACd,gBAAgB;EAAE,GAAG,EAAM;GAAiB,IAAM;EAAO,EAC1D,EAAE;CACL,oBACE,EAAI;EACF,aAAa,EAAE,GAAG,GAAoB;EACtC,gBAAgB,EAAE,GAAG,GAAuB;EAC7C,CAAC;CACL,EAAE"}