@hed-hog/operations 0.0.322 → 0.0.325

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 (689) hide show
  1. package/dist/controllers/operations-collaborators.controller.d.ts +9 -0
  2. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
  3. package/dist/controllers/operations-collaborators.controller.js +25 -0
  4. package/dist/controllers/operations-collaborators.controller.js.map +1 -1
  5. package/dist/controllers/operations-project-costs.controller.d.ts +422 -0
  6. package/dist/controllers/operations-project-costs.controller.d.ts.map +1 -0
  7. package/dist/controllers/operations-project-costs.controller.js +250 -0
  8. package/dist/controllers/operations-project-costs.controller.js.map +1 -0
  9. package/dist/controllers/operations-reports.controller.d.ts +9 -0
  10. package/dist/controllers/operations-reports.controller.d.ts.map +1 -1
  11. package/dist/controllers/operations-tasks.controller.d.ts +42 -0
  12. package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
  13. package/dist/controllers/operations-tasks.controller.js +48 -0
  14. package/dist/controllers/operations-tasks.controller.js.map +1 -1
  15. package/dist/controllers/operations-timesheets.controller.d.ts +1 -0
  16. package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -1
  17. package/dist/dto/create-collaborator-project-assignment.dto.d.ts +5 -0
  18. package/dist/dto/create-collaborator-project-assignment.dto.d.ts.map +1 -0
  19. package/dist/dto/create-collaborator-project-assignment.dto.js +30 -0
  20. package/dist/dto/create-collaborator-project-assignment.dto.js.map +1 -0
  21. package/dist/dto/create-project-cost-category.dto.d.ts +10 -0
  22. package/dist/dto/create-project-cost-category.dto.d.ts.map +1 -0
  23. package/dist/dto/create-project-cost-category.dto.js +59 -0
  24. package/dist/dto/create-project-cost-category.dto.js.map +1 -0
  25. package/dist/dto/create-project-cost-type.dto.d.ts +14 -0
  26. package/dist/dto/create-project-cost-type.dto.d.ts.map +1 -0
  27. package/dist/dto/create-project-cost-type.dto.js +87 -0
  28. package/dist/dto/create-project-cost-type.dto.js.map +1 -0
  29. package/dist/dto/create-project-cost.dto.d.ts +22 -0
  30. package/dist/dto/create-project-cost.dto.d.ts.map +1 -0
  31. package/dist/dto/create-project-cost.dto.js +135 -0
  32. package/dist/dto/create-project-cost.dto.js.map +1 -0
  33. package/dist/dto/get-project-cost-report.dto.d.ts +10 -0
  34. package/dist/dto/get-project-cost-report.dto.d.ts.map +1 -0
  35. package/dist/dto/get-project-cost-report.dto.js +65 -0
  36. package/dist/dto/get-project-cost-report.dto.js.map +1 -0
  37. package/dist/dto/list-project-cost-categories.dto.d.ts +6 -0
  38. package/dist/dto/list-project-cost-categories.dto.d.ts.map +1 -0
  39. package/dist/dto/list-project-cost-categories.dto.js +34 -0
  40. package/dist/dto/list-project-cost-categories.dto.js.map +1 -0
  41. package/dist/dto/list-project-cost-types.dto.d.ts +8 -0
  42. package/dist/dto/list-project-cost-types.dto.d.ts.map +1 -0
  43. package/dist/dto/list-project-cost-types.dto.js +45 -0
  44. package/dist/dto/list-project-cost-types.dto.js.map +1 -0
  45. package/dist/dto/list-project-costs.dto.d.ts +14 -0
  46. package/dist/dto/list-project-costs.dto.d.ts.map +1 -0
  47. package/dist/dto/list-project-costs.dto.js +81 -0
  48. package/dist/dto/list-project-costs.dto.js.map +1 -0
  49. package/dist/dto/list-tasks.dto.d.ts +1 -0
  50. package/dist/dto/list-tasks.dto.d.ts.map +1 -1
  51. package/dist/dto/list-tasks.dto.js +6 -0
  52. package/dist/dto/list-tasks.dto.js.map +1 -1
  53. package/dist/dto/list-timesheets.dto.d.ts +1 -0
  54. package/dist/dto/list-timesheets.dto.d.ts.map +1 -1
  55. package/dist/dto/list-timesheets.dto.js +7 -0
  56. package/dist/dto/list-timesheets.dto.js.map +1 -1
  57. package/dist/dto/update-collaborator-project-assignment.dto.d.ts +11 -0
  58. package/dist/dto/update-collaborator-project-assignment.dto.d.ts.map +1 -0
  59. package/dist/dto/update-collaborator-project-assignment.dto.js +65 -0
  60. package/dist/dto/update-collaborator-project-assignment.dto.js.map +1 -0
  61. package/dist/dto/update-project-cost-category.dto.d.ts +6 -0
  62. package/dist/dto/update-project-cost-category.dto.d.ts.map +1 -0
  63. package/dist/dto/update-project-cost-category.dto.js +9 -0
  64. package/dist/dto/update-project-cost-category.dto.js.map +1 -0
  65. package/dist/dto/update-project-cost-type.dto.d.ts +6 -0
  66. package/dist/dto/update-project-cost-type.dto.d.ts.map +1 -0
  67. package/dist/dto/update-project-cost-type.dto.js +9 -0
  68. package/dist/dto/update-project-cost-type.dto.js.map +1 -0
  69. package/dist/dto/update-project-cost.dto.d.ts +6 -0
  70. package/dist/dto/update-project-cost.dto.d.ts.map +1 -0
  71. package/dist/dto/update-project-cost.dto.js +9 -0
  72. package/dist/dto/update-project-cost.dto.js.map +1 -0
  73. package/dist/operations.module.d.ts.map +1 -1
  74. package/dist/operations.module.js +2 -0
  75. package/dist/operations.module.js.map +1 -1
  76. package/dist/operations.service.d.ts +562 -0
  77. package/dist/operations.service.d.ts.map +1 -1
  78. package/dist/operations.service.js +1657 -47
  79. package/dist/operations.service.js.map +1 -1
  80. package/hedhog/data/menu.yaml +52 -0
  81. package/hedhog/data/operations_project_cost_category.yaml +80 -0
  82. package/hedhog/data/operations_project_cost_type.yaml +503 -0
  83. package/hedhog/data/route.yaml +274 -0
  84. package/hedhog/frontend/app/_components/collaborator-costs-section.tsx.ejs +2 -18
  85. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +185 -276
  86. package/hedhog/frontend/app/_components/collaborator-tasks-tab.tsx.ejs +358 -0
  87. package/hedhog/frontend/app/_components/collaborator-timesheets-tab.tsx.ejs +242 -0
  88. package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +167 -59
  89. package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +1 -853
  90. package/hedhog/frontend/app/_components/project-assignments-tab.tsx.ejs +450 -0
  91. package/hedhog/frontend/app/_components/project-cost-report-screen.tsx.ejs +602 -0
  92. package/hedhog/frontend/app/_components/project-costs-section.tsx.ejs +1401 -0
  93. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +2003 -1846
  94. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +56 -11
  95. package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +297 -2
  96. package/hedhog/frontend/app/_components/task-form-sheet.tsx.ejs +530 -0
  97. package/hedhog/frontend/app/_lib/api.ts.ejs +247 -0
  98. package/hedhog/frontend/app/_lib/types.ts.ejs +196 -7
  99. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +9 -3
  100. package/hedhog/frontend/app/collaborators/page.tsx.ejs +18 -7
  101. package/hedhog/frontend/app/my-tasks/page.tsx.ejs +219 -122
  102. package/hedhog/frontend/app/project-cost-categories/page.tsx.ejs +674 -0
  103. package/hedhog/frontend/app/project-cost-types/page.tsx.ejs +845 -0
  104. package/hedhog/frontend/app/projects/[id]/costs-report/page.tsx.ejs +10 -0
  105. package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +20 -349
  106. package/hedhog/frontend/app/reports/projects/page.tsx.ejs +192 -484
  107. package/hedhog/frontend/messages/en.json +279 -10
  108. package/hedhog/frontend/messages/en.json.ejs +2043 -0
  109. package/hedhog/frontend/messages/operations/en.json +2068 -0
  110. package/hedhog/frontend/messages/operations/operations/en.json +2102 -0
  111. package/hedhog/frontend/messages/operations/operations/pt.json +2111 -0
  112. package/hedhog/frontend/messages/operations/pt.json +2072 -0
  113. package/hedhog/frontend/messages/pt.json +284 -13
  114. package/hedhog/frontend/messages/pt.json.ejs +2056 -0
  115. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts +29 -0
  116. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts.map +1 -0
  117. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js +95 -0
  118. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js.map +1 -0
  119. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.tsx +233 -0
  120. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts +10 -0
  121. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts.map +1 -0
  122. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js +577 -0
  123. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js.map +1 -0
  124. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.tsx +868 -0
  125. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts +4 -0
  126. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts.map +1 -0
  127. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js +337 -0
  128. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js.map +1 -0
  129. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.tsx +476 -0
  130. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts +9 -0
  131. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts.map +1 -0
  132. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js +1348 -0
  133. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js.map +1 -0
  134. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.tsx +2233 -0
  135. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts +12 -0
  136. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts.map +1 -0
  137. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js +162 -0
  138. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js.map +1 -0
  139. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.tsx +261 -0
  140. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts +18 -0
  141. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts.map +1 -0
  142. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js +145 -0
  143. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js.map +1 -0
  144. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.tsx +258 -0
  145. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts +4 -0
  146. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts.map +1 -0
  147. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js +223 -0
  148. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js.map +1 -0
  149. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.tsx +342 -0
  150. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts +58 -0
  151. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts.map +1 -0
  152. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js +438 -0
  153. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js.map +1 -0
  154. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.tsx +698 -0
  155. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts +20 -0
  156. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts.map +1 -0
  157. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js +233 -0
  158. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js.map +1 -0
  159. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.tsx +392 -0
  160. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts +4 -0
  161. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts.map +1 -0
  162. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js +814 -0
  163. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js.map +1 -0
  164. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.tsx +1288 -0
  165. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts +21 -0
  166. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts.map +1 -0
  167. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js +174 -0
  168. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js.map +1 -0
  169. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.tsx +306 -0
  170. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts +10 -0
  171. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts.map +1 -0
  172. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js +12 -0
  173. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js.map +1 -0
  174. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.tsx +29 -0
  175. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts +15 -0
  176. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts.map +1 -0
  177. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js +501 -0
  178. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js.map +1 -0
  179. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.tsx +853 -0
  180. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts +6 -0
  181. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts.map +1 -0
  182. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js +847 -0
  183. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js.map +1 -0
  184. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.tsx +1340 -0
  185. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts +4 -0
  186. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts.map +1 -0
  187. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js +2930 -0
  188. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js.map +1 -0
  189. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.tsx +4378 -0
  190. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts +9 -0
  191. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts.map +1 -0
  192. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js +1013 -0
  193. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js.map +1 -0
  194. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.tsx +1745 -0
  195. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts +13 -0
  196. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts.map +1 -0
  197. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js +38 -0
  198. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js.map +1 -0
  199. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.tsx +74 -0
  200. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts +7 -0
  201. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts.map +1 -0
  202. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js +11 -0
  203. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js.map +1 -0
  204. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.tsx +15 -0
  205. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts +18 -0
  206. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts.map +1 -0
  207. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js +406 -0
  208. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js.map +1 -0
  209. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.tsx +660 -0
  210. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts +26 -0
  211. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts.map +1 -0
  212. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js +332 -0
  213. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js.map +1 -0
  214. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.tsx +518 -0
  215. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts +6 -0
  216. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts.map +1 -0
  217. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js +255 -0
  218. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js.map +1 -0
  219. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.tsx +388 -0
  220. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts +10 -0
  221. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts.map +1 -0
  222. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js +131 -0
  223. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js.map +1 -0
  224. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.tsx +214 -0
  225. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts +108 -0
  226. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts.map +1 -0
  227. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js +162 -0
  228. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js.map +1 -0
  229. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.ts +428 -0
  230. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts +8 -0
  231. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts.map +1 -0
  232. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js +36 -0
  233. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js.map +1 -0
  234. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.ts +44 -0
  235. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts +836 -0
  236. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts.map +1 -0
  237. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js +3 -0
  238. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js.map +1 -0
  239. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.ts +860 -0
  240. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts +16 -0
  241. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts.map +1 -0
  242. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js +182 -0
  243. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js.map +1 -0
  244. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.ts +250 -0
  245. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts +4 -0
  246. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts.map +1 -0
  247. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js +51 -0
  248. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js.map +1 -0
  249. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.ts +61 -0
  250. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts +2 -0
  251. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts.map +1 -0
  252. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js +954 -0
  253. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js.map +1 -0
  254. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.tsx +1277 -0
  255. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts +2 -0
  256. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts.map +1 -0
  257. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js +488 -0
  258. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js.map +1 -0
  259. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.tsx +805 -0
  260. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts +6 -0
  261. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts.map +1 -0
  262. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js +9 -0
  263. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js.map +1 -0
  264. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.tsx +11 -0
  265. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts +6 -0
  266. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts.map +1 -0
  267. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js +9 -0
  268. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js.map +1 -0
  269. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.tsx +11 -0
  270. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts +2 -0
  271. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts.map +1 -0
  272. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js +8 -0
  273. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js.map +1 -0
  274. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.tsx +5 -0
  275. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts +2 -0
  276. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts.map +1 -0
  277. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js +612 -0
  278. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js.map +1 -0
  279. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.tsx +939 -0
  280. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts +6 -0
  281. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts.map +1 -0
  282. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js +9 -0
  283. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js.map +1 -0
  284. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.tsx +11 -0
  285. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts +6 -0
  286. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts.map +1 -0
  287. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js +9 -0
  288. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js.map +1 -0
  289. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.tsx +11 -0
  290. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts +6 -0
  291. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts.map +1 -0
  292. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js +9 -0
  293. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js.map +1 -0
  294. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.tsx +17 -0
  295. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts +2 -0
  296. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts.map +1 -0
  297. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js +348 -0
  298. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js.map +1 -0
  299. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.tsx +536 -0
  300. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts +2 -0
  301. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts.map +1 -0
  302. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js +401 -0
  303. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js.map +1 -0
  304. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.tsx +607 -0
  305. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts +5 -0
  306. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts.map +1 -0
  307. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js +7 -0
  308. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js.map +1 -0
  309. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.tsx +9 -0
  310. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts +6 -0
  311. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts.map +1 -0
  312. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js +9 -0
  313. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js.map +1 -0
  314. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.tsx +11 -0
  315. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts +2 -0
  316. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts.map +1 -0
  317. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js +321 -0
  318. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js.map +1 -0
  319. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.tsx +440 -0
  320. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts +2 -0
  321. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts.map +1 -0
  322. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js +939 -0
  323. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js.map +1 -0
  324. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.tsx +1499 -0
  325. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts +29 -0
  326. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts.map +1 -0
  327. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js +95 -0
  328. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js.map +1 -0
  329. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.tsx +233 -0
  330. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts +10 -0
  331. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts.map +1 -0
  332. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js +577 -0
  333. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js.map +1 -0
  334. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.tsx +868 -0
  335. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts +4 -0
  336. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts.map +1 -0
  337. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js +337 -0
  338. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js.map +1 -0
  339. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.tsx +476 -0
  340. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts +9 -0
  341. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts.map +1 -0
  342. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js +1348 -0
  343. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js.map +1 -0
  344. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.tsx +2233 -0
  345. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts +12 -0
  346. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts.map +1 -0
  347. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js +162 -0
  348. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js.map +1 -0
  349. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.tsx +261 -0
  350. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts +18 -0
  351. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts.map +1 -0
  352. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js +145 -0
  353. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js.map +1 -0
  354. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.tsx +258 -0
  355. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts +4 -0
  356. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts.map +1 -0
  357. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js +223 -0
  358. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js.map +1 -0
  359. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.tsx +342 -0
  360. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts +58 -0
  361. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts.map +1 -0
  362. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js +438 -0
  363. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js.map +1 -0
  364. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.tsx +698 -0
  365. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts +20 -0
  366. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts.map +1 -0
  367. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js +233 -0
  368. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js.map +1 -0
  369. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.tsx +392 -0
  370. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts +4 -0
  371. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts.map +1 -0
  372. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js +814 -0
  373. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js.map +1 -0
  374. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.tsx +1288 -0
  375. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts +21 -0
  376. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts.map +1 -0
  377. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js +174 -0
  378. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js.map +1 -0
  379. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.tsx +306 -0
  380. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts +10 -0
  381. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts.map +1 -0
  382. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js +12 -0
  383. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js.map +1 -0
  384. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.tsx +29 -0
  385. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts +15 -0
  386. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts.map +1 -0
  387. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js +501 -0
  388. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js.map +1 -0
  389. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.tsx +853 -0
  390. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts +6 -0
  391. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts.map +1 -0
  392. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js +459 -0
  393. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js.map +1 -0
  394. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.tsx +598 -0
  395. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts +6 -0
  396. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts.map +1 -0
  397. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js +876 -0
  398. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js.map +1 -0
  399. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.tsx +1368 -0
  400. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts +4 -0
  401. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts.map +1 -0
  402. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js +2930 -0
  403. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js.map +1 -0
  404. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.tsx +4378 -0
  405. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts +9 -0
  406. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts.map +1 -0
  407. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js +1013 -0
  408. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js.map +1 -0
  409. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.tsx +1745 -0
  410. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts +13 -0
  411. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts.map +1 -0
  412. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js +38 -0
  413. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js.map +1 -0
  414. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.tsx +74 -0
  415. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts +7 -0
  416. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts.map +1 -0
  417. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js +11 -0
  418. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js.map +1 -0
  419. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.tsx +15 -0
  420. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts +18 -0
  421. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts.map +1 -0
  422. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js +406 -0
  423. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js.map +1 -0
  424. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.tsx +660 -0
  425. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts +26 -0
  426. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts.map +1 -0
  427. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js +332 -0
  428. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js.map +1 -0
  429. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.tsx +518 -0
  430. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts +6 -0
  431. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts.map +1 -0
  432. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js +255 -0
  433. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js.map +1 -0
  434. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.tsx +388 -0
  435. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts +10 -0
  436. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts.map +1 -0
  437. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js +131 -0
  438. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js.map +1 -0
  439. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.tsx +214 -0
  440. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts +108 -0
  441. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts.map +1 -0
  442. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js +162 -0
  443. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js.map +1 -0
  444. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.ts +428 -0
  445. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts +8 -0
  446. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts.map +1 -0
  447. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js +36 -0
  448. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js.map +1 -0
  449. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.ts +44 -0
  450. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts +836 -0
  451. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts.map +1 -0
  452. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js +3 -0
  453. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js.map +1 -0
  454. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.ts +860 -0
  455. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts +16 -0
  456. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts.map +1 -0
  457. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js +182 -0
  458. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js.map +1 -0
  459. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.ts +250 -0
  460. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts +4 -0
  461. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts.map +1 -0
  462. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js +51 -0
  463. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js.map +1 -0
  464. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.ts +61 -0
  465. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts +2 -0
  466. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts.map +1 -0
  467. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js +954 -0
  468. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js.map +1 -0
  469. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.tsx +1277 -0
  470. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts +2 -0
  471. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts.map +1 -0
  472. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js +488 -0
  473. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js.map +1 -0
  474. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.tsx +805 -0
  475. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts +6 -0
  476. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts.map +1 -0
  477. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js +9 -0
  478. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js.map +1 -0
  479. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.tsx +11 -0
  480. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts +6 -0
  481. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts.map +1 -0
  482. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js +9 -0
  483. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js.map +1 -0
  484. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.tsx +11 -0
  485. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts +2 -0
  486. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts.map +1 -0
  487. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js +8 -0
  488. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js.map +1 -0
  489. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.tsx +5 -0
  490. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts +2 -0
  491. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts.map +1 -0
  492. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js +612 -0
  493. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js.map +1 -0
  494. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.tsx +939 -0
  495. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts +6 -0
  496. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts.map +1 -0
  497. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js +9 -0
  498. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js.map +1 -0
  499. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.tsx +11 -0
  500. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts +6 -0
  501. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts.map +1 -0
  502. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js +9 -0
  503. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js.map +1 -0
  504. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.tsx +11 -0
  505. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts +6 -0
  506. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts.map +1 -0
  507. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js +9 -0
  508. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js.map +1 -0
  509. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.tsx +17 -0
  510. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts +2 -0
  511. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts.map +1 -0
  512. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js +348 -0
  513. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js.map +1 -0
  514. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.tsx +536 -0
  515. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts +2 -0
  516. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts.map +1 -0
  517. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js +401 -0
  518. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js.map +1 -0
  519. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.tsx +607 -0
  520. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts +5 -0
  521. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts.map +1 -0
  522. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js +7 -0
  523. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js.map +1 -0
  524. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.tsx +9 -0
  525. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts +6 -0
  526. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts.map +1 -0
  527. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js +9 -0
  528. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js.map +1 -0
  529. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.tsx +11 -0
  530. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts +2 -0
  531. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts.map +1 -0
  532. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js +321 -0
  533. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js.map +1 -0
  534. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.tsx +440 -0
  535. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts +2 -0
  536. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts.map +1 -0
  537. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js +939 -0
  538. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js.map +1 -0
  539. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.tsx +1499 -0
  540. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts +2 -0
  541. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts.map +1 -0
  542. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js +8 -0
  543. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js.map +1 -0
  544. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.tsx +5 -0
  545. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts +2 -0
  546. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts.map +1 -0
  547. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js +436 -0
  548. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js.map +1 -0
  549. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.tsx +675 -0
  550. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts +2 -0
  551. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts.map +1 -0
  552. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js +563 -0
  553. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js.map +1 -0
  554. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.tsx +846 -0
  555. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts +6 -0
  556. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts.map +1 -0
  557. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js +9 -0
  558. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js.map +1 -0
  559. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.tsx +10 -0
  560. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts +6 -0
  561. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts.map +1 -0
  562. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js +9 -0
  563. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js.map +1 -0
  564. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.tsx +11 -0
  565. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts +6 -0
  566. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts.map +1 -0
  567. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js +9 -0
  568. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js.map +1 -0
  569. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.tsx +11 -0
  570. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts +2 -0
  571. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts.map +1 -0
  572. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js +8 -0
  573. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js.map +1 -0
  574. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.tsx +5 -0
  575. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts +2 -0
  576. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts.map +1 -0
  577. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js +492 -0
  578. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js.map +1 -0
  579. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.tsx +757 -0
  580. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts +2 -0
  581. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts.map +1 -0
  582. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js +342 -0
  583. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js.map +1 -0
  584. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.tsx +430 -0
  585. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts +2 -0
  586. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts.map +1 -0
  587. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js +338 -0
  588. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js.map +1 -0
  589. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.tsx +428 -0
  590. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts +2 -0
  591. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts.map +1 -0
  592. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js +660 -0
  593. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js.map +1 -0
  594. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.tsx +992 -0
  595. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts +2 -0
  596. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts.map +1 -0
  597. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js +515 -0
  598. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js.map +1 -0
  599. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.tsx +707 -0
  600. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts +2 -0
  601. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts.map +1 -0
  602. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js +1141 -0
  603. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js.map +1 -0
  604. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.tsx +1705 -0
  605. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts +2 -0
  606. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts.map +1 -0
  607. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js +8 -0
  608. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js.map +1 -0
  609. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.tsx +5 -0
  610. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts +2 -0
  611. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts.map +1 -0
  612. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js +436 -0
  613. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js.map +1 -0
  614. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.tsx +675 -0
  615. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts +2 -0
  616. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts.map +1 -0
  617. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js +563 -0
  618. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js.map +1 -0
  619. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.tsx +846 -0
  620. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts +6 -0
  621. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts.map +1 -0
  622. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js +9 -0
  623. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js.map +1 -0
  624. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.tsx +11 -0
  625. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts +6 -0
  626. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts.map +1 -0
  627. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js +9 -0
  628. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js.map +1 -0
  629. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.tsx +11 -0
  630. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts +2 -0
  631. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts.map +1 -0
  632. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js +8 -0
  633. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js.map +1 -0
  634. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.tsx +5 -0
  635. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts +2 -0
  636. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts.map +1 -0
  637. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js +492 -0
  638. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js.map +1 -0
  639. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.tsx +757 -0
  640. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts +2 -0
  641. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts.map +1 -0
  642. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js +342 -0
  643. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js.map +1 -0
  644. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.tsx +430 -0
  645. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts +2 -0
  646. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts.map +1 -0
  647. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js +338 -0
  648. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js.map +1 -0
  649. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.tsx +428 -0
  650. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts +2 -0
  651. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts.map +1 -0
  652. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js +660 -0
  653. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js.map +1 -0
  654. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.tsx +992 -0
  655. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts +2 -0
  656. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts.map +1 -0
  657. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js +515 -0
  658. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js.map +1 -0
  659. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.tsx +707 -0
  660. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts +2 -0
  661. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts.map +1 -0
  662. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js +1141 -0
  663. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js.map +1 -0
  664. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.tsx +1705 -0
  665. package/hedhog/table/operations_project_assignment.yaml +1 -0
  666. package/hedhog/table/operations_project_cost.yaml +93 -0
  667. package/hedhog/table/operations_project_cost_category.yaml +37 -0
  668. package/hedhog/table/operations_project_cost_type.yaml +55 -0
  669. package/hedhog/table/operations_task_comment.yaml +26 -0
  670. package/package.json +6 -6
  671. package/src/controllers/operations-collaborators.controller.ts +26 -0
  672. package/src/controllers/operations-project-costs.controller.ts +249 -0
  673. package/src/controllers/operations-tasks.controller.ts +49 -0
  674. package/src/dto/create-collaborator-project-assignment.dto.ts +14 -0
  675. package/src/dto/create-project-cost-category.dto.ts +37 -0
  676. package/src/dto/create-project-cost-type.dto.ts +64 -0
  677. package/src/dto/create-project-cost.dto.ts +126 -0
  678. package/src/dto/get-project-cost-report.dto.ts +46 -0
  679. package/src/dto/list-project-cost-categories.dto.ts +17 -0
  680. package/src/dto/list-project-cost-types.dto.ts +28 -0
  681. package/src/dto/list-project-costs.dto.ts +59 -0
  682. package/src/dto/list-tasks.dto.ts +7 -0
  683. package/src/dto/list-timesheets.dto.ts +7 -1
  684. package/src/dto/update-collaborator-project-assignment.dto.ts +58 -0
  685. package/src/dto/update-project-cost-category.dto.ts +4 -0
  686. package/src/dto/update-project-cost-type.dto.ts +4 -0
  687. package/src/dto/update-project-cost.dto.ts +4 -0
  688. package/src/operations.module.ts +2 -0
  689. package/src/operations.service.ts +2274 -39
