@hed-hog/operations 0.0.3 → 0.0.286

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 (108) hide show
  1. package/README.md +122 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/operations-data.controller.d.ts +139 -0
  7. package/dist/operations-data.controller.d.ts.map +1 -0
  8. package/dist/operations-data.controller.js +113 -0
  9. package/dist/operations-data.controller.js.map +1 -0
  10. package/dist/operations-growth.controller.d.ts +48 -0
  11. package/dist/operations-growth.controller.d.ts.map +1 -0
  12. package/dist/operations-growth.controller.js +90 -0
  13. package/dist/operations-growth.controller.js.map +1 -0
  14. package/dist/operations.module.d.ts.map +1 -1
  15. package/dist/operations.module.js +10 -4
  16. package/dist/operations.module.js.map +1 -1
  17. package/dist/operations.service.d.ts +178 -0
  18. package/dist/operations.service.d.ts.map +1 -0
  19. package/dist/operations.service.js +134 -0
  20. package/dist/operations.service.js.map +1 -0
  21. package/hedhog/data/menu.yaml +251 -132
  22. package/hedhog/data/operations_career_level.yaml +102 -0
  23. package/hedhog/data/operations_career_track.yaml +8 -0
  24. package/hedhog/data/operations_certification.yaml +38 -0
  25. package/hedhog/data/operations_evaluation_cycle.yaml +18 -0
  26. package/hedhog/data/operations_performance_criterion.yaml +48 -0
  27. package/hedhog/data/role.yaml +14 -7
  28. package/hedhog/data/route.yaml +143 -80
  29. package/hedhog/frontend/app/_components/allocation-calendar.tsx.ejs +56 -56
  30. package/hedhog/frontend/app/_components/kanban-board.tsx.ejs +626 -83
  31. package/hedhog/frontend/app/_components/operations-header.tsx.ejs +29 -29
  32. package/hedhog/frontend/app/_components/section-card.tsx.ejs +32 -32
  33. package/hedhog/frontend/app/_components/status-badge.tsx.ejs +15 -15
  34. package/hedhog/frontend/app/_components/timesheet-entry-dialog.tsx.ejs +142 -142
  35. package/hedhog/frontend/app/_lib/hooks/use-operations-data.ts.ejs +41 -41
  36. package/hedhog/frontend/app/_lib/hooks/use-operations-growth-data.ts.ejs +63 -0
  37. package/hedhog/frontend/app/_lib/mocks/allocations.mock.ts.ejs +74 -74
  38. package/hedhog/frontend/app/_lib/mocks/contracts.mock.ts.ejs +74 -74
  39. package/hedhog/frontend/app/_lib/mocks/operations-growth.mock.ts.ejs +824 -0
  40. package/hedhog/frontend/app/_lib/mocks/projects.mock.ts.ejs +455 -60
  41. package/hedhog/frontend/app/_lib/mocks/tasks.mock.ts.ejs +117 -88
  42. package/hedhog/frontend/app/_lib/mocks/timesheets.mock.ts.ejs +84 -84
  43. package/hedhog/frontend/app/_lib/mocks/users.mock.ts.ejs +67 -67
  44. package/hedhog/frontend/app/_lib/services/contracts.service.ts.ejs +10 -10
  45. package/hedhog/frontend/app/_lib/services/operations-growth.service.ts.ejs +31 -0
  46. package/hedhog/frontend/app/_lib/services/projects.service.ts.ejs +10 -10
  47. package/hedhog/frontend/app/_lib/services/tasks.service.ts.ejs +10 -10
  48. package/hedhog/frontend/app/_lib/services/timesheets.service.ts.ejs +10 -10
  49. package/hedhog/frontend/app/_lib/types/operations-growth.ts.ejs +209 -0
  50. package/hedhog/frontend/app/_lib/types/operations.ts.ejs +156 -95
  51. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +25 -25
  52. package/hedhog/frontend/app/_lib/utils/growth.ts.ejs +62 -0
  53. package/hedhog/frontend/app/_lib/utils/metrics.ts.ejs +103 -103
  54. package/hedhog/frontend/app/_lib/utils/status.ts.ejs +80 -80
  55. package/hedhog/frontend/app/allocations/page.tsx.ejs +155 -99
  56. package/hedhog/frontend/app/approvals/page.tsx.ejs +147 -147
  57. package/hedhog/frontend/app/career/page.tsx.ejs +143 -0
  58. package/hedhog/frontend/app/certifications/page.tsx.ejs +202 -0
  59. package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +108 -108
  60. package/hedhog/frontend/app/contracts/page.tsx.ejs +181 -124
  61. package/hedhog/frontend/app/evaluations/page.tsx.ejs +278 -0
  62. package/hedhog/frontend/app/goals/page.tsx.ejs +171 -0
  63. package/hedhog/frontend/app/growth/page.tsx.ejs +288 -0
  64. package/hedhog/frontend/app/layout.tsx.ejs +9 -9
  65. package/hedhog/frontend/app/manager/page.tsx.ejs +175 -0
  66. package/hedhog/frontend/app/page.tsx.ejs +177 -177
  67. package/hedhog/frontend/app/projects/[id]/page.tsx.ejs +936 -186
  68. package/hedhog/frontend/app/projects/page.tsx.ejs +1074 -111
  69. package/hedhog/frontend/app/rewards/page.tsx.ejs +196 -0
  70. package/hedhog/frontend/app/tasks/page.tsx.ejs +999 -47
  71. package/hedhog/frontend/app/timesheets/page.tsx.ejs +126 -126
  72. package/hedhog/frontend/messages/en.json +454 -142
  73. package/hedhog/frontend/messages/pt.json +454 -142
  74. package/hedhog/table/operations_allocation.yaml +52 -0
  75. package/hedhog/table/operations_calibration_item.yaml +61 -0
  76. package/hedhog/table/operations_calibration_session.yaml +25 -0
  77. package/hedhog/table/operations_career_level.yaml +75 -0
  78. package/hedhog/table/operations_career_track.yaml +21 -0
  79. package/hedhog/table/operations_certification.yaml +48 -0
  80. package/hedhog/table/operations_contract.yaml +57 -0
  81. package/hedhog/table/operations_employee.yaml +64 -0
  82. package/hedhog/table/operations_employee_certification.yaml +43 -0
  83. package/hedhog/table/operations_employee_connect.yaml +61 -0
  84. package/hedhog/table/operations_employee_evaluation.yaml +113 -0
  85. package/hedhog/table/operations_employee_evaluation_item.yaml +39 -0
  86. package/hedhog/table/operations_employee_profile.yaml +80 -0
  87. package/hedhog/table/operations_employee_skill_matrix.yaml +30 -0
  88. package/hedhog/table/operations_evaluation_cycle.yaml +31 -0
  89. package/hedhog/table/operations_goal.yaml +67 -0
  90. package/hedhog/table/operations_goal_progress.yaml +31 -0
  91. package/hedhog/table/operations_performance_criterion.yaml +29 -0
  92. package/hedhog/table/operations_project.yaml +66 -0
  93. package/hedhog/table/operations_promotion_readiness.yaml +49 -0
  94. package/hedhog/table/operations_promotion_recommendation.yaml +63 -0
  95. package/hedhog/table/operations_public_recognition.yaml +46 -0
  96. package/hedhog/table/operations_reward.yaml +100 -0
  97. package/hedhog/table/operations_score_event.yaml +81 -0
  98. package/hedhog/table/operations_task.yaml +60 -0
  99. package/hedhog/table/operations_timesheet.yaml +49 -0
  100. package/hedhog/table/operations_timesheet_entry.yaml +51 -0
  101. package/package.json +4 -4
  102. package/src/index.ts +2 -1
  103. package/src/language/en.json +8 -8
  104. package/src/language/pt.json +8 -8
  105. package/src/operations-data.controller.ts +54 -0
  106. package/src/operations-growth.controller.ts +44 -0
  107. package/src/operations.module.ts +21 -15
  108. package/src/operations.service.ts +137 -0
