@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,117 @@
1
+ 'use client';
2
+
3
+ import { AlertTriangle, Clock, TrendingDown, Users } from 'lucide-react';
4
+ import { useTranslations } from 'next-intl';
5
+ import React from 'react';
6
+
7
+ interface Alert {
8
+ id: string;
9
+ type: 'overload' | 'underload' | 'deadline' | 'absence';
10
+ severity: 'critical' | 'warning' | 'info';
11
+ title: string;
12
+ description: string;
13
+ affectedCount: number;
14
+ }
15
+
16
+ interface TeamWorkloadAlertsProps {
17
+ slug: string;
18
+ title: string;
19
+ roleSlug: string;
20
+ width?: number;
21
+ height?: number;
22
+ data?: { alerts: Alert[]; criticalCount: number };
23
+ style?: React.CSSProperties;
24
+ }
25
+
26
+ const TeamWorkloadAlerts: React.FC<TeamWorkloadAlertsProps> = ({
27
+ title,
28
+ data = { alerts: [], criticalCount: 0 },
29
+ style,
30
+ }) => {
31
+ const t = useTranslations('operations.TeamWorkloadAlerts');
32
+ const getAlertIcon = (type: string) =>
33
+ ({ overload: '⚠️', underload: '📉', deadline: '⏰', absence: '👤' })[
34
+ type
35
+ ] || '📋';
36
+ const getAlertColor = (severity: string) => {
37
+ switch (severity) {
38
+ case 'critical':
39
+ return 'bg-red-50 border-red-300 border-l-4';
40
+ case 'warning':
41
+ return 'bg-yellow-50 border-yellow-300 border-l-4';
42
+ default:
43
+ return 'bg-blue-50 border-blue-300 border-l-4';
44
+ }
45
+ };
46
+ const getSeverityDot = (severity: string) =>
47
+ severity === 'critical'
48
+ ? 'bg-red-500 animate-pulse'
49
+ : severity === 'warning'
50
+ ? 'bg-yellow-500'
51
+ : 'bg-blue-500';
52
+
53
+ return (
54
+ <div
55
+ className="bg-linear-to-br from-white to-yellow-50 rounded-lg shadow-sm p-4 border border-yellow-100"
56
+ style={style}
57
+ >
58
+ <div className="flex items-center justify-between mb-4">
59
+ <h3 className="text-sm font-medium text-gray-700">{title}</h3>
60
+ {data.criticalCount > 0 && (
61
+ <AlertTriangle className="w-5 h-5 text-red-600 animate-pulse" />
62
+ )}
63
+ </div>
64
+ <div className="space-y-3">
65
+ {data.alerts.length === 0 ? (
66
+ <div className="text-center py-6">
67
+ <TrendingDown className="w-8 h-8 text-green-400 mx-auto mb-2" />
68
+ <p className="text-sm text-gray-600">{t('empty')}</p>
69
+ </div>
70
+ ) : (
71
+ <>
72
+ {data.criticalCount > 0 && (
73
+ <div className="bg-red-100 rounded-lg p-3 border border-red-300 flex items-center gap-2">
74
+ <AlertTriangle className="w-4 h-4 text-red-600 flex-shrink-0" />
75
+ <span className="text-xs font-bold text-red-700">
76
+ {data.criticalCount} alerta(s) crítico(s)
77
+ </span>
78
+ </div>
79
+ )}
80
+ <div className="space-y-2 max-h-64 overflow-y-auto">
81
+ {data.alerts.map((alert) => (
82
+ <div
83
+ key={alert.id}
84
+ className={`rounded-lg p-3 border ${getAlertColor(alert.severity)}`}
85
+ >
86
+ <div className="flex items-start gap-2">
87
+ <div
88
+ className={`w-2 h-2 rounded-full ${getSeverityDot(alert.severity)} mt-1.5 flex-shrink-0`}
89
+ />
90
+ <div className="flex-1">
91
+ <p className="text-sm font-medium text-gray-900">
92
+ {alert.title}
93
+ </p>
94
+ <p className="text-xs text-gray-700 my-1">
95
+ {alert.description}
96
+ </p>
97
+ <div className="flex items-center gap-1 text-xs text-gray-600">
98
+ <Users className="w-3 h-3" />
99
+ <span>{alert.affectedCount} envolvido(s)</span>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ ))}
105
+ </div>
106
+ </>
107
+ )}
108
+ <div className="pt-2 border-t border-yellow-100 text-xs text-gray-600 flex items-center gap-1">
109
+ <Clock className="w-3 h-3" />
110
+ <span>{t('lastUpdated')}</span>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ );
115
+ };
116
+
117
+ export default TeamWorkloadAlerts;
@@ -0,0 +1,26 @@
1
+ // Dashboard Widgets - Exports
2
+ export { default as MyHoursPeriodKpi } from './MyHoursPeriodKpi';
3
+ export { default as MyOpenRequestsKpi } from './MyOpenRequestsKpi';
4
+ export { default as MyPendingRequestsList } from './MyPendingRequestsList';
5
+ export { default as MyProjectAllocationsKpi } from './MyProjectAllocationsKpi';
6
+ export { default as MyQuickActions } from './MyQuickActions';
7
+ export { default as MyRelevantDeadlines } from './MyRelevantDeadlines';
8
+ export { default as MyTimesheetStatusKpi } from './MyTimesheetStatusKpi';
9
+ export { default as MyWeeklyJourney } from './MyWeeklyJourney';
10
+
11
+ export { default as ManagedProjectsStatus } from './ManagedProjectsStatus';
12
+ export { default as TeamApprovalQueue } from './TeamApprovalQueue';
13
+ export { default as TeamCapacityKpi } from './TeamCapacityKpi';
14
+ export { default as TeamHoursKpi } from './TeamHoursKpi';
15
+ export { default as TeamPendingApprovalsKpi } from './TeamPendingApprovalsKpi';
16
+ export { default as TeamUtilizationOverview } from './TeamUtilizationOverview';
17
+ export { default as TeamWorkloadAlerts } from './TeamWorkloadAlerts';
18
+
19
+ export { default as CapacityDistribution } from './CapacityDistribution';
20
+ export { default as EffortByProject } from './EffortByProject';
21
+ export { default as HeadcountByArea } from './HeadcountByArea';
22
+ export { default as PortfolioCostsKpi } from './PortfolioCostsKpi';
23
+ export { default as PortfolioEffortKpi } from './PortfolioEffortKpi';
24
+ export { default as PortfolioRiskKpi } from './PortfolioRiskKpi';
25
+ export { default as ProjectStatusOverview } from './ProjectStatusOverview';
26
+ export { default as StrategicDeadlines } from './StrategicDeadlines';
@@ -33,6 +33,7 @@ import { useMemo, useState } from 'react';
33
33
  import { OperationsHeader } from '../_components/operations-header';
