@burdenoff/microfe-planmagnet 2026.928.3 → 2026.928.5

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 (245) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +126 -84
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoutes.js +192 -64
  6. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  7. package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts +5 -0
  8. package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts.map +1 -0
  9. package/dist/planmagnet/automation/AutomationExecutionsPanel.js +107 -0
  10. package/dist/planmagnet/automation/AutomationExecutionsPanel.js.map +1 -0
  11. package/dist/planmagnet/automation/AutomationRuleFields.d.ts +29 -0
  12. package/dist/planmagnet/automation/AutomationRuleFields.d.ts.map +1 -0
  13. package/dist/planmagnet/automation/AutomationRuleFields.js +308 -0
  14. package/dist/planmagnet/automation/AutomationRuleFields.js.map +1 -0
  15. package/dist/planmagnet/automation/automationRuleTypes.d.ts +60 -0
  16. package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -0
  17. package/dist/planmagnet/automation/automationRuleTypes.js +113 -0
  18. package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -0
  19. package/dist/planmagnet/board/BulkActions.d.ts +11 -0
  20. package/dist/planmagnet/board/BulkActions.d.ts.map +1 -0
  21. package/dist/planmagnet/board/BulkActions.js +182 -0
  22. package/dist/planmagnet/board/BulkActions.js.map +1 -0
  23. package/dist/planmagnet/board/ProjectBoard.d.ts.map +1 -1
  24. package/dist/planmagnet/board/ProjectBoard.js +289 -254
  25. package/dist/planmagnet/board/ProjectBoard.js.map +1 -1
  26. package/dist/planmagnet/budgets/BudgetControls.d.ts +30 -0
  27. package/dist/planmagnet/budgets/BudgetControls.d.ts.map +1 -0
  28. package/dist/planmagnet/budgets/BudgetControls.js +470 -0
  29. package/dist/planmagnet/budgets/BudgetControls.js.map +1 -0
  30. package/dist/planmagnet/budgets/ExpenseControls.d.ts +27 -0
  31. package/dist/planmagnet/budgets/ExpenseControls.d.ts.map +1 -0
  32. package/dist/planmagnet/budgets/ExpenseControls.js +366 -0
  33. package/dist/planmagnet/budgets/ExpenseControls.js.map +1 -0
  34. package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts +5 -0
  35. package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts.map +1 -0
  36. package/dist/planmagnet/budgets/ProjectBudgetsSummary.js +112 -0
  37. package/dist/planmagnet/budgets/ProjectBudgetsSummary.js.map +1 -0
  38. package/dist/planmagnet/budgets/budgetMath.d.ts +26 -0
  39. package/dist/planmagnet/budgets/budgetMath.d.ts.map +1 -0
  40. package/dist/planmagnet/budgets/budgetMath.js +49 -0
  41. package/dist/planmagnet/budgets/budgetMath.js.map +1 -0
  42. package/dist/planmagnet/controls/AutomationRuleControls.d.ts +23 -0
  43. package/dist/planmagnet/controls/AutomationRuleControls.d.ts.map +1 -0
  44. package/dist/planmagnet/controls/AutomationRuleControls.js +172 -0
  45. package/dist/planmagnet/controls/AutomationRuleControls.js.map +1 -0
  46. package/dist/planmagnet/controls/CompetitorControls.d.ts +20 -0
  47. package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -0
  48. package/dist/planmagnet/controls/CompetitorControls.js +172 -0
  49. package/dist/planmagnet/controls/CompetitorControls.js.map +1 -0
  50. package/dist/planmagnet/controls/CustomFieldControls.d.ts +42 -0
  51. package/dist/planmagnet/controls/CustomFieldControls.d.ts.map +1 -0
  52. package/dist/planmagnet/controls/CustomFieldControls.js +84 -0
  53. package/dist/planmagnet/controls/CustomFieldControls.js.map +1 -0
  54. package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts +8 -0
  55. package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts.map +1 -0
  56. package/dist/planmagnet/controls/CustomFieldValuesPanel.js +315 -0
  57. package/dist/planmagnet/controls/CustomFieldValuesPanel.js.map +1 -0
  58. package/dist/planmagnet/controls/FeatureControls.js +53 -53
  59. package/dist/planmagnet/controls/FeatureTriage.js +11 -11
  60. package/dist/planmagnet/controls/ObjectiveControls.js +37 -37
  61. package/dist/planmagnet/controls/Pickers.d.ts +17 -2
  62. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  63. package/dist/planmagnet/controls/Pickers.js +100 -9
  64. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  65. package/dist/planmagnet/controls/PortfolioControls.d.ts +13 -0
  66. package/dist/planmagnet/controls/PortfolioControls.d.ts.map +1 -0
  67. package/dist/planmagnet/controls/PortfolioControls.js +114 -0
  68. package/dist/planmagnet/controls/PortfolioControls.js.map +1 -0
  69. package/dist/planmagnet/controls/ProgramControls.d.ts +25 -0
  70. package/dist/planmagnet/controls/ProgramControls.d.ts.map +1 -0
  71. package/dist/planmagnet/controls/ProgramControls.js +187 -0
  72. package/dist/planmagnet/controls/ProgramControls.js.map +1 -0
  73. package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -1
  74. package/dist/planmagnet/controls/ProjectControls.js +54 -47
  75. package/dist/planmagnet/controls/ProjectControls.js.map +1 -1
  76. package/dist/planmagnet/controls/ReleaseControls.js +7 -7
  77. package/dist/planmagnet/controls/RiskControls.d.ts +27 -0
  78. package/dist/planmagnet/controls/RiskControls.d.ts.map +1 -0
  79. package/dist/planmagnet/controls/RiskControls.js +346 -0
  80. package/dist/planmagnet/controls/RiskControls.js.map +1 -0
  81. package/dist/planmagnet/controls/TemplateControls.d.ts +15 -0
  82. package/dist/planmagnet/controls/TemplateControls.d.ts.map +1 -0
  83. package/dist/planmagnet/controls/TemplateControls.js +55 -0
  84. package/dist/planmagnet/controls/TemplateControls.js.map +1 -0
  85. package/dist/planmagnet/controls/WorkItemControls.js +1 -1
  86. package/dist/planmagnet/create/CreateDialogs.d.ts +20 -0
  87. package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
  88. package/dist/planmagnet/create/CreateDialogs.js +455 -116
  89. package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
  90. package/dist/planmagnet/dependency/DependencyPanel.d.ts +6 -0
  91. package/dist/planmagnet/dependency/DependencyPanel.d.ts.map +1 -0
  92. package/dist/planmagnet/dependency/DependencyPanel.js +310 -0
  93. package/dist/planmagnet/dependency/DependencyPanel.js.map +1 -0
  94. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts +2 -0
  95. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts.map +1 -0
  96. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +171 -0
  97. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js.map +1 -0
  98. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts +2 -0
  99. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts.map +1 -0
  100. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js +232 -0
  101. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js.map +1 -0
  102. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts +2 -0
  103. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts.map +1 -0
  104. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +93 -0
  105. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js.map +1 -0
  106. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts +2 -0
  107. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -0
  108. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +127 -0
  109. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -0
  110. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts +2 -0
  111. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -0
  112. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +129 -0
  113. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -0
  114. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts +2 -0
  115. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -0
  116. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +132 -0
  117. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -0
  118. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts +2 -0
  119. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -0
  120. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +181 -0
  121. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -0
  122. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts +2 -0
  123. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +1 -0
  124. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +242 -0
  125. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +1 -0
  126. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts +2 -0
  127. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +1 -0
  128. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +302 -0
  129. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +1 -0
  130. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts +2 -0
  131. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -0
  132. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +335 -0
  133. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -0
  134. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts +2 -0
  135. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +1 -0
  136. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +154 -0
  137. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +1 -0
  138. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  139. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +124 -138
  140. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  141. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts +2 -0
  142. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +1 -0
  143. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +221 -0
  144. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +1 -0
  145. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts +2 -0
  146. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +1 -0
  147. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +279 -0
  148. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +1 -0
  149. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts +2 -0
  150. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +1 -0
  151. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +178 -0
  152. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +1 -0
  153. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts +2 -0
  154. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +1 -0
  155. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +157 -0
  156. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +1 -0
  157. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts +2 -0
  158. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts.map +1 -0
  159. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js +315 -0
  160. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js.map +1 -0
  161. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts +2 -0
  162. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts.map +1 -0
  163. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +186 -0
  164. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js.map +1 -0
  165. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts +2 -0
  166. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts.map +1 -0
  167. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js +164 -0
  168. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js.map +1 -0
  169. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts +2 -0
  170. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts.map +1 -0
  171. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js +348 -0
  172. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js.map +1 -0
  173. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  174. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +130 -103
  175. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  176. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +4 -4
  177. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +4 -4
  178. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +6 -6
  179. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  180. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +325 -189
  181. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  182. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  183. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +81 -72
  184. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  185. package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts +2 -0
  186. package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts.map +1 -0
  187. package/dist/planmagnet/pages/RisksRiskDetailPagePage.js +278 -0
  188. package/dist/planmagnet/pages/RisksRiskDetailPagePage.js.map +1 -0
  189. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts +2 -0
  190. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts.map +1 -0
  191. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js +191 -0
  192. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js.map +1 -0
  193. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +5 -5
  194. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +4 -4
  195. package/dist/planmagnet/pages/TasksImportPagePage.js +5 -5
  196. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  197. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +161 -137
  198. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  199. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  200. package/dist/planmagnet/pages/TasksTasksPagePage.js +124 -113
  201. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  202. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts +2 -0
  203. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts.map +1 -0
  204. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +263 -0
  205. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js.map +1 -0
  206. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts +2 -0
  207. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts.map +1 -0
  208. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js +254 -0
  209. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js.map +1 -0
  210. package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts +2 -0
  211. package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts.map +1 -0
  212. package/dist/planmagnet/pages/TasksTimesheetsPagePage.js +165 -0
  213. package/dist/planmagnet/pages/TasksTimesheetsPagePage.js.map +1 -0
  214. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts +2 -0
  215. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts.map +1 -0
  216. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js +316 -0
  217. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js.map +1 -0
  218. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts +2 -0
  219. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts.map +1 -0
  220. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js +208 -0
  221. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js.map +1 -0
  222. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +0 -5
  223. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -1
  224. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +47 -89
  225. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -1
  226. package/dist/planmagnet/roadmaps/RoadmapControls.js +24 -24
  227. package/dist/planmagnet/time/TaskTimePanel.d.ts +7 -0
  228. package/dist/planmagnet/time/TaskTimePanel.d.ts.map +1 -0
  229. package/dist/planmagnet/time/TaskTimePanel.js +104 -0
  230. package/dist/planmagnet/time/TaskTimePanel.js.map +1 -0
  231. package/dist/planmagnet/time/TimeEntryControls.d.ts +37 -0
  232. package/dist/planmagnet/time/TimeEntryControls.d.ts.map +1 -0
  233. package/dist/planmagnet/time/TimeEntryControls.js +338 -0
  234. package/dist/planmagnet/time/TimeEntryControls.js.map +1 -0
  235. package/dist/planmagnet/time/TimesheetControls.d.ts +18 -0
  236. package/dist/planmagnet/time/TimesheetControls.d.ts.map +1 -0
  237. package/dist/planmagnet/time/TimesheetControls.js +244 -0
  238. package/dist/planmagnet/time/TimesheetControls.js.map +1 -0
  239. package/dist/planmagnet/time/timeShared.d.ts +29 -0
  240. package/dist/planmagnet/time/timeShared.d.ts.map +1 -0
  241. package/dist/planmagnet/time/timeShared.js +34 -0
  242. package/dist/planmagnet/time/timeShared.js.map +1 -0
  243. package/dist/planmagnet/utils/rowNavigation.js +5 -2
  244. package/dist/planmagnet/utils/rowNavigation.js.map +1 -1
  245. package/package.json +1 -1