@@ -0,0 +1,102 @@
1
+ - career_track_id:
2
+ where:
3
+ slug: delivery
4
+ slug: junior-consultant
5
+ name: Junior Consultant
6
+ code: JC
7
+ level_code: 59
8
+ level_order: 1
9
+ order_index: 1
10
+ min_score: 0
11
+ max_score: 199
12
+ salary_min: 2500
13
+ salary_max: 4200
14
+ description: Entry level professional focused on consistency and delivery fundamentals.
15
+ summary_criteria: Complete guided tasks, keep basic SLA discipline, and build collaboration habits.
16
+ expectations_summary: Demonstrates reliable individual execution with clear room to expand impact through evidence and consistency.
17
+ is_active: true
18
+ - career_track_id:
19
+ where:
20
+ slug: delivery
21
+ slug: consultant
22
+ name: Consultant
23
+ code: C1
24
+ level_code: 60
25
+ level_order: 2
26
+ order_index: 2
27
+ min_score: 200
28
+ max_score: 399
29
+ salary_min: 4200
30
+ salary_max: 6500
31
+ description: Independent execution with predictable quality and communication.
32
+ summary_criteria: Deliver scoped work with low rework and maintain solid project rituals.
33
+ expectations_summary: Produces visible individual impact, helps the team operate better, and begins to document evidence for broader readiness.
34
+ is_active: true
35
+ - career_track_id:
36
+ where:
37
+ slug: delivery
38
+ slug: senior-consultant
39
+ name: Senior Consultant
40
+ code: SC
41
+ level_code: 61
42
+ level_order: 3
43
+ order_index: 3
44
+ min_score: 400
45
+ max_score: 649
46
+ salary_min: 6500
47
+ salary_max: 9500
48
+ description: Senior delivery contributor with autonomy and mentoring impact.
49
+ summary_criteria: Lead complex deliveries, mentor peers, and create reusable improvements.
50
+ expectations_summary: Sustains impact across individual delivery and team enablement with evidence strong enough for readiness discussions.
51
+ is_active: true
52
+ - career_track_id:
53
+ where:
54
+ slug: delivery
55
+ slug: delivery-lead
56
+ name: Delivery Lead
57
+ code: DL
58
+ level_code: 62
59
+ level_order: 4
60
+ order_index: 4
61
+ min_score: 650
62
+ max_score: 999
63
+ salary_min: 9500
64
+ salary_max: 14000
65
+ description: Team-level leadership focused on outcomes, predictability, and growth coaching.
66
+ summary_criteria: Run multi-stream delivery, develop people, and sustain healthy margins.
67
+ expectations_summary: Demonstrates organization-level influence, calibration-ready evidence, and sustained operation in a broader leadership context.
68
+ is_active: true
69
+ - career_track_id:
70
+ where:
71
+ slug: specialist
72
+ slug: specialist-ii
73
+ name: Specialist II
74
+ code: SP2
75
+ level_code: 60S
76
+ level_order: 1
77
+ order_index: 1
78
+ min_score: 250
79
+ max_score: 499
80
+ salary_min: 5000
81
+ salary_max: 8000
82
+ description: Deep individual contributor with emerging internal influence.
83
+ summary_criteria: Own a specialty lane and improve standards inside recurring workflows.
84
+ expectations_summary: Shows specialist impact beyond execution through reusable knowledge, evidence, and measurable quality improvement.
85
+ is_active: true
86
+ - career_track_id:
87
+ where:
88
+ slug: specialist
89
+ slug: principal-specialist
90
+ name: Principal Specialist
91
+ code: PS
92
+ level_code: 61S
93
+ level_order: 2
94
+ order_index: 2
95
+ min_score: 500
96
+ max_score: 900
97
+ salary_min: 9000
98
+ salary_max: 15000
99
+ description: Reference professional who shapes methods, quality bars, and enablement.
100
+ summary_criteria: Scale expertise, certify others, and improve delivery leverage across teams.
101
+ expectations_summary: Operates with organization-level technical impact and produces calibration-grade evidence across multiple teams.
102
+ is_active: true
@@ -0,0 +1,8 @@
1
+ - slug: delivery
2
+ name: Delivery
3
+ description: Execution path focused on delivery leadership, project ownership, and client outcomes.
4
+ is_active: true
5
+ - slug: specialist
6
+ name: Specialist
7
+ description: Technical path focused on mastery, enablement, and quality acceleration.
8
+ is_active: true
@@ -0,0 +1,38 @@
1
+ - slug: scrum-master-foundations
2
+ name: Scrum Master Foundations
3
+ provider: Scrum.org
4
+ category: Delivery
5
+ default_score: 45
6
+ description: Validates facilitation and agile operating fundamentals.
7
+ is_supporting_evidence: true
8
+ is_active: true
9
+ - slug: data-storytelling
10
+ name: Data Storytelling for Delivery
11
+ provider: Internal Academy
12
+ category: Communication
13
+ default_score: 30
14
+ description: Improves executive updates, stakeholder alignment, and narrative clarity.
15
+ is_supporting_evidence: true
16
+ is_active: true
17
+ - slug: advanced-quality-assurance
18
+ name: Advanced Quality Assurance
19
+ provider: ISTQB
20
+ category: Quality
21
+ default_score: 55
22
+ required_level_id:
23
+ where:
24
+ slug: senior-consultant
25
+ description: Supporting evidence that can strengthen readiness discussions for senior delivery and specialist growth.
26
+ is_supporting_evidence: true
27
+ is_active: true
28
+ - slug: leadership-feedback-practicum
29
+ name: Leadership Feedback Practicum
30
+ provider: Internal Academy
31
+ category: Leadership
32
+ default_score: 40
33
+ required_level_id:
34
+ where:
35
+ slug: delivery-lead
36
+ description: Supporting evidence for leadership readiness and management cadence, without guaranteeing promotion by itself.
37
+ is_supporting_evidence: true
38
+ is_active: true
@@ -0,0 +1,18 @@
1
+ - name: 2026 H1 Growth Cycle
2
+ cycle_type: semiannual
3
+ start_date: 2026-01-01
4
+ end_date: 2026-06-30
5
+ status: active
6
+ description: Main career review cycle for the first semester.
7
+ - name: Legacy Imported Cycle
8
+ cycle_type: custom
9
+ start_date: 2025-01-01
10
+ end_date: 2025-12-31
11
+ status: archived
12
+ description: Default cycle used to anchor legacy score-first data imported before the impact model refactor.
13
+ - name: 2026 Delivery Sprint Review
14
+ cycle_type: quarterly
15
+ start_date: 2026-01-01
16
+ end_date: 2026-03-31
17
+ status: active
18
+ description: Lightweight cycle focused on delivery feedback and recognition.
@@ -0,0 +1,48 @@
1
+ - slug: punctuality
2
+ name: Punctuality
3
+ description: Respect for deadlines, rituals, and agreed checkpoints.
4
+ weight: 1
5
+ score_type: rating
6
+ is_active: true
7
+ - slug: quality
8
+ name: Quality
9
+ description: Delivery quality, low rework, and attention to detail.
10
+ weight: 1.4
11
+ score_type: rating
12
+ is_active: true
13
+ - slug: on_time_delivery
14
+ name: On-time Delivery
15
+ description: Consistency when closing tasks and commitments inside the target window.
16
+ weight: 1.2
17
+ score_type: rating
18
+ is_active: true
19
+ - slug: above_expectations
20
+ name: Above Expectations
21
+ description: Initiative to exceed the expected scope with useful impact.
22
+ weight: 1.1
23
+ score_type: points
24
+ is_active: true
25
+ - slug: commitment
26
+ name: Commitment
27
+ description: Ownership, reliability, and follow-through across the workflow.
28
+ weight: 1.3
29
+ score_type: rating
30
+ is_active: true
31
+ - slug: process_methodology
32
+ name: Process and Methodology
33
+ description: Respect for process, documentation, and delivery discipline.
34
+ weight: 1
35
+ score_type: rating
36
+ is_active: true
37
+ - slug: autonomy
38
+ name: Autonomy
39
+ description: Ability to move work forward with the right level of supervision.
40
+ weight: 1.2
41
+ score_type: rating
42
+ is_active: true
43
+ - slug: collaboration
44
+ name: Collaboration
45
+ description: Contribution to team effectiveness, knowledge sharing, and feedback culture.
46
+ weight: 1.3
47
+ score_type: rating
48
+ is_active: true
@@ -1,7 +1,14 @@
1
- - slug: admin-operations
2
- name:
3
- en: Operations Administrator
4
- pt: Administrador de Operacoes
5
- description:
6
- en: Administrator with full access to operations management.
7
- pt: Administrador com acesso total a gestao de operacoes.
1
+ - slug: admin-operations
2
+ name:
3
+ en: Operations Administrator
4
+ pt: Administrador de Operacoes
5
+ description:
6
+ en: Administrator with full access to operations management.
7
+ pt: Administrador com acesso total a gestao de operacoes.
8
+ - slug: admin-operations-timesheet-approvals
9
+ name:
10
+ en: Timesheet Approvals Manager
11
+ pt: Gerente de Aprovacao de Timesheets
12
+ description:
13
+ en: Can review and approve timesheets submitted by team members.
14
+ pt: Pode revisar e aprovar timesheets submetidos por membros da equipe.
@@ -1,80 +1,143 @@
1
- - url: /operations
2
- method: GET
3
- relations:
4
- role:
5
- - where:
6
- slug: admin
7
- - where:
8
- slug: admin-operations
9
-
10
- - url: /operations/contracts
11
- method: GET
12
- relations:
13
- role:
14
- - where:
15
- slug: admin
16
- - where:
17
- slug: admin-operations
18
-
19
- - url: /operations/contracts/:id
20
- method: GET
21
- relations:
22
- role:
23
- - where:
24
- slug: admin
25
- - where:
26
- slug: admin-operations
27
-
28
- - url: /operations/projects
29
- method: GET
30
- relations:
31
- role:
32
- - where:
33
- slug: admin
34
- - where:
35
- slug: admin-operations
36
-
37
- - url: /operations/projects/:id
38
- method: GET
39
- relations:
40
- role:
41
- - where:
42
- slug: admin
43
- - where:
44
- slug: admin-operations
45
-
46
- - url: /operations/allocations
47
- method: GET
48
- relations:
49
- role:
50
- - where:
51
- slug: admin
52
- - where:
53
- slug: admin-operations
54
-
55
- - url: /operations/tasks
56
- method: GET
57
- relations:
58
- role:
59
- - where:
60
- slug: admin
61
- - where:
62
- slug: admin-operations
63
-
64
- - url: /operations/timesheets
65
- method: GET
66
- relations:
67
- role:
68
- - where:
69
- slug: admin
70
- - where:
71
- slug: admin-operations
72
-
73
- - url: /operations/approvals
74
- method: GET
75
- relations:
76
- role:
77
- - where:
78
- slug: admin
79
- - where:
80
- slug: admin-operations
1
+ - url: /operations
2
+ method: GET
3
+ relations:
4
+ role:
5
+ - where:
6
+ slug: admin
7
+ - where:
8
+ slug: admin-operations
9
+
10
+ - url: /operations/contracts
11
+ method: GET
12
+ relations:
13
+ role:
14
+ - where:
15
+ slug: admin
16
+ - where:
17
+ slug: admin-operations
18
+
19
+ - url: /operations/contracts/:id
20
+ method: GET
21
+ relations:
22
+ role:
23
+ - where:
24
+ slug: admin
25
+ - where:
26
+ slug: admin-operations
27
+
28
+ - url: /operations/projects
29
+ method: GET
30
+ relations:
31
+ role:
32
+ - where:
33
+ slug: admin
34
+ - where:
35
+ slug: admin-operations
36
+
37
+ - url: /operations/projects/:id
38
+ method: GET
39
+ relations:
40
+ role:
41
+ - where:
42
+ slug: admin
43
+ - where:
44
+ slug: admin-operations
45
+
46
+ - url: /operations/allocations
47
+ method: GET
48
+ relations:
49
+ role:
50
+ - where:
51
+ slug: admin
52
+ - where:
53
+ slug: admin-operations
54
+
55
+ - url: /operations/tasks
56
+ method: GET
57
+ relations:
58
+ role:
59
+ - where:
60
+ slug: admin
61
+ - where:
62
+ slug: admin-operations
63
+
64
+ - url: /operations/timesheets
65
+ method: GET
66
+ relations:
67
+ role:
68
+ - where:
69
+ slug: admin
70
+ - where:
71
+ slug: admin-operations
72
+
73
+ - url: /operations/approvals
74
+ method: GET
75
+ relations:
76
+ role:
77
+ - where:
78
+ slug: admin
79
+ - where:
80
+ slug: admin-operations
81
+
82
+ - url: /operations/growth
83
+ method: GET
84
+ relations:
85
+ role:
86
+ - where:
87
+ slug: admin
88
+ - where:
89
+ slug: admin-operations
90
+
91
+ - url: /operations/evaluations
92
+ method: GET
93
+ relations:
94
+ role:
95
+ - where:
96
+ slug: admin
97
+ - where:
98
+ slug: admin-operations
99
+
100
+ - url: /operations/goals
101
+ method: GET
102
+ relations:
103
+ role:
104
+ - where:
105
+ slug: admin
106
+ - where:
107
+ slug: admin-operations
108
+
109
+ - url: /operations/certifications
110
+ method: GET
111
+ relations:
112
+ role:
113
+ - where:
114
+ slug: admin
115
+ - where:
116
+ slug: admin-operations
117
+
118
+ - url: /operations/rewards
119
+ method: GET
120
+ relations:
121
+ role:
122
+ - where:
123
+ slug: admin
124
+ - where:
125
+ slug: admin-operations
126
+
127
+ - url: /operations/career
128
+ method: GET
129
+ relations:
130
+ role:
131
+ - where:
132
+ slug: admin
133
+ - where:
134
+ slug: admin-operations
135
+
136
+ - url: /operations/manager
137
+ method: GET
138
+ relations:
139
+ role:
140
+ - where:
141
+ slug: admin
142
+ - where:
143
+ slug: admin-operations
@@ -1,56 +1,56 @@
1
- import { formatHours } from '../_lib/utils/format';
2
- import type {
3
- Allocation,
4
- OperationsUser,
5
- Project,
6
- } from '../_lib/types/operations';
7
-
8
- const weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'];
9
-
10
- interface AllocationCalendarProps {
11
- allocations: Allocation[];
12
- users: OperationsUser[];
13
- projects: Project[];
14
- }
15
-
16
- export function AllocationCalendar({
17
- allocations,
18
- users,
19
- projects,
20
- }: AllocationCalendarProps) {
21
- return (
22
- <div className="overflow-x-auto">
23
- <div className="min-w-[760px] rounded-xl border">
24
- <div className="grid grid-cols-6 border-b bg-muted/40 text-sm font-medium">
25
- <div className="p-3">Team Member</div>
26
- {weekdays.map((day) => (
27
- <div key={day} className="border-l p-3">
28
- {day}
29
- </div>
30
- ))}
31
- </div>
32
- {allocations.map((allocation) => {
33
- const user = users.find((item) => item.id === allocation.userId);
34
- const project = projects.find((item) => item.id === allocation.projectId);
35
- const dailyHours = allocation.weeklyHours / 5;
36
-
37
- return (
38
- <div key={allocation.id} className="grid grid-cols-6 border-b text-sm">
39
- <div className="p-3">
40
- <p className="font-medium">{user?.name}</p>
41
- <p className="text-xs text-muted-foreground">{project?.name}</p>
42
- </div>
43
- {weekdays.map((day) => (
44
- <div key={day} className="border-l p-3">
45
- <div className="rounded-md bg-blue-100 px-2 py-1 text-blue-700">
46
- {formatHours(dailyHours)}
47
- </div>
48
- </div>
49
- ))}
50
- </div>
51
- );
52
- })}
53
- </div>
54
- </div>
55
- );
56
- }
1
+ import { formatHours } from '../_lib/utils/format';
2
+ import type {
3
+ Allocation,
4
+ OperationsUser,
5
+ Project,
6
+ } from '../_lib/types/operations';
7
+
8
+ const weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'];
9
+
10
+ interface AllocationCalendarProps {
11
+ allocations: Allocation[];
12
+ users: OperationsUser[];
13
+ projects: Project[];
14
+ }
15
+
16
+ export function AllocationCalendar({
17
+ allocations,
18
+ users,
19
+ projects,
20
+ }: AllocationCalendarProps) {
21
+ return (
22
+ <div className="overflow-x-auto">
23
+ <div className="min-w-[760px] rounded-xl border">
24
+ <div className="grid grid-cols-6 border-b bg-muted/40 text-sm font-medium">
25
+ <div className="p-3">Team Member</div>
26
+ {weekdays.map((day) => (
27
+ <div key={day} className="border-l p-3">
28
+ {day}
29
+ </div>
30
+ ))}
31
+ </div>
32
+ {allocations.map((allocation) => {
33
+ const user = users.find((item) => item.id === allocation.userId);
34
+ const project = projects.find((item) => item.id === allocation.projectId);
35
+ const dailyHours = allocation.weeklyHours / 5;
36
+
37
+ return (
38
+ <div key={allocation.id} className="grid grid-cols-6 border-b text-sm">
39
+ <div className="p-3">
40
+ <p className="font-medium">{user?.name}</p>
41
+ <p className="text-xs text-muted-foreground">{project?.name}</p>
42
+ </div>
43
+ {weekdays.map((day) => (
44
+ <div key={day} className="border-l p-3">
45
+ <div className="rounded-md bg-blue-100 px-2 py-1 text-blue-700">
46
+ {formatHours(dailyHours)}
47
+ </div>
48
+ </div>
49
+ ))}
50
+ </div>
51
+ );
52
+ })}
53
+ </div>
54
+ </div>
55
+ );
56
+ }