@hed-hog/operations 0.0.329 → 0.0.331

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 (290) hide show
  1. package/README.md +5 -5
  2. package/dist/controllers/operations-collaborators.controller.d.ts +7 -216
  3. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
  4. package/dist/controllers/operations-contracts.controller.d.ts +6 -6
  5. package/dist/controllers/operations-projects.controller.d.ts +25 -0
  6. package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
  7. package/dist/controllers/operations-projects.controller.js +48 -0
  8. package/dist/controllers/operations-projects.controller.js.map +1 -1
  9. package/dist/controllers/operations-reports.controller.d.ts +1 -1
  10. package/dist/controllers/operations-tasks.controller.d.ts +30 -5
  11. package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
  12. package/dist/controllers/operations-tasks.controller.js +43 -32
  13. package/dist/controllers/operations-tasks.controller.js.map +1 -1
  14. package/dist/controllers/operations-timesheets.controller.d.ts +9 -9
  15. package/dist/dashboard/components/DashboardLayout.d.ts +30 -0
  16. package/dist/dashboard/components/DashboardLayout.d.ts.map +1 -0
  17. package/dist/dashboard/components/DashboardLayout.js +87 -0
  18. package/dist/dashboard/components/DashboardLayout.js.map +1 -0
  19. package/dist/dashboard/components/widget-registry.d.ts +23 -0
  20. package/dist/dashboard/components/widget-registry.d.ts.map +1 -0
  21. package/dist/dashboard/components/widget-registry.js +245 -0
  22. package/dist/dashboard/components/widget-registry.js.map +1 -0
  23. package/dist/dashboard/hooks/useDashboardData.d.ts +20 -0
  24. package/dist/dashboard/hooks/useDashboardData.d.ts.map +1 -0
  25. package/dist/dashboard/hooks/useDashboardData.js +24 -0
  26. package/dist/dashboard/hooks/useDashboardData.js.map +1 -0
  27. package/dist/dashboard/types/widgets.types.d.ts +233 -0
  28. package/dist/dashboard/types/widgets.types.d.ts.map +1 -0
  29. package/dist/dashboard/types/widgets.types.js +6 -0
  30. package/dist/dashboard/types/widgets.types.js.map +1 -0
  31. package/dist/dashboard/widgets/CapacityDistribution.d.ts +23 -0
  32. package/dist/dashboard/widgets/CapacityDistribution.d.ts.map +1 -0
  33. package/dist/dashboard/widgets/CapacityDistribution.js +11 -0
  34. package/dist/dashboard/widgets/CapacityDistribution.js.map +1 -0
  35. package/dist/dashboard/widgets/EffortByProject.d.ts +22 -0
  36. package/dist/dashboard/widgets/EffortByProject.d.ts.map +1 -0
  37. package/dist/dashboard/widgets/EffortByProject.js +11 -0
  38. package/dist/dashboard/widgets/EffortByProject.js.map +1 -0
  39. package/dist/dashboard/widgets/HeadcountByArea.d.ts +24 -0
  40. package/dist/dashboard/widgets/HeadcountByArea.d.ts.map +1 -0
  41. package/dist/dashboard/widgets/HeadcountByArea.js +11 -0
  42. package/dist/dashboard/widgets/HeadcountByArea.js.map +1 -0
  43. package/dist/dashboard/widgets/ManagedProjectsStatus.d.ts +18 -0
  44. package/dist/dashboard/widgets/ManagedProjectsStatus.d.ts.map +1 -0
  45. package/dist/dashboard/widgets/ManagedProjectsStatus.js +12 -0
  46. package/dist/dashboard/widgets/ManagedProjectsStatus.js.map +1 -0
  47. package/dist/dashboard/widgets/MyHoursPeriodKpi.d.ts +22 -0
  48. package/dist/dashboard/widgets/MyHoursPeriodKpi.d.ts.map +1 -0
  49. package/dist/dashboard/widgets/MyHoursPeriodKpi.js +12 -0
  50. package/dist/dashboard/widgets/MyHoursPeriodKpi.js.map +1 -0
  51. package/dist/dashboard/widgets/MyOpenRequestsKpi.d.ts +19 -0
  52. package/dist/dashboard/widgets/MyOpenRequestsKpi.d.ts.map +1 -0
  53. package/dist/dashboard/widgets/MyOpenRequestsKpi.js +17 -0
  54. package/dist/dashboard/widgets/MyOpenRequestsKpi.js.map +1 -0
  55. package/dist/dashboard/widgets/MyPendingRequestsList.d.ts +23 -0
  56. package/dist/dashboard/widgets/MyPendingRequestsList.d.ts.map +1 -0
  57. package/dist/dashboard/widgets/MyPendingRequestsList.js +14 -0
  58. package/dist/dashboard/widgets/MyPendingRequestsList.js.map +1 -0
  59. package/dist/dashboard/widgets/MyProjectAllocationsKpi.d.ts +22 -0
  60. package/dist/dashboard/widgets/MyProjectAllocationsKpi.d.ts.map +1 -0
  61. package/dist/dashboard/widgets/MyProjectAllocationsKpi.js +11 -0
  62. package/dist/dashboard/widgets/MyProjectAllocationsKpi.js.map +1 -0
  63. package/dist/dashboard/widgets/MyQuickActions.d.ts +23 -0
  64. package/dist/dashboard/widgets/MyQuickActions.d.ts.map +1 -0
  65. package/dist/dashboard/widgets/MyQuickActions.js +18 -0
  66. package/dist/dashboard/widgets/MyQuickActions.js.map +1 -0
  67. package/dist/dashboard/widgets/MyRelevantDeadlines.d.ts +23 -0
  68. package/dist/dashboard/widgets/MyRelevantDeadlines.d.ts.map +1 -0
  69. package/dist/dashboard/widgets/MyRelevantDeadlines.js +22 -0
  70. package/dist/dashboard/widgets/MyRelevantDeadlines.js.map +1 -0
  71. package/dist/dashboard/widgets/MyTimesheetStatusKpi.d.ts +17 -0
  72. package/dist/dashboard/widgets/MyTimesheetStatusKpi.d.ts.map +1 -0
  73. package/dist/dashboard/widgets/MyTimesheetStatusKpi.js +11 -0
  74. package/dist/dashboard/widgets/MyTimesheetStatusKpi.js.map +1 -0
  75. package/dist/dashboard/widgets/MyWeeklyJourney.d.ts +21 -0
  76. package/dist/dashboard/widgets/MyWeeklyJourney.d.ts.map +1 -0
  77. package/dist/dashboard/widgets/MyWeeklyJourney.js +19 -0
  78. package/dist/dashboard/widgets/MyWeeklyJourney.js.map +1 -0
  79. package/dist/dashboard/widgets/PortfolioCostsKpi.d.ts +19 -0
  80. package/dist/dashboard/widgets/PortfolioCostsKpi.d.ts.map +1 -0
  81. package/dist/dashboard/widgets/PortfolioCostsKpi.js +12 -0
  82. package/dist/dashboard/widgets/PortfolioCostsKpi.js.map +1 -0
  83. package/dist/dashboard/widgets/PortfolioEffortKpi.d.ts +18 -0
  84. package/dist/dashboard/widgets/PortfolioEffortKpi.d.ts.map +1 -0
  85. package/dist/dashboard/widgets/PortfolioEffortKpi.js +8 -0
  86. package/dist/dashboard/widgets/PortfolioEffortKpi.js.map +1 -0
  87. package/dist/dashboard/widgets/PortfolioProjectsKpi.d.ts +22 -0
  88. package/dist/dashboard/widgets/PortfolioProjectsKpi.d.ts.map +1 -0
  89. package/dist/dashboard/widgets/PortfolioProjectsKpi.js +56 -0
  90. package/dist/dashboard/widgets/PortfolioProjectsKpi.js.map +1 -0
  91. package/dist/dashboard/widgets/PortfolioRiskKpi.d.ts +19 -0
  92. package/dist/dashboard/widgets/PortfolioRiskKpi.d.ts.map +1 -0
  93. package/dist/dashboard/widgets/PortfolioRiskKpi.js +11 -0
  94. package/dist/dashboard/widgets/PortfolioRiskKpi.js.map +1 -0
  95. package/dist/dashboard/widgets/ProjectStatusOverview.d.ts +19 -0
  96. package/dist/dashboard/widgets/ProjectStatusOverview.d.ts.map +1 -0
  97. package/dist/dashboard/widgets/ProjectStatusOverview.js +18 -0
  98. package/dist/dashboard/widgets/ProjectStatusOverview.js.map +1 -0
  99. package/dist/dashboard/widgets/StrategicDeadlines.d.ts +24 -0
  100. package/dist/dashboard/widgets/StrategicDeadlines.d.ts.map +1 -0
  101. package/dist/dashboard/widgets/StrategicDeadlines.js +22 -0
  102. package/dist/dashboard/widgets/StrategicDeadlines.js.map +1 -0
  103. package/dist/dashboard/widgets/TeamApprovalQueue.d.ts +24 -0
  104. package/dist/dashboard/widgets/TeamApprovalQueue.d.ts.map +1 -0
  105. package/dist/dashboard/widgets/TeamApprovalQueue.js +12 -0
  106. package/dist/dashboard/widgets/TeamApprovalQueue.js.map +1 -0
  107. package/dist/dashboard/widgets/TeamCapacityKpi.d.ts +18 -0
  108. package/dist/dashboard/widgets/TeamCapacityKpi.d.ts.map +1 -0
  109. package/dist/dashboard/widgets/TeamCapacityKpi.js +19 -0
  110. package/dist/dashboard/widgets/TeamCapacityKpi.js.map +1 -0
  111. package/dist/dashboard/widgets/TeamHeadcountKpi.d.ts +22 -0
  112. package/dist/dashboard/widgets/TeamHeadcountKpi.d.ts.map +1 -0
  113. package/dist/dashboard/widgets/TeamHeadcountKpi.js +56 -0
  114. package/dist/dashboard/widgets/TeamHeadcountKpi.js.map +1 -0
  115. package/dist/dashboard/widgets/TeamHoursKpi.d.ts +19 -0
  116. package/dist/dashboard/widgets/TeamHoursKpi.d.ts.map +1 -0
  117. package/dist/dashboard/widgets/TeamHoursKpi.js +13 -0
  118. package/dist/dashboard/widgets/TeamHoursKpi.js.map +1 -0
  119. package/dist/dashboard/widgets/TeamPendingApprovalsKpi.d.ts +20 -0
  120. package/dist/dashboard/widgets/TeamPendingApprovalsKpi.d.ts.map +1 -0
  121. package/dist/dashboard/widgets/TeamPendingApprovalsKpi.js +11 -0
  122. package/dist/dashboard/widgets/TeamPendingApprovalsKpi.js.map +1 -0
  123. package/dist/dashboard/widgets/TeamUtilizationOverview.d.ts +18 -0
  124. package/dist/dashboard/widgets/TeamUtilizationOverview.d.ts.map +1 -0
  125. package/dist/dashboard/widgets/TeamUtilizationOverview.js +17 -0
  126. package/dist/dashboard/widgets/TeamUtilizationOverview.js.map +1 -0
  127. package/dist/dashboard/widgets/TeamWorkloadAlerts.d.ts +24 -0
  128. package/dist/dashboard/widgets/TeamWorkloadAlerts.d.ts.map +1 -0
  129. package/dist/dashboard/widgets/TeamWorkloadAlerts.js +19 -0
  130. package/dist/dashboard/widgets/TeamWorkloadAlerts.js.map +1 -0
  131. package/dist/dashboard/widgets/index.d.ts +24 -0
  132. package/dist/dashboard/widgets/index.d.ts.map +1 -0
  133. package/dist/dashboard/widgets/index.js +54 -0
  134. package/dist/dashboard/widgets/index.js.map +1 -0
  135. package/dist/dto/create-collaborator.dto.d.ts +0 -1
  136. package/dist/dto/create-collaborator.dto.d.ts.map +1 -1
  137. package/dist/dto/create-collaborator.dto.js +0 -6
  138. package/dist/dto/create-collaborator.dto.js.map +1 -1
  139. package/dist/index.d.ts +2 -0
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +2 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/operations.controller.d.ts +42 -0
  144. package/dist/operations.controller.d.ts.map +1 -1
  145. package/dist/operations.service.d.ts +178 -264
  146. package/dist/operations.service.d.ts.map +1 -1
  147. package/dist/operations.service.js +2170 -1340
  148. package/dist/operations.service.js.map +1 -1
  149. package/dist/operations.service.spec.js +345 -174
  150. package/dist/operations.service.spec.js.map +1 -1
  151. package/hedhog/data/dashboard_component.yaml +66 -0
  152. package/hedhog/data/dashboard_component_role.yaml +8 -8
  153. package/hedhog/data/dashboard_item.yaml +25 -25
  154. package/hedhog/data/dashboard_role.yaml +1 -1
  155. package/hedhog/data/menu.yaml +6 -16
  156. package/hedhog/data/role.yaml +1 -1
  157. package/hedhog/data/route.yaml +116 -55
  158. package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +15 -9
  159. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +39 -99
  160. package/hedhog/frontend/app/_components/collaborator-picker.tsx.ejs +158 -0
  161. package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +314 -116
  162. package/hedhog/frontend/app/_components/project-assignments-tab.tsx.ejs +434 -449
  163. package/hedhog/frontend/app/_components/project-costs-section.tsx.ejs +51 -81
  164. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +328 -423
  165. package/hedhog/frontend/app/_components/project-file-attachments.tsx.ejs +371 -0
  166. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +446 -377
  167. package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +803 -581
  168. package/hedhog/frontend/app/_components/task-file-attachments.tsx.ejs +14 -9
  169. package/hedhog/frontend/app/_components/task-form-fields.tsx.ejs +406 -0
  170. package/hedhog/frontend/app/_components/task-form-sheet.tsx.ejs +629 -784
  171. package/hedhog/frontend/app/_components/task-info-display.tsx.ejs +137 -0
  172. package/hedhog/frontend/app/_components/timesheet-entry-create-sheet.tsx.ejs +306 -0
  173. package/hedhog/frontend/app/_lib/api.ts.ejs +480 -476
  174. package/hedhog/frontend/app/_lib/hooks/use-values-visibility.ts.ejs +61 -0
  175. package/hedhog/frontend/app/_lib/types.ts.ejs +66 -5
  176. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +0 -2
  177. package/hedhog/frontend/app/_lib/utils/task-ui.ts.ejs +43 -0
  178. package/hedhog/frontend/app/approvals/page.tsx.ejs +11 -2
  179. package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +6 -1
  180. package/hedhog/frontend/app/collaborators/page.tsx.ejs +127 -42
  181. package/hedhog/frontend/app/contracts/page.tsx.ejs +29 -8
  182. package/hedhog/frontend/app/dashboard/widgets/CapacityDistribution.tsx.ejs +84 -0
  183. package/hedhog/frontend/app/dashboard/widgets/EffortByProject.tsx.ejs +85 -0
  184. package/hedhog/frontend/app/dashboard/widgets/HeadcountByArea.tsx.ejs +101 -0
  185. package/hedhog/frontend/app/dashboard/widgets/ManagedProjectsStatus.tsx.ejs +113 -0
  186. package/hedhog/frontend/app/dashboard/widgets/MyHoursPeriodKpi.tsx.ejs +87 -0
  187. package/hedhog/frontend/app/dashboard/widgets/MyOpenRequestsKpi.tsx.ejs +97 -0
  188. package/hedhog/frontend/app/dashboard/widgets/MyPendingRequestsList.tsx.ejs +99 -0
  189. package/hedhog/frontend/app/dashboard/widgets/MyProjectAllocationsKpi.tsx.ejs +78 -0
  190. package/hedhog/frontend/app/dashboard/widgets/MyQuickActions.tsx.ejs +130 -0
  191. package/hedhog/frontend/app/dashboard/widgets/MyRelevantDeadlines.tsx.ejs +144 -0
  192. package/hedhog/frontend/app/dashboard/widgets/MyTimesheetStatusKpi.tsx.ejs +78 -0
  193. package/hedhog/frontend/app/dashboard/widgets/MyWeeklyJourney.tsx.ejs +99 -0
  194. package/hedhog/frontend/app/dashboard/widgets/PortfolioCostsKpi.tsx.ejs +112 -0
  195. package/hedhog/frontend/app/dashboard/widgets/PortfolioEffortKpi.tsx.ejs +93 -0
  196. package/hedhog/frontend/app/dashboard/widgets/PortfolioProjectsKpi.tsx.ejs +96 -0
  197. package/hedhog/frontend/app/dashboard/widgets/PortfolioRiskKpi.tsx.ejs +115 -0
  198. package/hedhog/frontend/app/dashboard/widgets/ProjectStatusOverview.tsx.ejs +120 -0
  199. package/hedhog/frontend/app/dashboard/widgets/StrategicDeadlines.tsx.ejs +146 -0
  200. package/hedhog/frontend/app/dashboard/widgets/TeamApprovalQueue.tsx.ejs +108 -0
  201. package/hedhog/frontend/app/dashboard/widgets/TeamCapacityKpi.tsx.ejs +97 -0
  202. package/hedhog/frontend/app/dashboard/widgets/TeamHeadcountKpi.tsx.ejs +100 -0
  203. package/hedhog/frontend/app/dashboard/widgets/TeamHoursKpi.tsx.ejs +104 -0
  204. package/hedhog/frontend/app/dashboard/widgets/TeamPendingApprovalsKpi.tsx.ejs +110 -0
  205. package/hedhog/frontend/app/dashboard/widgets/TeamUtilizationOverview.tsx.ejs +115 -0
  206. package/hedhog/frontend/app/dashboard/widgets/TeamWorkloadAlerts.tsx.ejs +117 -0
  207. package/hedhog/frontend/app/dashboard/widgets/index.ts.ejs +26 -0
  208. package/hedhog/frontend/app/departments/page.tsx.ejs +6 -1
  209. package/hedhog/frontend/app/my-projects/page.tsx.ejs +59 -16
  210. package/hedhog/frontend/app/my-tasks/page.tsx.ejs +329 -106
  211. package/hedhog/frontend/app/project-cost-categories/page.tsx.ejs +58 -52
  212. package/hedhog/frontend/app/project-cost-types/page.tsx.ejs +58 -51
  213. package/hedhog/frontend/app/projects/page.tsx.ejs +436 -35
  214. package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +65 -52
  215. package/hedhog/frontend/app/reports/projects/page.tsx.ejs +80 -82
  216. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +13 -2
  217. package/hedhog/frontend/app/time-off/page.tsx.ejs +6 -1
  218. package/hedhog/frontend/app/timesheets/page.tsx.ejs +10 -4
  219. package/hedhog/frontend/messages/en.json +460 -61
  220. package/hedhog/frontend/messages/operations/en.json +61 -52
  221. package/hedhog/frontend/messages/operations/pt.json +59 -43
  222. package/hedhog/frontend/messages/pt.json +460 -61
  223. package/hedhog/frontend/widgets/capacity-distribution.tsx.ejs +17 -0
  224. package/hedhog/frontend/widgets/effort-by-project.tsx.ejs +17 -0
  225. package/hedhog/frontend/widgets/headcount-by-area.tsx.ejs +17 -0
  226. package/hedhog/frontend/widgets/index.ts.ejs +25 -0
  227. package/hedhog/frontend/widgets/managed-projects-status.tsx.ejs +17 -0
  228. package/hedhog/frontend/widgets/my-hours-period-kpi.tsx.ejs +17 -0
  229. package/hedhog/frontend/widgets/my-open-requests-kpi.tsx.ejs +17 -0
  230. package/hedhog/frontend/widgets/my-pending-requests-list.tsx.ejs +17 -0
  231. package/hedhog/frontend/widgets/my-project-allocations-kpi.tsx.ejs +17 -0
  232. package/hedhog/frontend/widgets/my-quick-actions.tsx.ejs +17 -0
  233. package/hedhog/frontend/widgets/my-relevant-deadlines.tsx.ejs +17 -0
  234. package/hedhog/frontend/widgets/my-timesheet-status-kpi.tsx.ejs +17 -0
  235. package/hedhog/frontend/widgets/my-weekly-journey.tsx.ejs +17 -0
  236. package/hedhog/frontend/widgets/portfolio-costs-kpi.tsx.ejs +17 -0
  237. package/hedhog/frontend/widgets/portfolio-effort-kpi.tsx.ejs +17 -0
  238. package/hedhog/frontend/widgets/portfolio-projects-kpi.tsx.ejs +17 -0
  239. package/hedhog/frontend/widgets/portfolio-risk-kpi.tsx.ejs +17 -0
  240. package/hedhog/frontend/widgets/project-status-overview.tsx.ejs +17 -0
  241. package/hedhog/frontend/widgets/shared-operations-widget.tsx.ejs +170 -0
  242. package/hedhog/frontend/widgets/strategic-deadlines.tsx.ejs +17 -0
  243. package/hedhog/frontend/widgets/team-approval-queue.tsx.ejs +17 -0
  244. package/hedhog/frontend/widgets/team-capacity-kpi.tsx.ejs +17 -0
  245. package/hedhog/frontend/widgets/team-headcount-kpi.tsx.ejs +17 -0
  246. package/hedhog/frontend/widgets/team-hours-kpi.tsx.ejs +17 -0
  247. package/hedhog/frontend/widgets/team-pending-approvals-kpi.tsx.ejs +17 -0
  248. package/hedhog/frontend/widgets/team-utilization-overview.tsx.ejs +17 -0
  249. package/hedhog/frontend/widgets/team-workload-alerts.tsx.ejs +17 -0
  250. package/hedhog/table/operations_collaborator.yaml +8 -13
  251. package/hedhog/table/operations_project.yaml +1 -1
  252. package/hedhog/table/operations_project_file.yaml +23 -0
  253. package/hedhog/table/operations_task.yaml +76 -69
  254. package/hedhog/table/operations_task_activity.yaml +51 -0
  255. package/package.json +7 -6
  256. package/src/controllers/operations-projects.controller.ts +41 -8
  257. package/src/controllers/operations-tasks.controller.ts +156 -166
  258. package/src/dashboard/README.md +214 -0
  259. package/src/dashboard/components/DashboardLayout.tsx +131 -0
  260. package/src/dashboard/components/widget-registry.ts +255 -0
  261. package/src/dashboard/hooks/useDashboardData.ts +29 -0
  262. package/src/dashboard/types/widgets.types.ts +237 -0
  263. package/src/dashboard/widgets/CapacityDistribution.tsx +56 -0
  264. package/src/dashboard/widgets/EffortByProject.tsx +51 -0
  265. package/src/dashboard/widgets/HeadcountByArea.tsx +57 -0
  266. package/src/dashboard/widgets/ManagedProjectsStatus.tsx +53 -0
  267. package/src/dashboard/widgets/MyHoursPeriodKpi.tsx +87 -0
  268. package/src/dashboard/widgets/MyOpenRequestsKpi.tsx +51 -0
  269. package/src/dashboard/widgets/MyPendingRequestsList.tsx +63 -0
  270. package/src/dashboard/widgets/MyProjectAllocationsKpi.tsx +57 -0
  271. package/src/dashboard/widgets/MyQuickActions.tsx +62 -0
  272. package/src/dashboard/widgets/MyRelevantDeadlines.tsx +84 -0
  273. package/src/dashboard/widgets/MyTimesheetStatusKpi.tsx +65 -0
  274. package/src/dashboard/widgets/MyWeeklyJourney.tsx +57 -0
  275. package/src/dashboard/widgets/PortfolioCostsKpi.tsx +48 -0
  276. package/src/dashboard/widgets/PortfolioEffortKpi.tsx +41 -0
  277. package/src/dashboard/widgets/PortfolioRiskKpi.tsx +50 -0
  278. package/src/dashboard/widgets/ProjectStatusOverview.tsx +52 -0
  279. package/src/dashboard/widgets/StrategicDeadlines.tsx +93 -0
  280. package/src/dashboard/widgets/TeamApprovalQueue.tsx +70 -0
  281. package/src/dashboard/widgets/TeamCapacityKpi.tsx +50 -0
  282. package/src/dashboard/widgets/TeamHoursKpi.tsx +51 -0
  283. package/src/dashboard/widgets/TeamPendingApprovalsKpi.tsx +53 -0
  284. package/src/dashboard/widgets/TeamUtilizationOverview.tsx +62 -0
  285. package/src/dashboard/widgets/TeamWorkloadAlerts.tsx +81 -0
  286. package/src/dashboard/widgets/index.ts +26 -0
  287. package/src/dto/create-collaborator.dto.ts +4 -11
  288. package/src/index.ts +3 -0
  289. package/src/operations.service.spec.ts +988 -764
  290. package/src/operations.service.ts +4300 -2538
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='capacity-distribution' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='effort-by-project' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='headcount-by-area' />;
17
+ }
@@ -0,0 +1,25 @@
1
+ export { default as MyHoursPeriodKpi } from './operations.my-hours-period-kpi';
2
+ export { default as MyTimesheetStatusKpi } from './operations.my-timesheet-status-kpi';
3
+ export { default as MyProjectAllocationsKpi } from './operations.my-project-allocations-kpi';
4
+ export { default as MyOpenRequestsKpi } from './operations.my-open-requests-kpi';
5
+ export { default as MyWeeklyJourney } from './operations.my-weekly-journey';
6
+ export { default as MyRelevantDeadlines } from './operations.my-relevant-deadlines';
7
+ export { default as MyPendingRequestsList } from './operations.my-pending-requests-list';
8
+ export { default as MyQuickActions } from './operations.my-quick-actions';
9
+ export { default as TeamHeadcountKpi } from './operations.team-headcount-kpi';
10
+ export { default as TeamPendingApprovalsKpi } from './operations.team-pending-approvals-kpi';
11
+ export { default as TeamHoursKpi } from './operations.team-hours-kpi';
12
+ export { default as TeamCapacityKpi } from './operations.team-capacity-kpi';
13
+ export { default as TeamUtilizationOverview } from './operations.team-utilization-overview';
14
+ export { default as TeamWorkloadAlerts } from './operations.team-workload-alerts';
15
+ export { default as ManagedProjectsStatus } from './operations.managed-projects-status';
16
+ export { default as TeamApprovalQueue } from './operations.team-approval-queue';
17
+ export { default as PortfolioProjectsKpi } from './operations.portfolio-projects-kpi';
18
+ export { default as PortfolioCostsKpi } from './operations.portfolio-costs-kpi';
19
+ export { default as PortfolioEffortKpi } from './operations.portfolio-effort-kpi';
20
+ export { default as PortfolioRiskKpi } from './operations.portfolio-risk-kpi';
21
+ export { default as ProjectStatusOverview } from './operations.project-status-overview';
22
+ export { default as EffortByProject } from './operations.effort-by-project';
23
+ export { default as CapacityDistribution } from './operations.capacity-distribution';
24
+ export { default as HeadcountByArea } from './operations.headcount-by-area';
25
+ export { default as StrategicDeadlines } from './operations.strategic-deadlines';
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='managed-projects-status' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-hours-period-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-open-requests-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-pending-requests-list' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-project-allocations-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-quick-actions' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-relevant-deadlines' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-timesheet-status-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='my-weekly-journey' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='portfolio-costs-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='portfolio-effort-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='portfolio-projects-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='portfolio-risk-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='project-status-overview' />;
17
+ }
@@ -0,0 +1,170 @@
1
+ 'use client';
2
+
3
+ import { WidgetWrapper } from '@/app/(app)/(libraries)/core/dashboard/components';
4
+ import { Card, CardContent } from '@/components/ui/card';
5
+ import { useWidgetData } from '@/hooks/use-widget-data';
6
+
7
+ interface WidgetLayoutLike {
8
+ name?: string;
9
+ slug?: string;
10
+ }
11
+
12
+ interface OperationsWidgetProps {
13
+ widget?: WidgetLayoutLike;
14
+ onRemove?: () => void;
15
+ }
16
+
17
+ interface OperationsDashboardData {
18
+ actor: {
19
+ roleScope: 'self' | 'team' | 'full';
20
+ collaboratorId: number | null;
21
+ collaboratorName: string | null;
22
+ teamSize: number;
23
+ };
24
+ cards: {
25
+ projectsTotal: number;
26
+ activeProjects: number;
27
+ visibleTimesheets: number;
28
+ pendingTimesheets: number;
29
+ timeOffRequests: number;
30
+ scheduleAdjustmentRequests: number;
31
+ pendingApprovals: number;
32
+ };
33
+ recentTimesheets: Array<{
34
+ id: number;
35
+ collaboratorName: string;
36
+ weekStartDate: string;
37
+ weekEndDate: string;
38
+ totalHours: number | null;
39
+ status: string;
40
+ }>;
41
+ }
42
+
43
+ interface SharedOperationsWidgetProps extends OperationsWidgetProps {
44
+ slug: string;
45
+ }
46
+
47
+ const buildSummary = (slug: string, data: OperationsDashboardData | undefined) => {
48
+ const cards = data?.cards;
49
+ const actor = data?.actor;
50
+
51
+ const fallback = {
52
+ value: 0,
53
+ caption: 'Sem dados disponiveis',
54
+ detail: 'Aguardando sincronizacao com o dashboard.',
55
+ };
56
+
57
+ if (!cards || !actor) {
58
+ return fallback;
59
+ }
60
+
61
+ const map: Record<string, { value: number; caption: string; detail: string }> = {
62
+ 'my-hours-period-kpi': {
63
+ value: cards.visibleTimesheets,
64
+ caption: 'Lacamentos visiveis',
65
+ detail: `Timesheets pendentes: ${cards.pendingTimesheets}`,
66
+ },
67
+ 'my-timesheet-status-kpi': {
68
+ value: cards.pendingTimesheets,
69
+ caption: 'Timesheets pendentes',
70
+ detail: `Timesheets visiveis: ${cards.visibleTimesheets}`,
71
+ },
72
+ 'my-project-allocations-kpi': {
73
+ value: cards.activeProjects,
74
+ caption: 'Projetos ativos',
75
+ detail: `Projetos visiveis: ${cards.projectsTotal}`,
76
+ },
77
+ 'my-open-requests-kpi': {
78
+ value: cards.timeOffRequests + cards.scheduleAdjustmentRequests,
79
+ caption: 'Solicitacoes abertas',
80
+ detail: `Folgas: ${cards.timeOffRequests} · Ajustes: ${cards.scheduleAdjustmentRequests}`,
81
+ },
82
+ 'team-headcount-kpi': {
83
+ value: actor.teamSize,
84
+ caption: 'Tamanho da equipe',
85
+ detail: `Escopo atual: ${actor.roleScope}`,
86
+ },
87
+ 'team-pending-approvals-kpi': {
88
+ value: cards.pendingApprovals,
89
+ caption: 'Aprovacoes pendentes',
90
+ detail: `Timesheets pendentes: ${cards.pendingTimesheets}`,
91
+ },
92
+ 'team-hours-kpi': {
93
+ value: cards.visibleTimesheets,
94
+ caption: 'Horas em timesheets',
95
+ detail: `Escopo atual: ${actor.roleScope}`,
96
+ },
97
+ 'team-capacity-kpi': {
98
+ value: actor.teamSize,
99
+ caption: 'Capacidade monitorada',
100
+ detail: `Solicitacoes em aberto: ${cards.timeOffRequests + cards.scheduleAdjustmentRequests}`,
101
+ },
102
+ 'portfolio-projects-kpi': {
103
+ value: cards.projectsTotal,
104
+ caption: 'Projetos do portfolio',
105
+ detail: `Projetos ativos: ${cards.activeProjects}`,
106
+ },
107
+ 'portfolio-costs-kpi': {
108
+ value: cards.pendingApprovals,
109
+ caption: 'Itens aguardando aprovacao',
110
+ detail: 'Use este KPI para identificar impacto operacional imediato.',
111
+ },
112
+ 'portfolio-effort-kpi': {
113
+ value: cards.visibleTimesheets,
114
+ caption: 'Esforco registrado',
115
+ detail: `Timesheets pendentes: ${cards.pendingTimesheets}`,
116
+ },
117
+ 'portfolio-risk-kpi': {
118
+ value: cards.pendingApprovals,
119
+ caption: 'Risco operacional',
120
+ detail: 'Pendencias de aprovacao podem indicar gargalos.',
121
+ },
122
+ };
123
+
124
+ if (map[slug]) {
125
+ return map[slug];
126
+ }
127
+
128
+ return {
129
+ value: data.recentTimesheets.length,
130
+ caption: 'Atualizacoes recentes',
131
+ detail: `Escopo ${actor.roleScope} · ${data.recentTimesheets.length} registros recentes`,
132
+ };
133
+ };
134
+
135
+ export default function SharedOperationsWidget({
136
+ widget,
137
+ onRemove,
138
+ slug,
139
+ }: SharedOperationsWidgetProps) {
140
+ const { data, isLoading, isAccessDenied, isError } =
141
+ useWidgetData<OperationsDashboardData>({
142
+ endpoint: '/operations/dashboard',
143
+ queryKey: 'operations-dashboard-shared',
144
+ });
145
+
146
+ const summary = buildSummary(slug, data);
147
+ const title = widget?.name || slug;
148
+
149
+ return (
150
+ <WidgetWrapper
151
+ isLoading={isLoading}
152
+ isAccessDenied={isAccessDenied}
153
+ isError={isError}
154
+ widgetName={title}
155
+ onRemove={onRemove}
156
+ >
157
+ <Card className="h-full border-border/60 bg-linear-to-br from-background to-slate-50/40 shadow-sm">
158
+ <CardContent className="flex h-full flex-col justify-between gap-3 p-4">
159
+ <div>
160
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-muted-foreground">
161
+ {summary.caption}
162
+ </p>
163
+ <p className="mt-2 text-3xl font-bold text-foreground">{summary.value}</p>
164
+ </div>
165
+ <p className="text-xs text-muted-foreground">{summary.detail}</p>
166
+ </CardContent>
167
+ </Card>
168
+ </WidgetWrapper>
169
+ );
170
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='strategic-deadlines' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-approval-queue' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-capacity-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-headcount-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-hours-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-pending-approvals-kpi' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-utilization-overview' />;
17
+ }
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import SharedOperationsWidget from './operations.shared-operations-widget';
4
+
5
+ interface WidgetLayoutLike {
6
+ name?: string;
7
+ slug?: string;
8
+ }
9
+
10
+ interface OperationsWidgetProps {
11
+ widget?: WidgetLayoutLike;
12
+ onRemove?: () => void;
13
+ }
14
+
15
+ export default function OperationsWidget(props: OperationsWidgetProps) {
16
+ return <SharedOperationsWidget {...props} slug='team-workload-alerts' />;
17
+ }