34
34
  import { StatusBadge } from '../_components/status-badge';
35
35
  import { fetchOperations, mutateOperations } from '../_lib/api';
36
+ import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
36
37
  import { useOperationsAccess } from '../_lib/hooks/use-operations-access';
37
38
  import type { OperationsDepartment, PaginatedResponse } from '../_lib/types';
38
39
  import { formatEnumLabel, getStatusBadgeClass } from '../_lib/utils/format';
@@ -68,7 +69,11 @@ export default function OperationsDepartmentsPage() {
68
69
  'all' | 'active' | 'inactive'
69
70
  >('all');
70
71
  const [page, setPage] = useState(1);
71
- const [pageSize, setPageSize] = useState(12);
72
+ const [pageSize, setPageSize] = usePersistedPageSize({
73
+ storageKey: 'pagination:operations-departments:pageSize',
74
+ defaultValue: 12,
75
+ allowedValues: [12, 24, 48],
76
+ });
72
77
  const [viewMode, setViewMode] = useState<'table' | 'cards'>(() => {
73
78
  if (typeof window === 'undefined') return 'table';
74
79
  const saved = window.localStorage.getItem(
@@ -6,6 +6,7 @@ import {
6
6
  PaginationFooter,
7
7
  SearchBar,
8
8
  } from '@/components/entity-list';
9
+ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
9
10
  import { Button } from '@/components/ui/button';
10
11
  import { Card, CardContent } from '@/components/ui/card';
11
12
  import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
@@ -18,15 +19,16 @@ import {
18
19
  TableRow,
19
20
  } from '@/components/ui/table';
20
21
  import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
22
+ import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
21
23
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
22
24
  import {
23
25
  CalendarDays,
26
+ CheckCircle2,
24
27
  Eye,
25
28
  FolderKanban,
26
29
  LayoutGrid,
27
30
  List,
28
31
  PlayCircle,
29
- ShieldAlert,
30
32
  } from 'lucide-react';
31
33
  import { useTranslations } from 'next-intl';
32
34
  import Link from 'next/link';
@@ -41,6 +43,22 @@ const MY_PROJECTS_VIEW_STORAGE_KEY = 'operations-my-projects-view-mode';
41
43
 
42
44
  type ProjectViewMode = 'table' | 'cards';
43
45
 
46
+ function getPersonAvatarUrl(avatarId?: number | null): string {
47
+ return typeof avatarId === 'number' && avatarId > 0
48
+ ? `${process.env.NEXT_PUBLIC_API_BASE_URL}/person/avatar/${avatarId}`
49
+ : '/placeholder.png';
50
+ }
51
+
52
+ function getInitials(value?: string | null): string {
53
+ if (!value) return '?';
54
+ return value
55
+ .split(' ')
56
+ .filter(Boolean)
57
+ .slice(0, 2)
58
+ .map((w) => w[0]!.toUpperCase())
59
+ .join('');
60
+ }
61
+
44
62
  export default function OperationsMyProjectsPage() {
45
63
  const t = useTranslations('operations.MyProjectsPage');
46
64
  const commonT = useTranslations('operations.Common');
@@ -56,7 +74,11 @@ export default function OperationsMyProjectsPage() {
56
74
  const [search, setSearch] = useState('');
57
75
  const [statusFilter, setStatusFilter] = useState('all');
58
76
  const [page, setPage] = useState(1);
59
- const [pageSize, setPageSize] = useState(12);
77
+ const [pageSize, setPageSize] = usePersistedPageSize({
78
+ storageKey: 'pagination:operations-my-projects:pageSize',
79
+ defaultValue: 12,
80
+ allowedValues: [12, 24, 48],
81
+ });
60
82
  const [viewMode, setViewMode] = useState<ProjectViewMode>(() => {
61
83
  if (typeof window === 'undefined') {
62
84
  return 'table';
@@ -124,13 +146,13 @@ export default function OperationsMyProjectsPage() {
124
146
  iconContainerClassName: 'bg-green-50 text-green-600',
125
147
  },
126
148
  {
127
- key: 'atRisk',
128
- title: t('cards.atRisk'),
129
- description: t('cards.atRiskDescription'),
130
- value: projects.filter((item) => item.status === 'at_risk').length,
131
- icon: ShieldAlert,
132
- accentClassName: 'from-amber-500/20 via-orange-500/10 to-transparent',
133
- iconContainerClassName: 'bg-amber-50 text-amber-600',
149
+ key: 'completed',
150
+ title: t('cards.completed'),
151
+ description: t('cards.completedDescription'),
152
+ value: projects.filter((item) => item.status === 'completed').length,
153
+ icon: CheckCircle2,
154
+ accentClassName: 'from-sky-500/20 via-cyan-500/10 to-transparent',
155
+ iconContainerClassName: 'bg-sky-50 text-sky-600',
134
156
  },
135
157
  {
136
158
  key: 'upcomingDeliveries',
@@ -193,7 +215,6 @@ export default function OperationsMyProjectsPage() {
193
215
  { value: 'all', label: commonT('filters.allStatuses') },
194
216
  { value: 'planning', label: tProjectStatus('planning') },
195
217
  { value: 'active', label: tProjectStatus('active') },
196
- { value: 'at_risk', label: tProjectStatus('at_risk') },
197
218
  { value: 'paused', label: tProjectStatus('paused') },
198
219
  { value: 'completed', label: tProjectStatus('completed') },
199
220
  { value: 'archived', label: tProjectStatus('archived') },
@@ -266,11 +287,22 @@ export default function OperationsMyProjectsPage() {
266
287
  </div>
267
288
 
268
289
  <div className="grid gap-2 text-sm text-muted-foreground lg:grid-cols-2">
269
- <div>
270
- <span className="font-medium text-foreground">
290
+ <div className="flex flex-wrap items-center gap-1.5">
291
+ <span className="shrink-0 font-medium text-foreground">
271
292
  {commonT('labels.client')}:
272
- </span>{' '}
273
- {project.clientName || commonT('labels.notAvailable')}
293
+ </span>
294
+ <Avatar className="h-5 w-5 shrink-0">
295
+ <AvatarImage
296
+ src={getPersonAvatarUrl(project.clientAvatarId)}
297
+ alt={project.clientName ?? ''}
298
+ />
299
+ <AvatarFallback className="text-[9px] font-medium">
300
+ {getInitials(project.clientName)}
301
+ </AvatarFallback>
302
+ </Avatar>
303
+ <span className="truncate">
304
+ {project.clientName || commonT('labels.notAvailable')}
305
+ </span>
274
306
  </div>
275
307
  <div>
276
308
  <span className="font-medium text-foreground">
@@ -367,8 +399,19 @@ export default function OperationsMyProjectsPage() {
367
399
  </div>
368
400
  </TableCell>
369
401
  <TableCell>
370
- <div className="truncate">
371
- {project.clientName || commonT('labels.notAvailable')}
402
+ <div className="flex min-w-0 items-center gap-1.5">
403
+ <Avatar className="h-6 w-6 shrink-0">
404
+ <AvatarImage
405
+ src={getPersonAvatarUrl(project.clientAvatarId)}
406
+ alt={project.clientName ?? ''}
407
+ />
408
+ <AvatarFallback className="text-[9px] font-medium">
409
+ {getInitials(project.clientName)}
410
+ </AvatarFallback>
411
+ </Avatar>
412
+ <span className="truncate">
413
+ {project.clientName || commonT('labels.notAvailable')}
414
+ </span>
372
415
  </div>
373
416
  </TableCell>
374
417
  <TableCell>