@@ -0,0 +1,1277 @@
1
+ 'use client';
2
+
3
+ import {
4
+ EmptyState,
5
+ Page,
6
+ PaginationFooter,
7
+ SearchBar,
8
+ } from '@/components/entity-list';
9
+ import { Button } from '@/components/ui/button';
10
+ import { Card, CardContent } from '@/components/ui/card';
11
+ import {
12
+ Dialog,
13
+ DialogContent,
14
+ DialogDescription,
15
+ DialogFooter,
16
+ DialogHeader,
17
+ DialogTitle,
18
+ } from '@/components/ui/dialog';
19
+ import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
20
+ import {
21
+ Sheet,
22
+ SheetContent,
23
+ SheetDescription,
24
+ SheetHeader,
25
+ SheetTitle,
26
+ } from '@/components/ui/sheet';
27
+ import {
28
+ Table,
29
+ TableBody,
30
+ TableCell,
31
+ TableHead,
32
+ TableHeader,
33
+ TableRow,
34
+ } from '@/components/ui/table';
35
+ import { Textarea } from '@/components/ui/textarea';
36
+ import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
37
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
38
+ import {
39
+ CalendarDays,
40
+ CalendarOff,
41
+ Check,
42
+ ClipboardCheck,
43
+ Clock,
44
+ Eye,
45
+ LayoutGrid,
46
+ List,
47
+ Loader2,
48
+ SlidersHorizontal,
49
+ X,
50
+ } from 'lucide-react';
51
+ import { useTranslations } from 'next-intl';
52
+ import { useMemo, useState } from 'react';
53
+ import {
54
+ OperationsCalendarView,
55
+ type OperationsCalendarItem,
56
+ } from '../_components/operations-calendar-view';
57
+ import { OperationsHeader } from '../_components/operations-header';
58
+ import { StatusBadge } from '../_components/status-badge';
59
+ import { fetchOperations } from '../_lib/api';
60
+ import { useOperationsAccess } from '../_lib/hooks/use-operations-access';
61
+ import type { OperationsApproval, PaginatedResponse } from '../_lib/types';
62
+ import {
63
+ formatDate,
64
+ formatDateTime,
65
+ formatEnumLabel,
66
+ formatHours,
67
+ formatWeekdayLabel,
68
+ getStatusBadgeClass,
69
+ } from '../_lib/utils/format';
70
+
71
+ const WEEKDAY_ORDER = [
72
+ 'monday',
73
+ 'tuesday',
74
+ 'wednesday',
75
+ 'thursday',
76
+ 'friday',
77
+ 'saturday',
78
+ 'sunday',
79
+ ];
80
+
81
+ type ScheduleDay = {
82
+ weekday: string;
83
+ isWorkingDay: boolean;
84
+ startTime?: string | null;
85
+ endTime?: string | null;
86
+ breakMinutes?: number | null;
87
+ };
88
+
89
+ function formatTimeValue(t: string) {
90
+ if (t.includes('T')) return t.split('T')[1]?.slice(0, 5) ?? '--:--';
91
+ return t.slice(0, 5);
92
+ }
93
+
94
+ function groupScheduleLines(days: ScheduleDay[], locale: string) {
95
+ if (!days.length) return [];
96
+ const sorted = [...days].sort(
97
+ (a, b) =>
98
+ WEEKDAY_ORDER.indexOf(a.weekday.toLowerCase()) -
99
+ WEEKDAY_ORDER.indexOf(b.weekday.toLowerCase())
100
+ );
101
+ const dayAbbr = (weekday: string) =>
102
+ formatWeekdayLabel(weekday, locale).slice(0, 3);
103
+ type Group = {
104
+ days: string[];
105
+ time: string | null;
106
+ break: number | null;
107
+ isOff: boolean;
108
+ };
109
+ const groups: Group[] = [];
110
+ for (const day of sorted) {
111
+ const time =
112
+ day.isWorkingDay && day.startTime && day.endTime
113
+ ? `${formatTimeValue(day.startTime)}–${formatTimeValue(day.endTime)}`
114
+ : null;
115
+ const breakMin = day.isWorkingDay ? (day.breakMinutes ?? null) : null;
116
+ const isOff = !day.isWorkingDay;
117
+ const last = groups[groups.length - 1];
118
+ if (
119
+ last &&
120
+ last.isOff === isOff &&
121
+ last.time === time &&
122
+ last.break === breakMin
123
+ ) {
124
+ last.days.push(dayAbbr(day.weekday));
125
+ } else {
126
+ groups.push({
127
+ days: [dayAbbr(day.weekday)],
128
+ time,
129
+ break: breakMin,
130
+ isOff,
131
+ });
132
+ }
133
+ }
134
+ return groups.map((g) => ({
135
+ dayLabel:
136
+ g.days.length > 1
137
+ ? `${g.days[0]}–${g.days[g.days.length - 1]}`
138
+ : g.days[0],
139
+ time: g.time,
140
+ break: g.break,
141
+ isOff: g.isOff,
142
+ }));
143
+ }
144
+
145
+ function SchedulePanel({
146
+ days,
147
+ locale,
148
+ emptyLabel,
149
+ }: {
150
+ days: ScheduleDay[];
151
+ locale: string;
152
+ emptyLabel: string;
153
+ }) {
154
+ const lines = groupScheduleLines(days, locale);
155
+ if (!lines.length)
156
+ return <p className="text-xs text-muted-foreground">{emptyLabel}</p>;
157
+ return (
158
+ <div className="space-y-1">
159
+ {lines.map((line, i) => (
160
+ <div key={i} className="flex items-center gap-2 text-xs">
161
+ <span
162
+ className={`inline-block size-2 shrink-0 rounded-full ${
163
+ line.isOff ? 'bg-muted-foreground/30' : 'bg-emerald-500'
164
+ }`}
165
+ />
166
+ <span className="w-16 shrink-0 font-medium text-foreground">
167
+ {line.dayLabel}
168
+ </span>
169
+ {line.isOff ? (
170
+ <span className="text-muted-foreground">Folga</span>
171
+ ) : (
172
+ <span className="text-foreground">
173
+ {line.time}
174
+ {line.break ? (
175
+ <span className="ml-1 text-muted-foreground">
176
+ ({line.break}min int.)
177
+ </span>
178
+ ) : null}
179
+ </span>
180
+ )}
181
+ </div>
182
+ ))}
183
+ </div>
184
+ );
185
+ }
186
+
187
+ function formatDateLabel(value?: string | null) {
188
+ if (!value) return '—';
189
+ const match = String(value).match(/(\d{4}-\d{2}-\d{2})/);
190
+ if (!match) return value;
191
+ const date = new Date(`${match[1]}T12:00:00`);
192
+ if (Number.isNaN(date.getTime())) return value;
193
+ return new Intl.DateTimeFormat(undefined, {
194
+ day: '2-digit',
195
+ month: 'short',
196
+ year: 'numeric',
197
+ }).format(date);
198
+ }
199
+
200
+ function formatEntryDuration(minutes?: number | null, hours?: number | null) {
201
+ if (typeof minutes === 'number' && Number.isFinite(minutes) && minutes > 0) {
202
+ const h = Math.floor(minutes / 60);
203
+ const m = minutes % 60;
204
+ if (!h) return `${m}m`;
205
+ if (!m) return `${h}h`;
206
+ return `${h}h ${m}m`;
207
+ }
208
+ return formatHours(Number(hours ?? 0));
209
+ }
210
+
211
+ type PendingDecision = {
212
+ approval: OperationsApproval;
213
+ action: 'approve' | 'reject';
214
+ };
215
+
216
+ export default function OperationsApprovalsPage() {
217
+ const t = useTranslations('operations.ApprovalsPage');
218
+ const commonT = useTranslations('operations.Common');
219
+ const { request, showToastHandler, currentLocaleCode } = useApp();
220
+ const access = useOperationsAccess();
221
+ const [search, setSearch] = useState('');
222
+ const [statusFilter, setStatusFilter] = useState('all');
223
+ const [targetFilter, setTargetFilter] = useState('all');
224
+ const [dateFrom, setDateFrom] = useState('');
225
+ const [dateTo, setDateTo] = useState('');
226
+ const [calendarYear, setCalendarYear] = useState(() =>
227
+ new Date().getFullYear()
228
+ );
229
+ const [calendarMonth, setCalendarMonth] = useState(
230
+ () => new Date().getMonth() + 1
231
+ );
232
+ const [page, setPage] = useState(1);
233
+ const [pageSize, setPageSize] = useState(12);
234
+ const [viewMode, setViewMode] = useState<'table' | 'cards' | 'calendar'>(
235
+ () => {
236
+ if (typeof window === 'undefined') return 'table';
237
+ const saved = window.localStorage.getItem(
238
+ 'operations-approvals-view-mode'
239
+ );
240
+ return saved === 'cards' || saved === 'calendar' ? saved : 'table';
241
+ }
242
+ );
243
+ const [decisionNote, setDecisionNote] = useState('');
244
+ const [pendingDecision, setPendingDecision] =
245
+ useState<PendingDecision | null>(null);
246
+ const [selectedApproval, setSelectedApproval] =
247
+ useState<OperationsApproval | null>(null);
248
+ const [isDetailsOpen, setIsDetailsOpen] = useState(false);
249
+ const [isDetailLoading, setIsDetailLoading] = useState(false);
250
+
251
+ const getStatusLabel = (value?: string | null) => {
252
+ if (!value) {
253
+ return '-';
254
+ }
255
+
256
+ const key = `options.statuses.${value}`;
257
+ return t.has(key) ? t(key) : formatEnumLabel(value);
258
+ };
259
+
260
+ const getTargetTypeLabel = (value?: string | null) => {
261
+ if (!value) {
262
+ return '-';
263
+ }
264
+
265
+ const key = `options.targetTypes.${value}`;
266
+ return t.has(key) ? t(key) : formatEnumLabel(value);
267
+ };
268
+
269
+ const getTimeOffTypeLabel = (value?: string | null) => {
270
+ if (!value) {
271
+ return '-';
272
+ }
273
+
274
+ const key = `options.timeOffTypes.${value}`;
275
+ return t.has(key) ? t(key) : formatEnumLabel(value);
276
+ };
277
+
278
+ const getScheduleScopeLabel = (value?: string | null) => {
279
+ if (!value) {
280
+ return '-';
281
+ }
282
+
283
+ const key = `options.scheduleScopes.${value}`;
284
+ return t.has(key) ? t(key) : formatEnumLabel(value);
285
+ };
286
+
287
+ const getTypeColorClass = (targetType: string) => {
288
+ switch (targetType) {
289
+ case 'timesheet':
290
+ return 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400';
291
+ case 'time_off_request':
292
+ return 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400';
293
+ case 'schedule_adjustment_request':
294
+ return 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400';
295
+ default:
296
+ return 'bg-muted text-muted-foreground';
297
+ }
298
+ };
299
+
300
+ const getTypeIcon = (targetType: string) => {
301
+ switch (targetType) {
302
+ case 'timesheet':
303
+ return <Clock className="size-3" />;
304
+ case 'time_off_request':
305
+ return <CalendarOff className="size-3" />;
306
+ case 'schedule_adjustment_request':
307
+ return <SlidersHorizontal className="size-3" />;
308
+ default:
309
+ return null;
310
+ }
311
+ };
312
+
313
+ const getTargetLabel = (approval: OperationsApproval) => {
314
+ switch (approval.targetType) {
315
+ case 'timesheet':
316
+ return `${getTargetTypeLabel('timesheet')} ${formatDate(
317
+ approval.timesheetWeekStartDate
318
+ )}`;
319
+ case 'time_off_request':
320
+ return `${getTimeOffTypeLabel(approval.timeOffType)} ${formatDate(
321
+ approval.timeOffStartDate
322
+ )}`;
323
+ case 'schedule_adjustment_request':
324
+ return `${getScheduleScopeLabel(approval.scheduleRequestScope)} ${formatDate(
325
+ approval.scheduleStartDate
326
+ )}`;
327
+ default:
328
+ return getTargetTypeLabel(approval.targetType);
329
+ }
330
+ };
331
+
332
+ const { data: approvalsResponse, refetch } = useQuery<
333
+ PaginatedResponse<OperationsApproval>
334
+ >({
335
+ queryKey: [
336
+ 'operations-approvals',
337
+ currentLocaleCode,
338
+ search,
339
+ statusFilter,
340
+ targetFilter,
341
+ dateFrom,
342
+ dateTo,
343
+ page,
344
+ pageSize,
345
+ ],
346
+ enabled: access.isSupervisor,
347
+ queryFn: () => {
348
+ const params = new URLSearchParams({
349
+ page: String(page),
350
+ pageSize: String(pageSize),
351
+ });
352
+ if (search.trim()) params.set('search', search.trim());
353
+ if (statusFilter !== 'all') params.set('status', statusFilter);
354
+ if (targetFilter !== 'all') params.set('targetType', targetFilter);
355
+ if (dateFrom) params.set('dateFrom', dateFrom);
356
+ if (dateTo) params.set('dateTo', dateTo);
357
+ return fetchOperations<PaginatedResponse<OperationsApproval>>(
358
+ request,
359
+ `/operations/approvals?${params.toString()}`
360
+ );
361
+ },
362
+ placeholderData: (previous) => previous,
363
+ });
364
+
365
+ const calendarDateFrom = `${String(calendarYear)}-${String(calendarMonth).padStart(2, '0')}-01`;
366
+ const calendarDateTo = (() => {
367
+ const lastDay = new Date(calendarYear, calendarMonth, 0).getDate();
368
+ return `${String(calendarYear)}-${String(calendarMonth).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`;
369
+ })();
370
+
371
+ const { data: calendarApprovalsResponse } = useQuery<
372
+ PaginatedResponse<OperationsApproval>
373
+ >({
374
+ queryKey: [
375
+ 'operations-approvals-calendar',
376
+ currentLocaleCode,
377
+ search,
378
+ statusFilter,
379
+ calendarYear,
380
+ calendarMonth,
381
+ ],
382
+ enabled: access.isSupervisor && viewMode === 'calendar',
383
+ queryFn: () => {
384
+ const params = new URLSearchParams({
385
+ sortField: 'submittedAt',
386
+ sortOrder: 'desc',
387
+ dateFrom: calendarDateFrom,
388
+ dateTo: calendarDateTo,
389
+ });
390
+ if (search.trim()) params.set('search', search.trim());
391
+ if (statusFilter !== 'all') params.set('status', statusFilter);
392
+ return fetchOperations<PaginatedResponse<OperationsApproval>>(
393
+ request,
394
+ `/operations/approvals?${params.toString()}`
395
+ );
396
+ },
397
+ placeholderData: (previous) => previous,
398
+ });
399
+
400
+ const approvals = approvalsResponse?.data ?? [];
401
+ const calendarApprovals = calendarApprovalsResponse?.data ?? [];
402
+
403
+ const buildCalendarItem = (approval: OperationsApproval) => ({
404
+ id: `approval-${approval.id}`,
405
+ date:
406
+ approval.targetType === 'timesheet'
407
+ ? String(approval.timesheetWeekStartDate ?? '').match(
408
+ /(\d{4}-\d{2}-\d{2})/
409
+ )?.[1] ||
410
+ approval.submittedAt?.slice(0, 10) ||
411
+ ''
412
+ : approval.targetType === 'time_off_request'
413
+ ? String(approval.timeOffStartDate ?? '').match(
414
+ /(\d{4}-\d{2}-\d{2})/
415
+ )?.[1] ||
416
+ approval.submittedAt?.slice(0, 10) ||
417
+ ''
418
+ : String(approval.scheduleStartDate ?? '').match(
419
+ /(\d{4}-\d{2}-\d{2})/
420
+ )?.[1] ||
421
+ approval.submittedAt?.slice(0, 10) ||
422
+ '',
423
+ title: approval.requesterName,
424
+ subtitle: getTargetLabel(approval),
425
+ kind: approval.targetType,
426
+ meta:
427
+ approval.status === 'pending'
428
+ ? formatDateTime(approval.submittedAt)
429
+ : formatDateTime(approval.decidedAt),
430
+ statusLabel: getStatusLabel(approval.status),
431
+ badgeClassName: getStatusBadgeClass(approval.status),
432
+ });
433
+
434
+ const calendarItems = useMemo<OperationsCalendarItem[]>(
435
+ () =>
436
+ (viewMode === 'calendar' ? calendarApprovals : approvals).map(
437
+ buildCalendarItem
438
+ ),
439
+ // eslint-disable-next-line react-hooks/exhaustive-deps
440
+ [approvals, calendarApprovals, viewMode]
441
+ );
442
+
443
+ const calendarApprovalById = useMemo(
444
+ () => new Map(calendarApprovals.map((a) => [`approval-${a.id}`, a])),
445
+ [calendarApprovals]
446
+ );
447
+
448
+ const handleViewModeChange = (value: string) => {
449
+ if (value !== 'table' && value !== 'cards' && value !== 'calendar') return;
450
+ setViewMode(value as 'table' | 'cards' | 'calendar');
451
+ if (typeof window !== 'undefined') {
452
+ window.localStorage.setItem('operations-approvals-view-mode', value);
453
+ }
454
+ };
455
+
456
+ const cards = [
457
+ {
458
+ key: 'pending',
459
+ title: t('cards.pending'),
460
+ description: t('cards.pendingDescription'),
461
+ value: approvals.filter((item) => item.status === 'pending').length,
462
+ },
463
+ {
464
+ key: 'approved',
465
+ title: t('cards.approved'),
466
+ description: t('cards.approvedDescription'),
467
+ value: approvals.filter((item) => item.status === 'approved').length,
468
+ },
469
+ {
470
+ key: 'rejected',
471
+ title: t('cards.rejected'),
472
+ description: t('cards.rejectedDescription'),
473
+ value: approvals.filter((item) => item.status === 'rejected').length,
474
+ },
475
+ ];
476
+
477
+ const decide = async () => {
478
+ if (!pendingDecision) {
479
+ return;
480
+ }
481
+
482
+ try {
483
+ await request({
484
+ url: `/operations/approvals/${pendingDecision.approval.id}/${pendingDecision.action}`,
485
+ method: 'POST',
486
+ data: {
487
+ note: decisionNote.trim() || undefined,
488
+ },
489
+ });
490
+
491
+ showToastHandler?.(
492
+ 'success',
493
+ pendingDecision.action === 'approve'
494
+ ? t('messages.approveSuccess')
495
+ : t('messages.rejectSuccess')
496
+ );
497
+ setPendingDecision(null);
498
+ setDecisionNote('');
499
+ await refetch();
500
+ } catch {
501
+ showToastHandler?.(
502
+ 'error',
503
+ pendingDecision.action === 'approve'
504
+ ? t('messages.approveError')
505
+ : t('messages.rejectError')
506
+ );
507
+ }
508
+ };
509
+
510
+ const openDetails = async (approval: OperationsApproval) => {
511
+ setSelectedApproval(approval);
512
+ setIsDetailsOpen(true);
513
+ if (
514
+ approval.targetType === 'timesheet' ||
515
+ approval.targetType === 'schedule_adjustment_request'
516
+ ) {
517
+ setIsDetailLoading(true);
518
+ try {
519
+ const detail = await fetchOperations<OperationsApproval>(
520
+ request,
521
+ `/operations/approvals/${approval.id}`
522
+ );
523
+ setSelectedApproval(detail);
524
+ } catch {
525
+ // keep base data if detail fetch fails
526
+ } finally {
527
+ setIsDetailLoading(false);
528
+ }
529
+ }
530
+ };
531
+
532
+ if (!access.isSupervisor && !access.isLoading) {
533
+ return (
534
+ <Page>
535
+ <OperationsHeader
536
+ title={t('title')}
537
+ description={t('description')}
538
+ current={t('breadcrumb')}
539
+ />
540
+ <EmptyState
541
+ icon={<ClipboardCheck className="size-12" />}
542
+ title={commonT('states.noAccessTitle')}
543
+ description={t('noAccessDescription')}
544
+ actionLabel={commonT('actions.refresh')}
545
+ onAction={() => void refetch()}
546
+ />
547
+ </Page>
548
+ );
549
+ }
550
+
551
+ return (
552
+ <Page>
553
+ <OperationsHeader
554
+ title={t('title')}
555
+ description={t('description')}
556
+ current={t('breadcrumb')}
557
+ />
558
+
559
+ <KpiCardsGrid items={cards} columns={3} />
560
+
561
+ <div className="flex min-w-0 flex-col gap-4 xl:flex-row xl:items-center">
562
+ <div className="flex-1">
563
+ <SearchBar
564
+ searchQuery={search}
565
+ onSearchChange={(value) => {
566
+ setSearch(value);
567
+ setPage(1);
568
+ }}
569
+ showSearchButton={false}
570
+ debounceMs={500}
571
+ placeholder={t('searchPlaceholder')}
572
+ controls={[
573
+ {
574
+ id: 'status',
575
+ type: 'select',
576
+ value: statusFilter,
577
+ onChange: (value) => {
578
+ setStatusFilter(value);
579
+ setPage(1);
580
+ },
581
+ placeholder: commonT('labels.status'),
582
+ options: [
583
+ { value: 'all', label: commonT('filters.allStatuses') },
584
+ { value: 'pending', label: getStatusLabel('pending') },
585
+ { value: 'approved', label: getStatusLabel('approved') },
586
+ { value: 'rejected', label: getStatusLabel('rejected') },
587
+ ],
588
+ },
589
+ {
590
+ id: 'target',
591
+ type: 'select',
592
+ value: targetFilter,
593
+ onChange: (value) => {
594
+ setTargetFilter(value);
595
+ setPage(1);
596
+ },
597
+ placeholder: commonT('labels.requestType'),
598
+ options: [
599
+ { value: 'all', label: commonT('filters.allTypes') },
600
+ {
601
+ value: 'timesheet',
602
+ label: getTargetTypeLabel('timesheet'),
603
+ },
604
+ {
605
+ value: 'time_off_request',
606
+ label: getTargetTypeLabel('time_off_request'),
607
+ },
608
+ {
609
+ value: 'schedule_adjustment_request',
610
+ label: getTargetTypeLabel('schedule_adjustment_request'),
611
+ },
612
+ ],
613
+ },
614
+ {
615
+ id: 'dateFrom',
616
+ type: 'date',
617
+ value: dateFrom,
618
+ onChange: (value) => {
619
+ setDateFrom(value);
620
+ setPage(1);
621
+ },
622
+ label: commonT('filters.dateFrom'),
623
+ },
624
+ {
625
+ id: 'dateTo',
626
+ type: 'date',
627
+ value: dateTo,
628
+ onChange: (value) => {
629
+ setDateTo(value);
630
+ setPage(1);
631
+ },
632
+ label: commonT('filters.dateTo'),
633
+ },
634
+ ]}
635
+ />
636
+ </div>
637
+
638
+ <div className="flex items-center justify-between gap-3 xl:justify-end">
639
+ <span className="text-xs font-medium text-muted-foreground">
640
+ {t('viewMode')}
641
+ </span>
642
+ <ToggleGroup
643
+ type="single"
644
+ value={viewMode}
645
+ onValueChange={handleViewModeChange}
646
+ variant="outline"
647
+ size="sm"
648
+ >
649
+ <ToggleGroupItem value="table" className="gap-1.5 px-2.5">
650
+ <List className="h-4 w-4" />
651
+ <span className="hidden sm:inline">{t('viewModeTable')}</span>
652
+ </ToggleGroupItem>
653
+ <ToggleGroupItem value="cards" className="gap-1.5 px-2.5">
654
+ <LayoutGrid className="h-4 w-4" />
655
+ <span className="hidden sm:inline">{t('viewModeCards')}</span>
656
+ </ToggleGroupItem>
657
+ <ToggleGroupItem value="calendar" className="gap-1.5 px-2.5">
658
+ <CalendarDays className="h-4 w-4" />
659
+ <span className="hidden sm:inline">{t('viewModeCalendar')}</span>
660
+ </ToggleGroupItem>
661
+ </ToggleGroup>
662
+ </div>
663
+ </div>
664
+
665
+ {(viewMode === 'calendar' ? true : approvals.length > 0) ? (
666
+ viewMode === 'calendar' ? (
667
+ <OperationsCalendarView
668
+ locale={currentLocaleCode}
669
+ items={calendarItems.filter((item) => item.date)}
670
+ emptyLabel={t('emptyDescription')}
671
+ actionLabel={t('actions.viewDetails')}
672
+ onMonthChange={(year, month) => {
673
+ setCalendarYear(year);
674
+ setCalendarMonth(month);
675
+ }}
676
+ onDateSelect={(_date, items) => {
677
+ const approval = calendarApprovalById.get(String(items[0]?.id));
678
+ if (approval) void openDetails(approval);
679
+ }}
680
+ onOpenItem={(item) => {
681
+ const approval = calendarApprovalById.get(String(item.id));
682
+ if (approval) {
683
+ void openDetails(approval);
684
+ }
685
+ }}
686
+ />
687
+ ) : viewMode === 'cards' ? (
688
+ <div className="grid gap-4 md:grid-cols-2 2xl:grid-cols-3">
689
+ {approvals.map((approval) => (
690
+ <Card
691
+ key={approval.id}
692
+ className="overflow-hidden border-border/60 py-0 shadow-sm"
693
+ >
694
+ <CardContent className="space-y-3 p-4">
695
+ <div className="flex items-start justify-between gap-3">
696
+ <div className="min-w-0">
697
+ <div className="truncate font-semibold">
698
+ {approval.requesterName}
699
+ </div>
700
+ <div className="truncate text-xs text-muted-foreground">
701
+ {getTargetLabel(approval)}
702
+ </div>
703
+ </div>
704
+ <StatusBadge
705
+ label={getStatusLabel(approval.status)}
706
+ className={getStatusBadgeClass(approval.status)}
707
+ />
708
+ </div>
709
+ <div className="grid grid-cols-2 gap-2 text-sm text-muted-foreground">
710
+ <div>
711
+ <span className="font-medium text-foreground">
712
+ {commonT('labels.submittedAt')}:
713
+ </span>
714
+ <br />
715
+ {formatDateTime(approval.submittedAt)}
716
+ </div>
717
+ <div>
718
+ <span className="font-medium text-foreground">
719
+ {commonT('labels.approver')}:
720
+ </span>
721
+ <br />
722
+ {approval.approverName || commonT('labels.notAssigned')}
723
+ </div>
724
+ </div>
725
+ {approval.status === 'pending' ? (
726
+ <div className="flex flex-wrap justify-end gap-2 border-t border-border/60 pt-3">
727
+ <Button
728
+ size="sm"
729
+ variant="outline"
730
+ className="cursor-pointer"
731
+ onClick={() => void openDetails(approval)}
732
+ >
733
+ <Eye className="size-4" />
734
+ {t('actions.viewDetails')}
735
+ </Button>
736
+ <Button
737
+ size="sm"
738
+ variant="outline"
739
+ onClick={() => {
740
+ setPendingDecision({ approval, action: 'reject' });
741
+ setDecisionNote('');
742
+ }}
743
+ >
744
+ <X className="size-4" />
745
+ {commonT('actions.reject')}
746
+ </Button>
747
+ <Button
748
+ size="sm"
749
+ onClick={() => {
750
+ setPendingDecision({ approval, action: 'approve' });
751
+ setDecisionNote('');
752
+ }}
753
+ >
754
+ <Check className="size-4" />
755
+ {commonT('actions.approve')}
756
+ </Button>
757
+ </div>
758
+ ) : (
759
+ <div className="flex items-center justify-between gap-2 border-t border-border/60 pt-3">
760
+ <Button
761
+ size="sm"
762
+ variant="outline"
763
+ className="cursor-pointer"
764
+ onClick={() => void openDetails(approval)}
765
+ >
766
+ <Eye className="size-4" />
767
+ {t('actions.viewDetails')}
768
+ </Button>
769
+ <div className="text-right text-xs text-muted-foreground">
770
+ {formatDateTime(approval.decidedAt)}
771
+ </div>
772
+ </div>
773
+ )}
774
+ </CardContent>
775
+ </Card>
776
+ ))}
777
+ </div>
778
+ ) : (
779
+ <div className="overflow-x-auto rounded-md border">
780
+ <Table>
781
+ <TableHeader>
782
+ <TableRow>
783
+ <TableHead>{commonT('labels.requester')}</TableHead>
784
+ <TableHead>{commonT('labels.requestType')}</TableHead>
785
+ <TableHead>{commonT('labels.submittedAt')}</TableHead>
786
+ <TableHead>{commonT('labels.approver')}</TableHead>
787
+ <TableHead>{commonT('labels.status')}</TableHead>
788
+ <TableHead className="w-45 text-right">
789
+ {commonT('labels.actions')}
790
+ </TableHead>
791
+ </TableRow>
792
+ </TableHeader>
793
+ <TableBody>
794
+ {approvals.map((approval) => (
795
+ <TableRow key={approval.id}>
796
+ <TableCell>
797
+ <div className="font-medium">
798
+ {approval.requesterName}
799
+ </div>
800
+ <div className="text-xs text-muted-foreground">
801
+ {approval.decisionNote || commonT('labels.noNotes')}
802
+ </div>
803
+ </TableCell>
804
+ <TableCell>{getTargetLabel(approval)}</TableCell>
805
+ <TableCell>
806
+ <div>{formatDateTime(approval.submittedAt)}</div>
807
+ <div className="text-xs text-muted-foreground">
808
+ {formatDate(approval.decidedAt)}
809
+ </div>
810
+ </TableCell>
811
+ <TableCell>
812
+ <div>
813
+ {approval.approverName || commonT('labels.notAssigned')}
814
+ </div>
815
+ <div className="text-xs text-muted-foreground">
816
+ {approval.targetType === 'timesheet'
817
+ ? [
818
+ approval.timesheetProjectNames,
819
+ approval.timesheetTotalHours
820
+ ? `${approval.timesheetTotalHours}h`
821
+ : null,
822
+ ]
823
+ .filter(Boolean)
824
+ .join(' • ') || commonT('labels.notAvailable')
825
+ : approval.targetType === 'time_off_request'
826
+ ? approval.timeOffReason ||
827
+ commonT('labels.noNotes')
828
+ : approval.scheduleReason ||
829
+ commonT('labels.noNotes')}
830
+ </div>
831
+ </TableCell>
832
+ <TableCell>
833
+ <StatusBadge
834
+ label={getStatusLabel(approval.status)}
835
+ className={getStatusBadgeClass(approval.status)}
836
+ />
837
+ </TableCell>
838
+ <TableCell>
839
+ <div className="flex flex-wrap justify-end gap-2">
840
+ <Button
841
+ size="sm"
842
+ variant="outline"
843
+ className="cursor-pointer"
844
+ onClick={() => void openDetails(approval)}
845
+ >
846
+ <Eye className="size-4" />
847
+ {t('actions.viewDetails')}
848
+ </Button>
849
+ {approval.status === 'pending' ? (
850
+ <>
851
+ <Button
852
+ size="sm"
853
+ variant="outline"
854
+ onClick={() => {
855
+ setPendingDecision({
856
+ approval,
857
+ action: 'reject',
858
+ });
859
+ setDecisionNote('');
860
+ }}
861
+ >
862
+ <X className="size-4" />
863
+ {commonT('actions.reject')}
864
+ </Button>
865
+ <Button
866
+ size="sm"
867
+ onClick={() => {
868
+ setPendingDecision({
869
+ approval,
870
+ action: 'approve',
871
+ });
872
+ setDecisionNote('');
873
+ }}
874
+ >
875
+ <Check className="size-4" />
876
+ {commonT('actions.approve')}
877
+ </Button>
878
+ </>
879
+ ) : (
880
+ <div className="flex items-center text-right text-xs text-muted-foreground">
881
+ {formatDateTime(approval.decidedAt)}
882
+ </div>
883
+ )}
884
+ </div>
885
+ </TableCell>
886
+ </TableRow>
887
+ ))}
888
+ </TableBody>
889
+ </Table>
890
+ </div>
891
+ )
892
+ ) : (
893
+ <EmptyState
894
+ icon={<ClipboardCheck className="size-12" />}
895
+ title={commonT('states.emptyTitle')}
896
+ description={t('emptyDescription')}
897
+ actionLabel={commonT('actions.refresh')}
898
+ onAction={() => void refetch()}
899
+ />
900
+ )}
901
+
902
+ <PaginationFooter
903
+ currentPage={page}
904
+ pageSize={pageSize}
905
+ totalItems={approvalsResponse?.total ?? 0}
906
+ pageSizeOptions={[12, 24, 48]}
907
+ onPageChange={setPage}
908
+ onPageSizeChange={(size) => {
909
+ setPageSize(size);
910
+ setPage(1);
911
+ }}
912
+ />
913
+
914
+ <Sheet open={isDetailsOpen} onOpenChange={setIsDetailsOpen}>
915
+ <SheetContent className="w-full overflow-y-auto sm:max-w-2xl">
916
+ <SheetHeader>
917
+ <SheetTitle>{t('details.title')}</SheetTitle>
918
+ <SheetDescription>{t('details.description')}</SheetDescription>
919
+ </SheetHeader>
920
+
921
+ {selectedApproval ? (
922
+ <div className="mt-6 space-y-5 px-4 pb-8">
923
+ <div className="rounded-lg border bg-muted/20 p-4">
924
+ <div className="flex flex-wrap items-start justify-between gap-3">
925
+ <div>
926
+ <div className="text-lg font-semibold">
927
+ {selectedApproval.requesterName}
928
+ </div>
929
+ <div className="mt-2 flex flex-wrap items-center gap-2">
930
+ <span
931
+ className={`inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium ${getTypeColorClass(selectedApproval.targetType)}`}
932
+ >
933
+ {getTypeIcon(selectedApproval.targetType)}
934
+ {getTargetTypeLabel(selectedApproval.targetType)}
935
+ </span>
936
+ <span className="text-sm text-muted-foreground">
937
+ {selectedApproval.targetType === 'timesheet'
938
+ ? formatDate(selectedApproval.timesheetWeekStartDate)
939
+ : selectedApproval.targetType === 'time_off_request'
940
+ ? [
941
+ formatDate(selectedApproval.timeOffStartDate),
942
+ formatDate(selectedApproval.timeOffEndDate),
943
+ ]
944
+ .filter(Boolean)
945
+ .join(' – ')
946
+ : [
947
+ formatDate(selectedApproval.scheduleStartDate),
948
+ formatDate(selectedApproval.scheduleEndDate),
949
+ ]
950
+ .filter(Boolean)
951
+ .join(' – ')}
952
+ </span>
953
+ </div>
954
+ </div>
955
+ <StatusBadge
956
+ label={getStatusLabel(selectedApproval.status)}
957
+ className={getStatusBadgeClass(selectedApproval.status)}
958
+ />
959
+ </div>
960
+ </div>
961
+
962
+ <div className="grid gap-4 sm:grid-cols-2">
963
+ <div>
964
+ <div className="text-xs font-medium uppercase text-muted-foreground">
965
+ {commonT('labels.approver')}
966
+ </div>
967
+ <div className="mt-1 text-sm">
968
+ {selectedApproval.approverName ||
969
+ commonT('labels.notAssigned')}
970
+ </div>
971
+ </div>
972
+ <div>
973
+ <div className="text-xs font-medium uppercase text-muted-foreground">
974
+ {commonT('labels.submittedAt')}
975
+ </div>
976
+ <div className="mt-1 text-sm">
977
+ {formatDateTime(selectedApproval.submittedAt)}
978
+ </div>
979
+ </div>
980
+ <div>
981
+ <div className="text-xs font-medium uppercase text-muted-foreground">
982
+ {t('details.decidedAt')}
983
+ </div>
984
+ <div className="mt-1 text-sm">
985
+ {formatDateTime(selectedApproval.decidedAt) ?? '-'}
986
+ </div>
987
+ </div>
988
+ </div>
989
+
990
+ <div className="flex items-center gap-3">
991
+ <div className="flex-1 border-t" />
992
+ <span className="text-xs font-semibold uppercase tracking-wide text-muted-foreground">
993
+ {selectedApproval.targetType === 'timesheet'
994
+ ? t('details.timesheetSection')
995
+ : selectedApproval.targetType === 'time_off_request'
996
+ ? t('details.timeOffSection')
997
+ : t('details.scheduleSection')}
998
+ </span>
999
+ <div className="flex-1 border-t" />
1000
+ </div>
1001
+
1002
+ {selectedApproval.targetType === 'timesheet' ? (
1003
+ <>
1004
+ <div className="grid gap-4 sm:grid-cols-2">
1005
+ <div>
1006
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1007
+ {t('details.period')}
1008
+ </div>
1009
+ <div className="mt-1 text-sm">
1010
+ {formatDate(selectedApproval.timesheetWeekStartDate)}
1011
+ </div>
1012
+ </div>
1013
+ <div>
1014
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1015
+ {commonT('labels.totalHours')}
1016
+ </div>
1017
+ <div className="mt-1 text-sm">
1018
+ {selectedApproval.timesheetTotalHours != null
1019
+ ? `${selectedApproval.timesheetTotalHours}h`
1020
+ : commonT('labels.notAvailable')}
1021
+ </div>
1022
+ </div>
1023
+ <div className="sm:col-span-2">
1024
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1025
+ {t('details.projects')}
1026
+ </div>
1027
+ <div className="mt-1 rounded-lg border p-3 text-sm">
1028
+ {selectedApproval.timesheetProjectNames ||
1029
+ commonT('labels.notAvailable')}
1030
+ </div>
1031
+ </div>
1032
+ </div>
1033
+
1034
+ <div>
1035
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1036
+ {t('details.entriesTitle')}
1037
+ </div>
1038
+ {isDetailLoading ? (
1039
+ <div className="mt-3 flex items-center gap-2 text-sm text-muted-foreground">
1040
+ <Loader2 className="size-4 animate-spin" />
1041
+ {t('details.loadingEntries')}
1042
+ </div>
1043
+ ) : (
1044
+ <div className="mt-2 space-y-3">
1045
+ {(selectedApproval.entries ?? []).length ? (
1046
+ (selectedApproval.entries ?? []).map((entry) => (
1047
+ <div
1048
+ key={entry.id}
1049
+ className="rounded-lg border p-3"
1050
+ >
1051
+ <div className="flex flex-wrap items-start justify-between gap-3">
1052
+ <div>
1053
+ <div className="font-medium">
1054
+ {entry.taskName ||
1055
+ entry.activityLabel ||
1056
+ commonT('labels.unassigned')}
1057
+ </div>
1058
+ <div className="text-xs text-muted-foreground">
1059
+ {[entry.projectName, entry.roleLabel]
1060
+ .filter(Boolean)
1061
+ .join(' • ') ||
1062
+ commonT('labels.unassigned')}
1063
+ </div>
1064
+ </div>
1065
+ <div className="text-sm text-muted-foreground">
1066
+ {formatEntryDuration(
1067
+ entry.durationMinutes,
1068
+ entry.hours
1069
+ )}
1070
+ </div>
1071
+ </div>
1072
+ <div className="mt-2 text-xs text-muted-foreground">
1073
+ {formatDateLabel(entry.workDate)}
1074
+ </div>
1075
+ <div className="mt-2 text-sm">
1076
+ {entry.description || commonT('labels.noNotes')}
1077
+ </div>
1078
+ </div>
1079
+ ))
1080
+ ) : (
1081
+ <div className="rounded-lg border p-3 text-sm text-muted-foreground">
1082
+ {t('details.noEntries')}
1083
+ </div>
1084
+ )}
1085
+ </div>
1086
+ )}
1087
+ </div>
1088
+ </>
1089
+ ) : null}
1090
+
1091
+ {selectedApproval.targetType === 'time_off_request' ? (
1092
+ <div className="grid gap-4 sm:grid-cols-2">
1093
+ <div className="sm:col-span-2">
1094
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1095
+ {t('details.period')}
1096
+ </div>
1097
+ <div className="mt-1 text-sm">
1098
+ {[
1099
+ formatDate(selectedApproval.timeOffStartDate),
1100
+ formatDate(selectedApproval.timeOffEndDate),
1101
+ ]
1102
+ .filter(Boolean)
1103
+ .join(' – ') || '—'}
1104
+ </div>
1105
+ </div>
1106
+ <div>
1107
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1108
+ {commonT('labels.requestType')}
1109
+ </div>
1110
+ <div className="mt-1 text-sm">
1111
+ {getTimeOffTypeLabel(selectedApproval.timeOffType)}
1112
+ </div>
1113
+ </div>
1114
+ <div className="sm:col-span-2">
1115
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1116
+ {commonT('labels.reason')}
1117
+ </div>
1118
+ <div className="mt-1 rounded-lg border p-3 text-sm">
1119
+ {selectedApproval.timeOffReason ||
1120
+ commonT('labels.noNotes')}
1121
+ </div>
1122
+ </div>
1123
+ </div>
1124
+ ) : null}
1125
+
1126
+ {selectedApproval.targetType === 'schedule_adjustment_request' ? (
1127
+ <>
1128
+ <div className="grid gap-4 sm:grid-cols-2">
1129
+ <div className="sm:col-span-2">
1130
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1131
+ {t('details.period')}
1132
+ </div>
1133
+ <div className="mt-1 text-sm">
1134
+ {[
1135
+ formatDate(selectedApproval.scheduleStartDate),
1136
+ formatDate(selectedApproval.scheduleEndDate),
1137
+ ]
1138
+ .filter(Boolean)
1139
+ .join(' – ') || '—'}
1140
+ </div>
1141
+ </div>
1142
+ <div>
1143
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1144
+ {commonT('labels.requestScope')}
1145
+ </div>
1146
+ <div className="mt-1 text-sm">
1147
+ {getScheduleScopeLabel(
1148
+ selectedApproval.scheduleRequestScope
1149
+ )}
1150
+ </div>
1151
+ </div>
1152
+ <div className="sm:col-span-2">
1153
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1154
+ {commonT('labels.reason')}
1155
+ </div>
1156
+ <div className="mt-1 rounded-lg border p-3 text-sm">
1157
+ {selectedApproval.scheduleReason ||
1158
+ commonT('labels.noNotes')}
1159
+ </div>
1160
+ </div>
1161
+ </div>
1162
+
1163
+ {isDetailLoading ? (
1164
+ <div className="flex items-center gap-2 text-sm text-muted-foreground">
1165
+ <Loader2 className="size-4 animate-spin" />
1166
+ {t('details.loadingSchedule')}
1167
+ </div>
1168
+ ) : (
1169
+ <div className="grid gap-4 sm:grid-cols-2">
1170
+ <div>
1171
+ <div className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
1172
+ {t('details.currentSchedule')}
1173
+ </div>
1174
+ <div className="rounded-lg border p-3">
1175
+ <SchedulePanel
1176
+ days={selectedApproval.currentSchedule ?? []}
1177
+ locale={currentLocaleCode}
1178
+ emptyLabel={commonT('labels.notAssigned')}
1179
+ />
1180
+ </div>
1181
+ </div>
1182
+ <div>
1183
+ <div className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
1184
+ {t('details.requestedSchedule')}
1185
+ </div>
1186
+ <div className="rounded-lg border p-3">
1187
+ <SchedulePanel
1188
+ days={selectedApproval.days ?? []}
1189
+ locale={currentLocaleCode}
1190
+ emptyLabel={commonT('labels.notAssigned')}
1191
+ />
1192
+ </div>
1193
+ </div>
1194
+ </div>
1195
+ )}
1196
+ </>
1197
+ ) : null}
1198
+
1199
+ <div>
1200
+ <div className="text-xs font-medium uppercase text-muted-foreground">
1201
+ {commonT('labels.decisionNote')}
1202
+ </div>
1203
+ <div className="mt-1 rounded-lg border p-3 text-sm">
1204
+ {selectedApproval.decisionNote || commonT('labels.noNotes')}
1205
+ </div>
1206
+ </div>
1207
+ </div>
1208
+ ) : null}
1209
+ </SheetContent>
1210
+ </Sheet>
1211
+
1212
+ <Dialog
1213
+ open={Boolean(pendingDecision)}
1214
+ onOpenChange={(open) => {
1215
+ if (!open) {
1216
+ setPendingDecision(null);
1217
+ setDecisionNote('');
1218
+ }
1219
+ }}
1220
+ >
1221
+ <DialogContent className="max-w-150">
1222
+ <DialogHeader>
1223
+ <DialogTitle>
1224
+ {pendingDecision?.action === 'approve'
1225
+ ? t('dialog.approveTitle')
1226
+ : t('dialog.rejectTitle')}
1227
+ </DialogTitle>
1228
+ <DialogDescription>
1229
+ {pendingDecision
1230
+ ? t('dialog.description', {
1231
+ target: getTargetLabel(pendingDecision.approval),
1232
+ requester: pendingDecision.approval.requesterName,
1233
+ })
1234
+ : ''}
1235
+ </DialogDescription>
1236
+ </DialogHeader>
1237
+
1238
+ <div className="space-y-2">
1239
+ <label className="text-sm font-medium">
1240
+ {commonT('labels.noteOptional')}
1241
+ </label>
1242
+ <Textarea
1243
+ rows={4}
1244
+ value={decisionNote}
1245
+ placeholder={t('dialog.notePlaceholder')}
1246
+ onChange={(event) => setDecisionNote(event.target.value)}
1247
+ />
1248
+ </div>
1249
+
1250
+ <DialogFooter>
1251
+ <Button
1252
+ variant="outline"
1253
+ onClick={() => {
1254
+ setPendingDecision(null);
1255
+ setDecisionNote('');
1256
+ }}
1257
+ >
1258
+ {commonT('actions.cancel')}
1259
+ </Button>
1260
+ <Button
1261
+ variant={
1262
+ pendingDecision?.action === 'approve'
1263
+ ? 'default'
1264
+ : 'destructive'
1265
+ }
1266
+ onClick={() => void decide()}
1267
+ >
1268
+ {pendingDecision?.action === 'approve'
1269
+ ? commonT('actions.approve')
1270
+ : commonT('actions.reject')}
1271
+ </Button>
1272
+ </DialogFooter>
1273
+ </DialogContent>
1274
+ </Dialog>
1275
+ </Page>
1276
+ );
1277
+ }