@@ -0,0 +1,254 @@
1
+ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as t } from "../people/People.js";
3
+ import { useEntityId as n } from "../hooks/useEntityId.js";
4
+ import { enumLabel as r } from "../controls/WorkItemControls.js";
5
+ import { FROZEN_TIMESHEET_STATUSES as i, formatMinutes as a } from "../time/timeShared.js";
6
+ import { DeleteTimeEntryButton as o, EditTimeEntryDialog as s } from "../time/TimeEntryControls.js";
7
+ import { SubmitTimesheetButton as c, TimesheetApprovalActions as l } from "../time/TimesheetControls.js";
8
+ import { ArrowLeft as u, Lock as d } from "lucide-react";
9
+ import { gql as f } from "@apollo/client";
10
+ import { useQuery as p } from "@apollo/client/react";
11
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
12
+ import { Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x } from "@burdenoff/fe-libs/ui";
13
+ //#region src/planmagnet/pages/TasksTimesheetDetailPagePage.tsx
14
+ var S = f`
15
+ query TimesheetDetail($id: ID!) {
16
+ planmagnetTimesheet(id: $id) {
17
+ id
18
+ userId
19
+ periodStart
20
+ periodEnd
21
+ status
22
+ totalMinutes
23
+ billableMinutes
24
+ approverId
25
+ approvedAt
26
+ rejectionReason
27
+ createdBy
28
+ createdAt
29
+ entries {
30
+ id
31
+ workItemId
32
+ workItem {
33
+ id
34
+ key
35
+ title
36
+ }
37
+ description
38
+ durationMinutes
39
+ date
40
+ billingType
41
+ status
42
+ }
43
+ }
44
+ }
45
+ `;
46
+ function C() {
47
+ let f = n("timesheetId"), C = e(), { data: w, loading: T, error: E } = p(S, {
48
+ variables: { id: f },
49
+ skip: !f
50
+ });
51
+ if (!f) return /* @__PURE__ */ h("div", {
52
+ className: "p-6 text-sm text-muted-foreground",
53
+ children: "No timesheet selected. Open one from the list."
54
+ });
55
+ if (T && !w) return /* @__PURE__ */ h("div", {
56
+ className: "flex items-center justify-center p-12",
57
+ children: /* @__PURE__ */ h("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
58
+ });
59
+ if (E) return /* @__PURE__ */ g("div", {
60
+ className: "p-6 space-y-3",
61
+ children: [/* @__PURE__ */ g("p", {
62
+ role: "alert",
63
+ className: "text-sm text-destructive",
64
+ children: ["The timesheet could not be loaded: ", E.message]
65
+ }), /* @__PURE__ */ g(_, {
66
+ size: "sm",
67
+ variant: "ghost",
68
+ onClick: () => C("/tasks/timesheets-page"),
69
+ children: [/* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "All timesheets"]
70
+ })]
71
+ });
72
+ let D = w?.planmagnetTimesheet;
73
+ if (!D) return /* @__PURE__ */ g("div", {
74
+ className: "p-6 space-y-3",
75
+ children: [/* @__PURE__ */ h("p", {
76
+ className: "text-sm text-muted-foreground",
77
+ children: "This timesheet does not exist in this workspace."
78
+ }), /* @__PURE__ */ g(_, {
79
+ size: "sm",
80
+ variant: "ghost",
81
+ onClick: () => C("/tasks/timesheets-page"),
82
+ children: [/* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "All timesheets"]
83
+ })]
84
+ });
85
+ let O = ["TimesheetDetail", "TimesheetsList"], k = i.has(D.status), A = [...D.entries].sort((e, t) => e.date.localeCompare(t.date));
86
+ return /* @__PURE__ */ g("div", {
87
+ className: "space-y-6 p-6",
88
+ children: [
89
+ /* @__PURE__ */ g(_, {
90
+ size: "sm",
91
+ variant: "ghost",
92
+ onClick: () => C("/tasks/timesheets-page"),
93
+ children: [/* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "All timesheets"]
94
+ }),
95
+ /* @__PURE__ */ g("div", {
96
+ className: "flex flex-wrap items-start justify-between gap-4",
97
+ children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("h1", {
98
+ className: "text-2xl font-semibold",
99
+ children: [
100
+ new Date(D.periodStart).toLocaleDateString(),
101
+ " –",
102
+ " ",
103
+ new Date(D.periodEnd).toLocaleDateString()
104
+ ]
105
+ }), /* @__PURE__ */ g("p", {
106
+ className: "text-sm text-muted-foreground mt-1",
107
+ children: [
108
+ /* @__PURE__ */ h(t, { id: D.userId }),
109
+ " · ",
110
+ r(D.status)
111
+ ]
112
+ })] }), /* @__PURE__ */ g("div", {
113
+ className: "flex flex-col items-end gap-2",
114
+ children: [/* @__PURE__ */ h(c, {
115
+ id: D.id,
116
+ status: D.status,
117
+ refetchQueries: O
118
+ }), /* @__PURE__ */ h(l, {
119
+ id: D.id,
120
+ status: D.status,
121
+ refetchQueries: O
122
+ })]
123
+ })]
124
+ }),
125
+ D.status === "REJECTED" && D.rejectionReason && /* @__PURE__ */ g("p", {
126
+ role: "alert",
127
+ className: "text-sm text-status-error-text rounded-md border border-destructive/40 p-3",
128
+ children: ["Rejected: ", D.rejectionReason]
129
+ }),
130
+ D.approverId && D.approvedAt && /* @__PURE__ */ g("p", {
131
+ className: "text-sm text-muted-foreground",
132
+ children: [
133
+ "Approved by ",
134
+ /* @__PURE__ */ h(t, { id: D.approverId }),
135
+ " on",
136
+ " ",
137
+ new Date(D.approvedAt).toLocaleDateString()
138
+ ]
139
+ }),
140
+ /* @__PURE__ */ g("div", {
141
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
142
+ children: [
143
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
144
+ className: "pt-4",
145
+ children: [/* @__PURE__ */ h("p", {
146
+ className: "text-xs text-muted-foreground",
147
+ children: "Total"
148
+ }), /* @__PURE__ */ h("p", {
149
+ className: "text-xl font-bold mt-1",
150
+ children: a(D.totalMinutes)
151
+ })]
152
+ }) }),
153
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
154
+ className: "pt-4",
155
+ children: [/* @__PURE__ */ h("p", {
156
+ className: "text-xs text-muted-foreground",
157
+ children: "Billable"
158
+ }), /* @__PURE__ */ h("p", {
159
+ className: "text-xl font-bold mt-1",
160
+ children: a(D.billableMinutes)
161
+ })]
162
+ }) }),
163
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
164
+ className: "pt-4",
165
+ children: [/* @__PURE__ */ h("p", {
166
+ className: "text-xs text-muted-foreground",
167
+ children: "Entries"
168
+ }), /* @__PURE__ */ h("p", {
169
+ className: "text-xl font-bold mt-1",
170
+ children: A.length
171
+ })]
172
+ }) }),
173
+ /* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
174
+ className: "pt-4",
175
+ children: [/* @__PURE__ */ h("p", {
176
+ className: "text-xs text-muted-foreground",
177
+ children: "Created"
178
+ }), /* @__PURE__ */ h("p", {
179
+ className: "text-sm font-medium mt-1",
180
+ children: new Date(D.createdAt).toLocaleDateString()
181
+ })]
182
+ }) })
183
+ ]
184
+ }),
185
+ /* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ g(x, {
186
+ className: "flex items-center gap-2",
187
+ children: [
188
+ "Entries (",
189
+ A.length,
190
+ ")",
191
+ k && /* @__PURE__ */ g("span", {
192
+ className: "flex items-center gap-1 text-xs font-normal text-muted-foreground",
193
+ children: [
194
+ /* @__PURE__ */ h(d, {
195
+ className: "h-3 w-3",
196
+ "aria-hidden": !0
197
+ }),
198
+ "Locked while ",
199
+ r(D.status).toLowerCase()
200
+ ]
201
+ })
202
+ ]
203
+ }) }), /* @__PURE__ */ g(y, {
204
+ className: "space-y-2",
205
+ children: [A.length === 0 && /* @__PURE__ */ h("p", {
206
+ className: "text-sm text-muted-foreground text-center py-4",
207
+ children: "No entries in this period yet."
208
+ }), A.map((e) => {
209
+ let t = e.workItem;
210
+ return /* @__PURE__ */ g("div", {
211
+ className: "flex items-start justify-between gap-3 rounded-md border p-3",
212
+ children: [/* @__PURE__ */ g("div", {
213
+ className: "min-w-0 space-y-1",
214
+ children: [/* @__PURE__ */ g("p", {
215
+ className: "text-sm font-medium",
216
+ children: [
217
+ new Date(e.date).toLocaleDateString(),
218
+ " ·",
219
+ " ",
220
+ a(e.durationMinutes),
221
+ " · ",
222
+ r(e.billingType)
223
+ ]
224
+ }), /* @__PURE__ */ g("p", {
225
+ className: "text-xs text-muted-foreground truncate",
226
+ children: [t ? /* @__PURE__ */ g(m, { children: [
227
+ /* @__PURE__ */ h("span", {
228
+ className: "font-medium",
229
+ children: t.key
230
+ }),
231
+ " ",
232
+ t.title
233
+ ] }) : "—", e.description ? ` · ${e.description}` : ""]
234
+ })]
235
+ }), !k && /* @__PURE__ */ g("div", {
236
+ className: "flex shrink-0 gap-1",
237
+ children: [/* @__PURE__ */ h(s, {
238
+ entry: e,
239
+ refetchQueries: O
240
+ }), /* @__PURE__ */ h(o, {
241
+ id: e.id,
242
+ refetchQueries: O
243
+ })]
244
+ })]
245
+ }, e.id);
246
+ })]
247
+ })] })
248
+ ]
249
+ });
250
+ }
251
+ //#endregion
252
+ export { C as TasksTimesheetDetailPagePage };
253
+
254
+ //# sourceMappingURL=TasksTimesheetDetailPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TasksTimesheetDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTimesheetDetailPagePage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Lock } from 'lucide-react';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { SubmitTimesheetButton, TimesheetApprovalActions } from '../time/TimesheetControls';\nimport { EditTimeEntryDialog, DeleteTimeEntryButton } from '../time/TimeEntryControls';\nimport { FROZEN_TIMESHEET_STATUSES, formatMinutes } from '../time/timeShared';\nimport { PersonName } from '../people/People';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\n/**\n * One timesheet (BOFF-8047): its totals, its lifecycle (Submit; Approve/Reject once submitted) and the entries\n * it owns. Entries stay editable here for as long as the SERVICE allows it — DRAFT or REJECTED\n * (`FROZEN_TIMESHEET_STATUSES` mirrors `TimeTrackingService.FROZEN_STATUSES`) — because this page, unlike the\n * Time Entries list, knows its one sheet's status directly and does not need to guess.\n */\n\nconst GET_TIMESHEET = gql`\n query TimesheetDetail($id: ID!) {\n planmagnetTimesheet(id: $id) {\n id\n userId\n periodStart\n periodEnd\n status\n totalMinutes\n billableMinutes\n approverId\n approvedAt\n rejectionReason\n createdBy\n createdAt\n entries {\n id\n workItemId\n workItem {\n id\n key\n title\n }\n description\n durationMinutes\n date\n billingType\n status\n }\n }\n }\n`;\n\ninterface EntryNode {\n id: string;\n workItemId: string;\n workItem: { id: string; key: string; title: string } | null;\n description: string | null;\n durationMinutes: number;\n date: string;\n billingType: string;\n status: string;\n}\n\ninterface TimesheetNode {\n id: string;\n userId: string;\n periodStart: string;\n periodEnd: string;\n status: string;\n totalMinutes: number;\n billableMinutes: number;\n approverId: string | null;\n approvedAt: string | null;\n rejectionReason: string | null;\n createdBy: string;\n createdAt: string;\n entries: EntryNode[];\n}\n\nexport function TasksTimesheetDetailPagePage() {\n const timesheetId = useEntityId('timesheetId');\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<{ planmagnetTimesheet: TimesheetNode | null }>(\n GET_TIMESHEET,\n { variables: { id: timesheetId }, skip: !timesheetId }\n );\n\n if (!timesheetId) {\n return (\n <div className=\"p-6 text-sm text-muted-foreground\">\n No timesheet selected. Open one from the list.\n </div>\n );\n }\n // Only before the first load: a refetch after Submit/Approve/Reject or an entry edit must not blank the page.\n if (loading && !data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n if (error) {\n return (\n <div className=\"p-6 space-y-3\">\n <p role=\"alert\" className=\"text-sm text-destructive\">\n The timesheet could not be loaded: {error.message}\n </p>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/tasks/timesheets-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All timesheets\n </Button>\n </div>\n );\n }\n const sheet = data?.planmagnetTimesheet;\n if (!sheet) {\n return (\n <div className=\"p-6 space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n This timesheet does not exist in this workspace.\n </p>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/tasks/timesheets-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All timesheets\n </Button>\n </div>\n );\n }\n\n const refetchQueries = ['TimesheetDetail', 'TimesheetsList'];\n const frozen = FROZEN_TIMESHEET_STATUSES.has(sheet.status);\n const entries = [...sheet.entries].sort((a, b) => a.date.localeCompare(b.date));\n\n return (\n <div className=\"space-y-6 p-6\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/tasks/timesheets-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All timesheets\n </Button>\n\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {new Date(sheet.periodStart).toLocaleDateString()} –{' '}\n {new Date(sheet.periodEnd).toLocaleDateString()}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n <PersonName id={sheet.userId} /> · {enumLabel(sheet.status)}\n </p>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <SubmitTimesheetButton\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n <TimesheetApprovalActions\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n </div>\n </div>\n\n {sheet.status === 'REJECTED' && sheet.rejectionReason && (\n <p\n role=\"alert\"\n className=\"text-sm text-status-error-text rounded-md border border-destructive/40 p-3\"\n >\n Rejected: {sheet.rejectionReason}\n </p>\n )}\n {sheet.approverId && sheet.approvedAt && (\n <p className=\"text-sm text-muted-foreground\">\n Approved by <PersonName id={sheet.approverId} /> on{' '}\n {new Date(sheet.approvedAt).toLocaleDateString()}\n </p>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Total</p>\n <p className=\"text-xl font-bold mt-1\">{formatMinutes(sheet.totalMinutes)}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Billable</p>\n <p className=\"text-xl font-bold mt-1\">{formatMinutes(sheet.billableMinutes)}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Entries</p>\n <p className=\"text-xl font-bold mt-1\">{entries.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Created</p>\n <p className=\"text-sm font-medium mt-1\">\n {new Date(sheet.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n Entries ({entries.length})\n {frozen && (\n <span className=\"flex items-center gap-1 text-xs font-normal text-muted-foreground\">\n <Lock className=\"h-3 w-3\" aria-hidden={true} />\n Locked while {enumLabel(sheet.status).toLowerCase()}\n </span>\n )}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {entries.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n No entries in this period yet.\n </p>\n )}\n {entries.map((entry) => {\n const workItem = entry.workItem;\n return (\n <div\n key={entry.id}\n className=\"flex items-start justify-between gap-3 rounded-md border p-3\"\n >\n <div className=\"min-w-0 space-y-1\">\n <p className=\"text-sm font-medium\">\n {new Date(entry.date).toLocaleDateString()} ·{' '}\n {formatMinutes(entry.durationMinutes)} · {enumLabel(entry.billingType)}\n </p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {workItem ? (\n <>\n <span className=\"font-medium\">{workItem.key}</span> {workItem.title}\n </>\n ) : (\n '—'\n )}\n {entry.description ? ` · ${entry.description}` : ''}\n </p>\n </div>\n {!frozen && (\n <div className=\"flex shrink-0 gap-1\">\n <EditTimeEntryDialog entry={entry} refetchQueries={refetchQueries} />\n <DeleteTimeEntryButton id={entry.id} refetchQueries={refetchQueries} />\n </div>\n )}\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function TasksTimesheetsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=TasksTimesheetsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TasksTimesheetsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTimesheetsPagePage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,uBAAuB,4CA4JtC"}
@@ -0,0 +1,165 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as n } from "../people/People.js";
3
+ import { enumLabel as r } from "../controls/WorkItemControls.js";
4
+ import { ROW_LINK_CLASS as i, detailPath as a, rowLinkProps as o, stopRowActivation as s } from "../utils/rowNavigation.js";
5
+ import { TIME_ENTRY_STATUSES as c, formatMinutes as l } from "../time/timeShared.js";
6
+ import { CreateTimesheetDialog as u, SubmitTimesheetButton as d, TimesheetApprovalActions as f } from "../time/TimesheetControls.js";
7
+ import { useState as p } from "react";
8
+ import { gql as m } from "@apollo/client";
9
+ import { useQuery as h } from "@apollo/client/react";
10
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
11
+ import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ //#region src/planmagnet/pages/TasksTimesheetsPagePage.tsx
13
+ var b = m`
14
+ query TimesheetsList(
15
+ $workspaceId: ID!
16
+ $filter: PlanmagnetTimesheetFilter
17
+ $pagination: PlanmagnetPaginationInput
18
+ ) {
19
+ planmagnetTimesheets(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
20
+ items {
21
+ id
22
+ userId
23
+ periodStart
24
+ periodEnd
25
+ status
26
+ totalMinutes
27
+ billableMinutes
28
+ }
29
+ totalCount
30
+ }
31
+ }
32
+ `, x = ["ALL", ...c];
33
+ function S() {
34
+ let { workspaceId: c, currentUser: m } = e(), S = t(), { t: C } = y(), [w, T] = p("mine"), [E, D] = p("ALL"), O = {
35
+ ...w === "mine" && m?.id ? { userId: m.id } : {},
36
+ ...E === "ALL" ? {} : { status: E }
37
+ }, { data: k, loading: A, error: j } = h(b, {
38
+ variables: {
39
+ workspaceId: c ?? "",
40
+ filter: O,
41
+ pagination: { first: 100 }
42
+ },
43
+ skip: !c
44
+ }), M = k?.planmagnetTimesheets.items ?? [], N = ["TimesheetsList"];
45
+ return /* @__PURE__ */ v("div", {
46
+ className: "space-y-6 p-6",
47
+ children: [
48
+ /* @__PURE__ */ v("div", {
49
+ className: "flex flex-wrap items-center justify-between gap-3",
50
+ children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h1", {
51
+ className: "text-2xl font-semibold",
52
+ children: C("planmagnet.timesheets.title", "Timesheets")
53
+ }), /* @__PURE__ */ _("p", {
54
+ className: "text-sm text-muted-foreground",
55
+ children: k ? C("planmagnet.timesheets.subtitle", "{{count}} timesheet(s)", { count: k.planmagnetTimesheets.totalCount }) : C("planmagnet.timesheets.subtitleFallback", "Periods of logged time, for approval and billing")
56
+ })] }), /* @__PURE__ */ _(u, {
57
+ refetchQueries: N,
58
+ onCreated: (e) => S(a("/tasks/timesheet-detail-page", e))
59
+ })]
60
+ }),
61
+ /* @__PURE__ */ v("div", {
62
+ className: "flex flex-wrap items-center gap-3",
63
+ children: [/* @__PURE__ */ _("div", {
64
+ className: "flex gap-1",
65
+ role: "group",
66
+ "aria-label": C("planmagnet.timesheets.scope", "Whose timesheets"),
67
+ children: ["mine", "all"].map((e) => /* @__PURE__ */ _("button", {
68
+ type: "button",
69
+ "aria-pressed": w === e,
70
+ onClick: () => T(e),
71
+ className: `px-3 py-1.5 text-sm rounded-md ${w === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
72
+ children: e === "mine" ? C("planmagnet.timesheets.mine", "Mine") : C("planmagnet.timesheets.all", "Everyone")
73
+ }, e))
74
+ }), /* @__PURE__ */ _("div", {
75
+ className: "flex flex-wrap gap-1",
76
+ role: "group",
77
+ "aria-label": C("planmagnet.timesheets.statusFilter", "Filter by status"),
78
+ children: x.map((e) => /* @__PURE__ */ _("button", {
79
+ type: "button",
80
+ "aria-pressed": E === e,
81
+ onClick: () => D(e),
82
+ className: `px-3 py-1.5 text-sm rounded-md ${E === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
83
+ children: e === "ALL" ? C("planmagnet.timesheets.allStatuses", "All") : r(e)
84
+ }, e))
85
+ })]
86
+ }),
87
+ w === "all" && E === "SUBMITTED" && /* @__PURE__ */ _("p", {
88
+ className: "text-xs text-muted-foreground",
89
+ children: C("planmagnet.timesheets.approvalQueueHint", "This is the approval queue: every submitted timesheet in the workspace, waiting on Approve or Reject.")
90
+ }),
91
+ j && /* @__PURE__ */ v("p", {
92
+ role: "alert",
93
+ className: "text-sm text-destructive",
94
+ children: [
95
+ C("planmagnet.timesheets.errorLoading", "Timesheets could not be loaded"),
96
+ ":",
97
+ " ",
98
+ j.message
99
+ ]
100
+ }),
101
+ A && !k && /* @__PURE__ */ _("div", {
102
+ className: "flex items-center justify-center p-12",
103
+ children: /* @__PURE__ */ _("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
104
+ }),
105
+ k && M.length === 0 && !j && /* @__PURE__ */ _("p", {
106
+ className: "text-center text-sm text-muted-foreground py-8",
107
+ children: C("planmagnet.timesheets.empty", "No timesheets match these filters.")
108
+ }),
109
+ /* @__PURE__ */ _("div", {
110
+ className: "space-y-2",
111
+ children: M.map((e) => /* @__PURE__ */ v("div", {
112
+ ...o(() => S(a("/tasks/timesheet-detail-page", e.id)), `${new Date(e.periodStart).toLocaleDateString()} – ${new Date(e.periodEnd).toLocaleDateString()}`),
113
+ className: `flex flex-wrap items-center justify-between gap-3 rounded-md border p-3 ${i}`,
114
+ children: [/* @__PURE__ */ v("div", {
115
+ className: "min-w-0",
116
+ children: [/* @__PURE__ */ v("p", {
117
+ className: "text-sm font-medium",
118
+ children: [
119
+ new Date(e.periodStart).toLocaleDateString(),
120
+ " –",
121
+ " ",
122
+ new Date(e.periodEnd).toLocaleDateString()
123
+ ]
124
+ }), /* @__PURE__ */ v("p", {
125
+ className: "text-xs text-muted-foreground",
126
+ children: [
127
+ w === "all" ? /* @__PURE__ */ v(g, { children: [
128
+ /* @__PURE__ */ _(n, { id: e.userId }),
129
+ " ·",
130
+ " "
131
+ ] }) : null,
132
+ l(e.totalMinutes),
133
+ " total · ",
134
+ l(e.billableMinutes),
135
+ " ",
136
+ "billable"
137
+ ]
138
+ })]
139
+ }), /* @__PURE__ */ v("div", {
140
+ className: "flex items-center gap-2",
141
+ children: [/* @__PURE__ */ _("span", {
142
+ className: "text-xs px-2 py-0.5 rounded-full bg-muted",
143
+ children: r(e.status)
144
+ }), /* @__PURE__ */ v("div", {
145
+ onClick: s,
146
+ children: [/* @__PURE__ */ _(d, {
147
+ id: e.id,
148
+ status: e.status,
149
+ refetchQueries: N
150
+ }), /* @__PURE__ */ _(f, {
151
+ id: e.id,
152
+ status: e.status,
153
+ refetchQueries: N
154
+ })]
155
+ })]
156
+ })]
157
+ }, e.id))
158
+ })
159
+ ]
160
+ });
161
+ }
162
+ //#endregion
163
+ export { S as TasksTimesheetsPagePage };
164
+
165
+ //# sourceMappingURL=TasksTimesheetsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TasksTimesheetsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTimesheetsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport {\n CreateTimesheetDialog,\n SubmitTimesheetButton,\n TimesheetApprovalActions,\n} from '../time/TimesheetControls';\nimport { formatMinutes, TIME_ENTRY_STATUSES } from '../time/timeShared';\nimport { PersonName } from '../people/People';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport {\n rowLinkProps,\n detailPath,\n stopRowActivation,\n ROW_LINK_CLASS,\n} from '../utils/rowNavigation';\n\n/**\n * Timesheets (BOFF-8047): create one for a period, submit it, and — the \"approver view\" the ticket asks for —\n * approve or reject one someone else submitted. There is no separate approvals screen: switching scope to\n * \"Everyone\" and status to \"Submitted\" IS the approval queue, so an approver never has to guess where it is,\n * and the RBAC boundary is enforced where it always is in this MFE — by the gateway refusing the mutation for\n * a caller without the `approve` permission, not by hiding the button (see `TimesheetControls.tsx`).\n */\n\nconst TIMESHEETS = gql`\n query TimesheetsList(\n $workspaceId: ID!\n $filter: PlanmagnetTimesheetFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetTimesheets(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n userId\n periodStart\n periodEnd\n status\n totalMinutes\n billableMinutes\n }\n totalCount\n }\n }\n`;\n\ninterface TimesheetRow {\n id: string;\n userId: string;\n periodStart: string;\n periodEnd: string;\n status: string;\n totalMinutes: number;\n billableMinutes: number;\n}\n\nconst STATUS_TABS = ['ALL', ...TIME_ENTRY_STATUSES] as const;\n\nexport function TasksTimesheetsPagePage() {\n const { workspaceId, currentUser } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { t } = useI18n();\n const [scope, setScope] = useState<'mine' | 'all'>('mine');\n const [status, setStatus] = useState<(typeof STATUS_TABS)[number]>('ALL');\n\n const filter = {\n ...(scope === 'mine' && currentUser?.id ? { userId: currentUser.id } : {}),\n ...(status !== 'ALL' ? { status } : {}),\n };\n const { data, loading, error } = useQuery<{\n planmagnetTimesheets: { items: TimesheetRow[]; totalCount: number };\n }>(TIMESHEETS, {\n variables: { workspaceId: workspaceId ?? '', filter, pagination: { first: 100 } },\n skip: !workspaceId,\n });\n\n const timesheets = data?.planmagnetTimesheets.items ?? [];\n const refetchQueries = ['TimesheetsList'];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {t('planmagnet.timesheets.title', 'Timesheets')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {data\n ? t('planmagnet.timesheets.subtitle', '{{count}} timesheet(s)', {\n count: data.planmagnetTimesheets.totalCount,\n })\n : t(\n 'planmagnet.timesheets.subtitleFallback',\n 'Periods of logged time, for approval and billing'\n )}\n </p>\n </div>\n <CreateTimesheetDialog\n refetchQueries={refetchQueries}\n onCreated={(id) => navigate(detailPath('/tasks/timesheet-detail-page', id))}\n />\n </div>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <div\n className=\"flex gap-1\"\n role=\"group\"\n aria-label={t('planmagnet.timesheets.scope', 'Whose timesheets')}\n >\n {(['mine', 'all'] as const).map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={scope === s}\n onClick={() => setScope(s)}\n className={`px-3 py-1.5 text-sm rounded-md ${scope === s ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {s === 'mine'\n ? t('planmagnet.timesheets.mine', 'Mine')\n : t('planmagnet.timesheets.all', 'Everyone')}\n </button>\n ))}\n </div>\n <div\n className=\"flex flex-wrap gap-1\"\n role=\"group\"\n aria-label={t('planmagnet.timesheets.statusFilter', 'Filter by status')}\n >\n {STATUS_TABS.map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={status === s}\n onClick={() => setStatus(s)}\n className={`px-3 py-1.5 text-sm rounded-md ${status === s ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {s === 'ALL' ? t('planmagnet.timesheets.allStatuses', 'All') : enumLabel(s)}\n </button>\n ))}\n </div>\n </div>\n {scope === 'all' && status === 'SUBMITTED' && (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'planmagnet.timesheets.approvalQueueHint',\n 'This is the approval queue: every submitted timesheet in the workspace, waiting on Approve or Reject.'\n )}\n </p>\n )}\n\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {t('planmagnet.timesheets.errorLoading', 'Timesheets could not be loaded')}:{' '}\n {error.message}\n </p>\n )}\n {loading && !data && (\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 {data && timesheets.length === 0 && !error && (\n <p className=\"text-center text-sm text-muted-foreground py-8\">\n {t('planmagnet.timesheets.empty', 'No timesheets match these filters.')}\n </p>\n )}\n\n <div className=\"space-y-2\">\n {timesheets.map((sheet) => (\n <div\n key={sheet.id}\n {...rowLinkProps(\n () => navigate(detailPath('/tasks/timesheet-detail-page', sheet.id)),\n `${new Date(sheet.periodStart).toLocaleDateString()} – ${new Date(sheet.periodEnd).toLocaleDateString()}`\n )}\n className={`flex flex-wrap items-center justify-between gap-3 rounded-md border p-3 ${ROW_LINK_CLASS}`}\n >\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {new Date(sheet.periodStart).toLocaleDateString()} –{' '}\n {new Date(sheet.periodEnd).toLocaleDateString()}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {scope === 'all' ? (\n <>\n <PersonName id={sheet.userId} /> ·{' '}\n </>\n ) : null}\n {formatMinutes(sheet.totalMinutes)} total · {formatMinutes(sheet.billableMinutes)}{' '}\n billable\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-muted\">\n {enumLabel(sheet.status)}\n </span>\n <div onClick={stopRowActivation}>\n <SubmitTimesheetButton\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n <TimesheetApprovalActions\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function TemplatesEditTemplatePagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=TemplatesEditTemplatePagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplatesEditTemplatePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TemplatesEditTemplatePagePage.tsx"],"names":[],"mappings":"AAoHA,wBAAgB,6BAA6B,4CAmQ5C"}