@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,99 @@
1
+ 'use client';
2
+
3
+ import { Clock, FileText, User } from 'lucide-react';
4
+ import React from 'react';
5
+
6
+ interface Request {
7
+ id: string;
8
+ type: string;
9
+ description: string;
10
+ submittedDate: string;
11
+ daysWaiting: number;
12
+ assignee?: string;
13
+ }
14
+
15
+ interface MyPendingRequestsListProps {
16
+ slug: string;
17
+ title: string;
18
+ roleSlug: string;
19
+ width?: number;
20
+ height?: number;
21
+ data?: { requests: Request[] };
22
+ style?: React.CSSProperties;
23
+ }
24
+
25
+ const MyPendingRequestsList: React.FC<MyPendingRequestsListProps> = ({
26
+ title,
27
+ data = { requests: [] },
28
+ style,
29
+ }) => {
30
+ const getTypeIcon = (type: string) => {
31
+ const icons: Record<string, string> = {
32
+ vacation: '🏖️',
33
+ schedule: '📅',
34
+ expense: '💰',
35
+ adjustment: '🔧',
36
+ };
37
+ return icons[type] || '📋';
38
+ };
39
+
40
+ return (
41
+ <div
42
+ className="bg-linear-to-br from-white to-violet-50 rounded-lg shadow-sm p-4 border border-violet-100"
43
+ style={style}
44
+ >
45
+ <div className="flex items-center justify-between mb-4">
46
+ <h3 className="text-sm font-medium text-gray-700">{title}</h3>
47
+ <span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-violet-100 text-violet-800">
48
+ {data.requests.length}
49
+ </span>
50
+ </div>
51
+ <div className="space-y-2 max-h-72 overflow-y-auto">
52
+ {data.requests.length === 0 ? (
53
+ <div className="text-center py-8">
54
+ <FileText className="w-8 h-8 text-gray-300 mx-auto mb-2" />
55
+ <p className="text-sm text-gray-600">
56
+ Nenhuma solicitação pendente
57
+ </p>
58
+ </div>
59
+ ) : (
60
+ data.requests.map((request) => (
61
+ <div
62
+ key={request.id}
63
+ className={`rounded-lg p-3 border transition-all ${request.daysWaiting > 14 ? 'bg-red-50 border-red-200' : request.daysWaiting > 7 ? 'bg-yellow-50 border-yellow-200' : 'bg-blue-50 border-blue-200'}`}
64
+ >
65
+ <div className="flex items-start gap-2 mb-2">
66
+ <span className="text-lg">{getTypeIcon(request.type)}</span>
67
+ <div className="flex-1">
68
+ <p className="text-sm font-medium text-gray-900">
69
+ {request.description}
70
+ </p>
71
+ </div>
72
+ </div>
73
+ <div className="grid grid-cols-2 gap-2 text-xs">
74
+ <div className="flex items-center gap-1 text-gray-700">
75
+ <Clock className="w-3 h-3" />
76
+ <span>
77
+ {request.daysWaiting === 0
78
+ ? 'Hoje'
79
+ : request.daysWaiting === 1
80
+ ? 'Ontem'
81
+ : `${request.daysWaiting}d atrás`}
82
+ </span>
83
+ </div>
84
+ {request.assignee && (
85
+ <div className="flex items-center gap-1 text-gray-700">
86
+ <User className="w-3 h-3" />
87
+ <span className="truncate">{request.assignee}</span>
88
+ </div>
89
+ )}
90
+ </div>
91
+ </div>
92
+ ))
93
+ )}
94
+ </div>
95
+ </div>
96
+ );
97
+ };
98
+
99
+ export default MyPendingRequestsList;
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+
3
+ import { Briefcase } from 'lucide-react';
4
+ import { useTranslations } from 'next-intl';
5
+ import React from 'react';
6
+
7
+ interface MyProjectAllocationsKpiProps {
8
+ slug: string;
9
+ title: string;
10
+ roleSlug: string;
11
+ width?: number;
12
+ height?: number;
13
+ data?: {
14
+ activeAllocations: number;
15
+ totalCapacity: number;
16
+ usedCapacity: number;
17
+ projects: Array<{ name: string; allocation: number; color: string }>;
18
+ };
19
+ style?: React.CSSProperties;
20
+ }
21
+
22
+ const MyProjectAllocationsKpi: React.FC<MyProjectAllocationsKpiProps> = ({
23
+ title,
24
+ data = {
25
+ activeAllocations: 0,
26
+ totalCapacity: 100,
27
+ usedCapacity: 0,
28
+ projects: [],
29
+ },
30
+ style,
31
+ }) => {
32
+ const t = useTranslations('operations.MyProjectAllocationsKpi');
33
+ const capacityPercent = Math.round(
34
+ (data.usedCapacity / data.totalCapacity) * 100
35
+ );
36
+
37
+ return (
38
+ <div
39
+ className="bg-linear-to-br from-white to-indigo-50 rounded-lg shadow-sm p-4 border border-indigo-100"
40
+ style={style}
41
+ >
42
+ <h3 className="text-sm font-medium text-gray-700 mb-4">{title}</h3>
43
+ <div className="flex items-center gap-3 bg-indigo-50 rounded-lg p-3 mb-3">
44
+ <Briefcase className="w-5 h-5 text-indigo-600" />
45
+ <div>
46
+ <div className="text-xs text-gray-600">{t('activeProjects')}</div>
47
+ <div className="text-2xl font-bold text-indigo-600">
48
+ {data.activeAllocations}
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <div className="space-y-2">
53
+ <div className="flex justify-between items-center">
54
+ <span className="text-xs font-medium text-gray-700">
55
+ {t('capacity')}
56
+ </span>
57
+ <span
58
+ className={`text-xs font-bold px-2 py-1 rounded-full ${capacityPercent > 85 ? 'bg-red-100 text-red-700' : capacityPercent > 70 ? 'bg-yellow-100 text-yellow-700' : 'bg-green-100 text-green-700'}`}
59
+ >
60
+ {capacityPercent}%
61
+ </span>
62
+ </div>
63
+ <div className="relative w-full h-3 bg-gray-200 rounded-full overflow-hidden">
64
+ <div
65
+ className="h-full bg-linear-to-r from-indigo-400 to-indigo-600 transition-all"
66
+ style={{ width: `${Math.min(capacityPercent, 100)}%` }}
67
+ />
68
+ </div>
69
+ <div className="flex justify-between text-xs text-gray-600">
70
+ <span>{data.usedCapacity}h usado</span>
71
+ <span>{data.totalCapacity}h total</span>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ );
76
+ };
77
+
78
+ export default MyProjectAllocationsKpi;
@@ -0,0 +1,130 @@
1
+ 'use client';
2
+
3
+ import { Clock, FileText, Plus, Send } from 'lucide-react';
4
+ import { useTranslations } from 'next-intl';
5
+ import React from 'react';
6
+
7
+ interface QuickAction {
8
+ id: string;
9
+ label: string;
10
+ icon: React.ReactNode;
11
+ color: string;
12
+ bgColor: string;
13
+ onClick?: () => void;
14
+ }
15
+
16
+ interface MyQuickActionsProps {
17
+ slug: string;
18
+ title: string;
19
+ roleSlug: string;
20
+ width?: number;
21
+ height?: number;
22
+ data?: { actions?: QuickAction[] };
23
+ style?: React.CSSProperties;
24
+ }
25
+
26
+ const defaultActions: QuickAction[] = [
27
+ {
28
+ id: 'timesheet',
29
+ label: 'Registrar Timesheet',
30
+ icon: <Clock className="w-5 h-5" />,
31
+ color: 'text-blue-600',
32
+ bgColor: 'bg-blue-50 hover:bg-blue-100 border-blue-200',
33
+ },
34
+ {
35
+ id: 'request',
36
+ label: 'Nova Solicitação',
37
+ icon: <Plus className="w-5 h-5" />,
38
+ color: 'text-green-600',
39
+ bgColor: 'bg-green-50 hover:bg-green-100 border-green-200',
40
+ },
41
+ {
42
+ id: 'vacation',
43
+ label: 'Solicitar Férias',
44
+ icon: <Send className="w-5 h-5" />,
45
+ color: 'text-purple-600',
46
+ bgColor: 'bg-purple-50 hover:bg-purple-100 border-purple-200',
47
+ },
48
+ {
49
+ id: 'expense',
50
+ label: 'Lançar Despesa',
51
+ icon: <FileText className="w-5 h-5" />,
52
+ color: 'text-orange-600',
53
+ bgColor: 'bg-orange-50 hover:bg-orange-100 border-orange-200',
54
+ },
55
+ ];
56
+
57
+ const MyQuickActions: React.FC<MyQuickActionsProps> = ({
58
+ title,
59
+ data,
60
+ style,
61
+ }) => {
62
+ const t = useTranslations('operations.MyQuickActions');
63
+ const defaultActions: QuickAction[] = [
64
+ {
65
+ id: 'timesheet',
66
+ label: t('timesheetLabel'),
67
+ icon: <Clock className="w-5 h-5" />,
68
+ color: 'text-blue-600',
69
+ bgColor: 'bg-blue-50 hover:bg-blue-100 border-blue-200',
70
+ },
71
+ {
72
+ id: 'request',
73
+ label: t('requestLabel'),
74
+ icon: <Plus className="w-5 h-5" />,
75
+ color: 'text-green-600',
76
+ bgColor: 'bg-green-50 hover:bg-green-100 border-green-200',
77
+ },
78
+ {
79
+ id: 'vacation',
80
+ label: t('vacationLabel'),
81
+ icon: <Send className="w-5 h-5" />,
82
+ color: 'text-purple-600',
83
+ bgColor: 'bg-purple-50 hover:bg-purple-100 border-purple-200',
84
+ },
85
+ {
86
+ id: 'expense',
87
+ label: t('expenseLabel'),
88
+ icon: <FileText className="w-5 h-5" />,
89
+ color: 'text-orange-600',
90
+ bgColor: 'bg-orange-50 hover:bg-orange-100 border-orange-200',
91
+ },
92
+ ];
93
+ const actions = data?.actions ?? defaultActions;
94
+ return (
95
+ <div
96
+ className="bg-linear-to-br from-white to-emerald-50 rounded-lg shadow-sm p-4 border border-emerald-100"
97
+ style={style}
98
+ >
99
+ <h3 className="text-sm font-medium text-gray-700 mb-4">{title}</h3>
100
+ <div className="grid grid-cols-2 gap-2">
101
+ {actions.map((action) => (
102
+ <button
103
+ key={action.id}
104
+ onClick={action.onClick}
105
+ className={`${action.bgColor} border rounded-lg p-3 transition-all transform hover:scale-105 hover:shadow-md active:scale-95`}
106
+ >
107
+ <div
108
+ className={`${action.color} mb-2 transition-transform hover:scale-110`}
109
+ >
110
+ {action.icon}
111
+ </div>
112
+ <p className="text-xs font-medium text-gray-900 text-left">
113
+ {action.label}
114
+ </p>
115
+ </button>
116
+ ))}
117
+ </div>
118
+ <div className="mt-4 pt-4 border-t border-emerald-100">
119
+ <p className="text-xs text-gray-600 mb-2">{t('tipsTitle')}</p>
120
+ <ul className="text-xs space-y-1 text-gray-700">
121
+ <li>{t('tips.timesheet')}</li>
122
+ <li>{t('tips.vacation')}</li>
123
+ <li>{t('tips.expense')}</li>
124
+ </ul>
125
+ </div>
126
+ </div>
127
+ );
128
+ };
129
+
130
+ export default MyQuickActions;
@@ -0,0 +1,144 @@
1
+ 'use client';
2
+
3
+ import { AlertCircle, CheckCircle2, Clock } from 'lucide-react';
4
+ import { useTranslations } from 'next-intl';
5
+ import React from 'react';
6
+
7
+ interface Deadline {
8
+ id: string;
9
+ title: string;
10
+ dueDate: string;
11
+ daysLeft: number;
12
+ priority: 'high' | 'medium' | 'low';
13
+ status: 'on-track' | 'at-risk' | 'critical';
14
+ }
15
+
16
+ interface MyRelevantDeadlinesProps {
17
+ slug: string;
18
+ title: string;
19
+ roleSlug: string;
20
+ width?: number;
21
+ height?: number;
22
+ data?: { deadlines: Deadline[] };
23
+ style?: React.CSSProperties;
24
+ }
25
+
26
+ const MyRelevantDeadlines: React.FC<MyRelevantDeadlinesProps> = ({
27
+ title,
28
+ data = { deadlines: [] },
29
+ style,
30
+ }) => {
31
+ const t = useTranslations('operations.MyRelevantDeadlines');
32
+ const criticalCount = data.deadlines.filter(
33
+ (d) => d.status === 'critical'
34
+ ).length;
35
+ const atRiskCount = data.deadlines.filter(
36
+ (d) => d.status === 'at-risk'
37
+ ).length;
38
+
39
+ const getStatusColor = (status: string) => {
40
+ switch (status) {
41
+ case 'critical':
42
+ return {
43
+ bg: 'bg-red-50',
44
+ border: 'border-red-300',
45
+ dot: 'bg-red-500 animate-pulse',
46
+ text: 'text-red-700',
47
+ };
48
+ case 'at-risk':
49
+ return {
50
+ bg: 'bg-yellow-50',
51
+ border: 'border-yellow-300',
52
+ dot: 'bg-yellow-500',
53
+ text: 'text-yellow-700',
54
+ };
55
+ default:
56
+ return {
57
+ bg: 'bg-green-50',
58
+ border: 'border-green-300',
59
+ dot: 'bg-green-500',
60
+ text: 'text-green-700',
61
+ };
62
+ }
63
+ };
64
+
65
+ return (
66
+ <div
67
+ className="bg-linear-to-br from-white to-red-50 rounded-lg shadow-sm p-4 border border-red-100"
68
+ style={style}
69
+ >
70
+ <div className="flex items-center justify-between mb-4">
71
+ <h3 className="text-sm font-medium text-gray-700">{title}</h3>
72
+ {(criticalCount > 0 || atRiskCount > 0) && (
73
+ <AlertCircle className="w-4 h-4 text-red-600 animate-pulse" />
74
+ )}
75
+ </div>
76
+ <div className="space-y-3">
77
+ {data.deadlines.length === 0 ? (
78
+ <div className="text-center py-8">
79
+ <CheckCircle2 className="w-8 h-8 text-green-500 mx-auto mb-2" />
80
+ <p className="text-sm text-gray-600">{t('empty')}</p>
81
+ </div>
82
+ ) : (
83
+ <>
84
+ {(criticalCount > 0 || atRiskCount > 0) && (
85
+ <div className="grid grid-cols-2 gap-2 mb-3">
86
+ {criticalCount > 0 && (
87
+ <div className="bg-red-100 rounded-lg p-2 border border-red-300">
88
+ <div className="text-xs text-red-700 font-semibold">
89
+ {criticalCount} crítico{criticalCount !== 1 ? 's' : ''}
90
+ </div>
91
+ </div>
92
+ )}
93
+ {atRiskCount > 0 && (
94
+ <div className="bg-yellow-100 rounded-lg p-2 border border-yellow-300">
95
+ <div className="text-xs text-yellow-700 font-semibold">
96
+ {atRiskCount} em risco
97
+ </div>
98
+ </div>
99
+ )}
100
+ </div>
101
+ )}
102
+ <div className="space-y-2 max-h-64 overflow-y-auto">
103
+ {data.deadlines.slice(0, 5).map((deadline) => {
104
+ const colors = getStatusColor(deadline.status);
105
+ return (
106
+ <div
107
+ key={deadline.id}
108
+ className={`${colors.bg} rounded-lg p-3 border ${colors.border} hover:shadow-sm transition-all`}
109
+ >
110
+ <div className="flex items-start gap-2 mb-2">
111
+ <div
112
+ className={`w-3 h-3 rounded-full ${colors.dot} mt-1`}
113
+ />
114
+ <div className="flex-1">
115
+ <p className="text-sm font-medium text-gray-900 truncate">
116
+ {deadline.title}
117
+ </p>
118
+ </div>
119
+ </div>
120
+ <div className="flex items-center justify-between text-xs">
121
+ <div className="flex items-center gap-1 text-gray-700">
122
+ <Clock className="w-3 h-3" />
123
+ <span>{deadline.dueDate}</span>
124
+ </div>
125
+ <span
126
+ className={`font-semibold ${deadline.daysLeft <= 0 ? 'text-red-600' : deadline.daysLeft <= 3 ? 'text-orange-600' : 'text-gray-600'}`}
127
+ >
128
+ {deadline.daysLeft <= 0
129
+ ? t('overdue')
130
+ : `${deadline.daysLeft}d`}
131
+ </span>
132
+ </div>
133
+ </div>
134
+ );
135
+ })}
136
+ </div>
137
+ </>
138
+ )}
139
+ </div>
140
+ </div>
141
+ );
142
+ };
143
+
144
+ export default MyRelevantDeadlines;
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+
3
+ import { AlertCircle, CheckCircle2, Clock } from 'lucide-react';
4
+ import React from 'react';
5
+
6
+ interface MyTimesheetStatusKpiProps {
7
+ slug: string;
8
+ title: string;
9
+ roleSlug: string;
10
+ width?: number;
11
+ height?: number;
12
+ data?: { pendingCount: number; approvedCount: number; rejectedCount: number };
13
+ style?: React.CSSProperties;
14
+ }
15
+
16
+ const MyTimesheetStatusKpi: React.FC<MyTimesheetStatusKpiProps> = ({
17
+ title,
18
+ data = { pendingCount: 0, approvedCount: 0, rejectedCount: 0 },
19
+ style,
20
+ }) => {
21
+ const total = data.pendingCount + data.approvedCount + data.rejectedCount;
22
+
23
+ return (
24
+ <div
25
+ className="bg-linear-to-br from-white to-blue-50 rounded-lg shadow-sm p-4 border border-blue-100 hover:shadow-md transition-shadow"
26
+ style={style}
27
+ >
28
+ <h3 className="text-sm font-medium text-gray-700 mb-4">{title}</h3>
29
+ <div className="grid grid-cols-3 gap-2">
30
+ <div className="bg-yellow-50 rounded-lg p-3 border border-yellow-200">
31
+ <div className="flex items-center gap-2 mb-2">
32
+ <Clock className="w-4 h-4 text-yellow-600" />
33
+ <span className="text-xs font-medium text-yellow-700">
34
+ Pendente
35
+ </span>
36
+ </div>
37
+ <div className="text-2xl font-bold text-yellow-600">
38
+ {data.pendingCount}
39
+ </div>
40
+ </div>
41
+ <div className="bg-green-50 rounded-lg p-3 border border-green-200">
42
+ <div className="flex items-center gap-2 mb-2">
43
+ <CheckCircle2 className="w-4 h-4 text-green-600" />
44
+ <span className="text-xs font-medium text-green-700">Aprovado</span>
45
+ </div>
46
+ <div className="text-2xl font-bold text-green-600">
47
+ {data.approvedCount}
48
+ </div>
49
+ </div>
50
+ <div className="bg-red-50 rounded-lg p-3 border border-red-200">
51
+ <div className="flex items-center gap-2 mb-2">
52
+ <AlertCircle className="w-4 h-4 text-red-600" />
53
+ <span className="text-xs font-medium text-red-700">Rejeitado</span>
54
+ </div>
55
+ <div className="text-2xl font-bold text-red-600">
56
+ {data.rejectedCount}
57
+ </div>
58
+ </div>
59
+ </div>
60
+ <div className="pt-2 border-t border-blue-100 mt-3 space-y-2 text-xs">
61
+ <div className="flex justify-between">
62
+ <span className="text-gray-600">Total:</span>
63
+ <span className="font-semibold text-gray-900">{total}</span>
64
+ </div>
65
+ <div className="flex justify-between">
66
+ <span className="text-gray-600">Taxa aprovação:</span>
67
+ <span
68
+ className={`font-semibold ${total > 0 && data.approvedCount / total > 0.8 ? 'text-green-600' : 'text-yellow-600'}`}
69
+ >
70
+ {total > 0 ? Math.round((data.approvedCount / total) * 100) : 0}%
71
+ </span>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ );
76
+ };
77
+
78
+ export default MyTimesheetStatusKpi;
@@ -0,0 +1,99 @@
1
+ 'use client';
2
+
3
+ import { Calendar } from 'lucide-react';
4
+ import React from 'react';
5
+
6
+ interface MyWeeklyJourneyProps {
7
+ slug: string;
8
+ title: string;
9
+ roleSlug: string;
10
+ width?: number;
11
+ height?: number;
12
+ data?: {
13
+ weekDays: Array<{
14
+ day: string;
15
+ hours: number;
16
+ status: 'completed' | 'pending' | 'off';
17
+ }>;
18
+ weekProgress: number;
19
+ targetHours: number;
20
+ };
21
+ style?: React.CSSProperties;
22
+ }
23
+
24
+ const MyWeeklyJourney: React.FC<MyWeeklyJourneyProps> = ({
25
+ title,
26
+ data = { weekDays: [], weekProgress: 60, targetHours: 40 },
27
+ style,
28
+ }) => {
29
+ const totalHours = data.weekDays.reduce((sum, day) => sum + day.hours, 0);
30
+ const progressPercent = Math.min(
31
+ Math.round((totalHours / data.targetHours) * 100),
32
+ 100
33
+ );
34
+
35
+ const getStatusColor = (status: string) => {
36
+ switch (status) {
37
+ case 'completed':
38
+ return 'bg-gradient-to-t from-green-500 to-green-400';
39
+ case 'pending':
40
+ return 'bg-gradient-to-t from-gray-300 to-gray-200';
41
+ default:
42
+ return 'bg-gradient-to-t from-gray-100 to-gray-50';
43
+ }
44
+ };
45
+
46
+ return (
47
+ <div
48
+ className="bg-linear-to-br from-white to-cyan-50 rounded-lg shadow-sm p-4 border border-cyan-100"
49
+ style={style}
50
+ >
51
+ <div className="flex items-center justify-between mb-4">
52
+ <h3 className="text-sm font-medium text-gray-700">{title}</h3>
53
+ <Calendar className="w-4 h-4 text-cyan-600" />
54
+ </div>
55
+ <div className="space-y-2 mb-3">
56
+ <div className="flex justify-between items-center">
57
+ <span className="text-xs font-medium text-gray-700">
58
+ Progresso da Semana
59
+ </span>
60
+ <span className="text-xs font-bold text-cyan-600">
61
+ {progressPercent}%
62
+ </span>
63
+ </div>
64
+ <div className="relative w-full h-4 bg-gray-200 rounded-full overflow-hidden">
65
+ <div
66
+ className="h-full bg-linear-to-r from-cyan-400 to-cyan-600 rounded-full transition-all"
67
+ style={{ width: `${progressPercent}%` }}
68
+ />
69
+ </div>
70
+ <div className="flex justify-between text-xs text-gray-600">
71
+ <span>{totalHours}h registradas</span>
72
+ <span>{data.targetHours}h meta</span>
73
+ </div>
74
+ </div>
75
+ <div className="text-xs font-medium text-gray-700 mb-2">
76
+ Horas por dia
77
+ </div>
78
+ <div className="flex items-end justify-between gap-1 h-24 bg-gradient-to-b from-cyan-50 to-white rounded-lg p-3 border border-cyan-100">
79
+ {data.weekDays.map((day, idx) => (
80
+ <div key={idx} className="flex flex-col items-center flex-1 gap-1">
81
+ <div
82
+ className={`w-full rounded-t transition-all ${getStatusColor(day.status)}`}
83
+ style={{
84
+ height:
85
+ day.status === 'off'
86
+ ? '8px'
87
+ : `${Math.max((day.hours / 10) * 100, 8)}%`,
88
+ minHeight: day.status === 'off' ? '8px' : '12px',
89
+ }}
90
+ />
91
+ <div className="text-xs font-semibold text-gray-700">{day.day}</div>
92
+ </div>
93
+ ))}
94
+ </div>
95
+ </div>
96
+ );
97
+ };
98
+
99
+ export default MyWeeklyJourney;