@hed-hog/operations 0.0.327 → 0.0.329

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 (571) hide show
  1. package/dist/controllers/operations-tasks.controller.d.ts +3 -3
  2. package/dist/operations.service.d.ts +3 -3
  3. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +7 -7
  4. package/hedhog/frontend/app/_components/department-picker.tsx.ejs +125 -0
  5. package/hedhog/frontend/app/_components/department-select-with-create.tsx.ejs +64 -325
  6. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +16 -16
  7. package/hedhog/frontend/app/_components/system-user-picker.tsx.ejs +198 -0
  8. package/hedhog/frontend/app/_components/system-user-select-with-create.tsx.ejs +107 -569
  9. package/hedhog/frontend/messages/en.json +79 -10
  10. package/hedhog/frontend/messages/operations/en.json +67 -3
  11. package/hedhog/frontend/messages/operations/pt.json +67 -3
  12. package/hedhog/frontend/messages/pt.json +77 -8
  13. package/package.json +5 -5
  14. package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +0 -476
  15. package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +0 -261
  16. package/hedhog/frontend/app/_components/contract-content-editor.tsx.ejs +0 -258
  17. package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +0 -1
  18. package/hedhog/frontend/messages/en.json.ejs +0 -2060
  19. package/hedhog/frontend/messages/operations/operations/en.json +0 -2102
  20. package/hedhog/frontend/messages/operations/operations/pt.json +0 -2111
  21. package/hedhog/frontend/messages/pt.json.ejs +0 -2067
  22. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts +0 -29
  23. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts.map +0 -1
  24. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js +0 -95
  25. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js.map +0 -1
  26. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.tsx +0 -233
  27. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts +0 -10
  28. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts.map +0 -1
  29. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js +0 -577
  30. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js.map +0 -1
  31. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.tsx +0 -868
  32. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts +0 -4
  33. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts.map +0 -1
  34. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js +0 -337
  35. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js.map +0 -1
  36. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.tsx +0 -476
  37. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts +0 -9
  38. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts.map +0 -1
  39. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js +0 -1348
  40. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js.map +0 -1
  41. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.tsx +0 -2233
  42. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts +0 -12
  43. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts.map +0 -1
  44. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js +0 -162
  45. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js.map +0 -1
  46. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.tsx +0 -261
  47. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts +0 -18
  48. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts.map +0 -1
  49. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js +0 -145
  50. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js.map +0 -1
  51. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.tsx +0 -258
  52. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts +0 -4
  53. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts.map +0 -1
  54. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js +0 -223
  55. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js.map +0 -1
  56. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.tsx +0 -342
  57. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts +0 -58
  58. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts.map +0 -1
  59. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js +0 -438
  60. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js.map +0 -1
  61. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.tsx +0 -698
  62. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts +0 -20
  63. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts.map +0 -1
  64. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js +0 -233
  65. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js.map +0 -1
  66. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.tsx +0 -392
  67. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts +0 -4
  68. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts.map +0 -1
  69. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js +0 -814
  70. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js.map +0 -1
  71. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.tsx +0 -1288
  72. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts +0 -21
  73. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts.map +0 -1
  74. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js +0 -174
  75. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js.map +0 -1
  76. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.tsx +0 -306
  77. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts +0 -10
  78. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts.map +0 -1
  79. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js +0 -12
  80. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js.map +0 -1
  81. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.tsx +0 -29
  82. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts +0 -15
  83. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts.map +0 -1
  84. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js +0 -501
  85. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js.map +0 -1
  86. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.tsx +0 -853
  87. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts +0 -6
  88. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts.map +0 -1
  89. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js +0 -847
  90. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js.map +0 -1
  91. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.tsx +0 -1340
  92. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts +0 -4
  93. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts.map +0 -1
  94. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js +0 -2930
  95. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js.map +0 -1
  96. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.tsx +0 -4378
  97. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts +0 -9
  98. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts.map +0 -1
  99. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js +0 -1013
  100. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js.map +0 -1
  101. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.tsx +0 -1745
  102. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts +0 -13
  103. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts.map +0 -1
  104. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js +0 -38
  105. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js.map +0 -1
  106. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.tsx +0 -74
  107. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts +0 -7
  108. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts.map +0 -1
  109. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js +0 -11
  110. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js.map +0 -1
  111. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.tsx +0 -15
  112. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts +0 -18
  113. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts.map +0 -1
  114. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js +0 -406
  115. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js.map +0 -1
  116. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.tsx +0 -660
  117. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts +0 -26
  118. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts.map +0 -1
  119. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js +0 -332
  120. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js.map +0 -1
  121. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.tsx +0 -518
  122. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts +0 -6
  123. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts.map +0 -1
  124. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js +0 -255
  125. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js.map +0 -1
  126. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.tsx +0 -388
  127. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts +0 -10
  128. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts.map +0 -1
  129. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js +0 -131
  130. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js.map +0 -1
  131. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.tsx +0 -214
  132. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts +0 -108
  133. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts.map +0 -1
  134. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js +0 -162
  135. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js.map +0 -1
  136. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.ts +0 -428
  137. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts +0 -8
  138. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts.map +0 -1
  139. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js +0 -36
  140. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js.map +0 -1
  141. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.ts +0 -44
  142. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts +0 -837
  143. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts.map +0 -1
  144. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js +0 -3
  145. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js.map +0 -1
  146. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.ts +0 -861
  147. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts +0 -16
  148. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts.map +0 -1
  149. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js +0 -182
  150. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js.map +0 -1
  151. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.ts +0 -250
  152. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts +0 -4
  153. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts.map +0 -1
  154. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js +0 -51
  155. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js.map +0 -1
  156. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.ts +0 -61
  157. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts +0 -2
  158. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts.map +0 -1
  159. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js +0 -954
  160. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js.map +0 -1
  161. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.tsx +0 -1277
  162. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts +0 -2
  163. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts.map +0 -1
  164. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js +0 -488
  165. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js.map +0 -1
  166. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.tsx +0 -805
  167. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts +0 -6
  168. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts.map +0 -1
  169. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js +0 -9
  170. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js.map +0 -1
  171. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.tsx +0 -11
  172. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts +0 -6
  173. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts.map +0 -1
  174. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js +0 -9
  175. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js.map +0 -1
  176. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.tsx +0 -11
  177. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts +0 -2
  178. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts.map +0 -1
  179. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js +0 -8
  180. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js.map +0 -1
  181. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.tsx +0 -5
  182. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts +0 -2
  183. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts.map +0 -1
  184. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js +0 -612
  185. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js.map +0 -1
  186. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.tsx +0 -939
  187. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts +0 -6
  188. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts.map +0 -1
  189. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js +0 -9
  190. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js.map +0 -1
  191. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.tsx +0 -11
  192. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts +0 -6
  193. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts.map +0 -1
  194. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js +0 -9
  195. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js.map +0 -1
  196. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.tsx +0 -11
  197. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts +0 -6
  198. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts.map +0 -1
  199. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js +0 -9
  200. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js.map +0 -1
  201. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.tsx +0 -17
  202. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts +0 -2
  203. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts.map +0 -1
  204. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js +0 -348
  205. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js.map +0 -1
  206. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.tsx +0 -536
  207. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts +0 -2
  208. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts.map +0 -1
  209. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js +0 -401
  210. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js.map +0 -1
  211. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.tsx +0 -607
  212. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts +0 -5
  213. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts.map +0 -1
  214. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js +0 -7
  215. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js.map +0 -1
  216. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.tsx +0 -9
  217. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts +0 -6
  218. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts.map +0 -1
  219. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js +0 -9
  220. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js.map +0 -1
  221. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.tsx +0 -11
  222. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts +0 -2
  223. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts.map +0 -1
  224. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js +0 -321
  225. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js.map +0 -1
  226. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.tsx +0 -440
  227. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts +0 -2
  228. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts.map +0 -1
  229. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js +0 -939
  230. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js.map +0 -1
  231. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.tsx +0 -1499
  232. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts +0 -29
  233. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts.map +0 -1
  234. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js +0 -95
  235. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js.map +0 -1
  236. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.tsx +0 -233
  237. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts +0 -10
  238. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts.map +0 -1
  239. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js +0 -577
  240. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js.map +0 -1
  241. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.tsx +0 -868
  242. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts +0 -4
  243. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts.map +0 -1
  244. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js +0 -337
  245. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js.map +0 -1
  246. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.tsx +0 -476
  247. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts +0 -9
  248. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts.map +0 -1
  249. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js +0 -1348
  250. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js.map +0 -1
  251. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.tsx +0 -2233
  252. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts +0 -12
  253. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts.map +0 -1
  254. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js +0 -162
  255. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js.map +0 -1
  256. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.tsx +0 -261
  257. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts +0 -18
  258. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts.map +0 -1
  259. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js +0 -145
  260. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js.map +0 -1
  261. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.tsx +0 -258
  262. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts +0 -4
  263. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts.map +0 -1
  264. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js +0 -223
  265. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js.map +0 -1
  266. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.tsx +0 -342
  267. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts +0 -58
  268. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts.map +0 -1
  269. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js +0 -438
  270. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js.map +0 -1
  271. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.tsx +0 -698
  272. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts +0 -20
  273. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts.map +0 -1
  274. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js +0 -233
  275. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js.map +0 -1
  276. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.tsx +0 -392
  277. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts +0 -4
  278. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts.map +0 -1
  279. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js +0 -814
  280. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js.map +0 -1
  281. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.tsx +0 -1288
  282. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts +0 -21
  283. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts.map +0 -1
  284. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js +0 -174
  285. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js.map +0 -1
  286. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.tsx +0 -306
  287. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts +0 -10
  288. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts.map +0 -1
  289. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js +0 -12
  290. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js.map +0 -1
  291. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.tsx +0 -29
  292. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts +0 -15
  293. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts.map +0 -1
  294. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js +0 -501
  295. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js.map +0 -1
  296. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.tsx +0 -853
  297. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts +0 -6
  298. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts.map +0 -1
  299. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js +0 -459
  300. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js.map +0 -1
  301. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.tsx +0 -598
  302. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts +0 -6
  303. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts.map +0 -1
  304. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js +0 -876
  305. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js.map +0 -1
  306. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.tsx +0 -1368
  307. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts +0 -4
  308. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts.map +0 -1
  309. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js +0 -2930
  310. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js.map +0 -1
  311. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.tsx +0 -4378
  312. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts +0 -9
  313. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts.map +0 -1
  314. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js +0 -1013
  315. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js.map +0 -1
  316. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.tsx +0 -1745
  317. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts +0 -13
  318. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts.map +0 -1
  319. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js +0 -38
  320. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js.map +0 -1
  321. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.tsx +0 -74
  322. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts +0 -7
  323. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts.map +0 -1
  324. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js +0 -11
  325. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js.map +0 -1
  326. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.tsx +0 -15
  327. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts +0 -18
  328. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts.map +0 -1
  329. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js +0 -406
  330. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js.map +0 -1
  331. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.tsx +0 -660
  332. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts +0 -26
  333. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts.map +0 -1
  334. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js +0 -332
  335. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js.map +0 -1
  336. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.tsx +0 -518
  337. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts +0 -6
  338. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts.map +0 -1
  339. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js +0 -255
  340. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js.map +0 -1
  341. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.tsx +0 -388
  342. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts +0 -10
  343. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts.map +0 -1
  344. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js +0 -131
  345. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js.map +0 -1
  346. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.tsx +0 -214
  347. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts +0 -108
  348. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts.map +0 -1
  349. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js +0 -162
  350. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js.map +0 -1
  351. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.ts +0 -428
  352. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts +0 -8
  353. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts.map +0 -1
  354. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js +0 -36
  355. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js.map +0 -1
  356. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.ts +0 -44
  357. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts +0 -837
  358. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts.map +0 -1
  359. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js +0 -3
  360. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js.map +0 -1
  361. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.ts +0 -861
  362. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts +0 -16
  363. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts.map +0 -1
  364. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js +0 -182
  365. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js.map +0 -1
  366. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.ts +0 -250
  367. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts +0 -4
  368. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts.map +0 -1
  369. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js +0 -51
  370. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js.map +0 -1
  371. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.ts +0 -61
  372. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts +0 -2
  373. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts.map +0 -1
  374. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js +0 -954
  375. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js.map +0 -1
  376. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.tsx +0 -1277
  377. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts +0 -2
  378. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts.map +0 -1
  379. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js +0 -488
  380. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js.map +0 -1
  381. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.tsx +0 -805
  382. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts +0 -6
  383. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts.map +0 -1
  384. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js +0 -9
  385. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js.map +0 -1
  386. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.tsx +0 -11
  387. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts +0 -6
  388. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts.map +0 -1
  389. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js +0 -9
  390. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js.map +0 -1
  391. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.tsx +0 -11
  392. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts +0 -2
  393. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts.map +0 -1
  394. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js +0 -8
  395. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js.map +0 -1
  396. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.tsx +0 -5
  397. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts +0 -2
  398. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts.map +0 -1
  399. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js +0 -612
  400. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js.map +0 -1
  401. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.tsx +0 -939
  402. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts +0 -6
  403. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts.map +0 -1
  404. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js +0 -9
  405. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js.map +0 -1
  406. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.tsx +0 -11
  407. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts +0 -6
  408. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts.map +0 -1
  409. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js +0 -9
  410. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js.map +0 -1
  411. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.tsx +0 -11
  412. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts +0 -6
  413. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts.map +0 -1
  414. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js +0 -9
  415. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js.map +0 -1
  416. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.tsx +0 -17
  417. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts +0 -2
  418. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts.map +0 -1
  419. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js +0 -348
  420. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js.map +0 -1
  421. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.tsx +0 -536
  422. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts +0 -2
  423. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts.map +0 -1
  424. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js +0 -401
  425. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js.map +0 -1
  426. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.tsx +0 -607
  427. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts +0 -5
  428. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts.map +0 -1
  429. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js +0 -7
  430. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js.map +0 -1
  431. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.tsx +0 -9
  432. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts +0 -6
  433. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts.map +0 -1
  434. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js +0 -9
  435. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js.map +0 -1
  436. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.tsx +0 -11
  437. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts +0 -2
  438. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts.map +0 -1
  439. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js +0 -321
  440. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js.map +0 -1
  441. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.tsx +0 -440
  442. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts +0 -2
  443. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts.map +0 -1
  444. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js +0 -939
  445. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js.map +0 -1
  446. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.tsx +0 -1499
  447. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts +0 -2
  448. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts.map +0 -1
  449. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js +0 -8
  450. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js.map +0 -1
  451. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.tsx +0 -5
  452. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts +0 -2
  453. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts.map +0 -1
  454. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js +0 -436
  455. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js.map +0 -1
  456. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.tsx +0 -675
  457. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts +0 -2
  458. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts.map +0 -1
  459. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js +0 -563
  460. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js.map +0 -1
  461. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.tsx +0 -846
  462. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts +0 -6
  463. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts.map +0 -1
  464. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js +0 -9
  465. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js.map +0 -1
  466. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.tsx +0 -10
  467. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts +0 -6
  468. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts.map +0 -1
  469. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js +0 -9
  470. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js.map +0 -1
  471. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.tsx +0 -11
  472. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts +0 -6
  473. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts.map +0 -1
  474. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js +0 -9
  475. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js.map +0 -1
  476. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.tsx +0 -11
  477. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts +0 -2
  478. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts.map +0 -1
  479. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js +0 -8
  480. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js.map +0 -1
  481. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.tsx +0 -5
  482. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts +0 -2
  483. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts.map +0 -1
  484. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js +0 -492
  485. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js.map +0 -1
  486. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.tsx +0 -757
  487. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts +0 -2
  488. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts.map +0 -1
  489. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js +0 -342
  490. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js.map +0 -1
  491. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.tsx +0 -430
  492. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts +0 -2
  493. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts.map +0 -1
  494. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js +0 -338
  495. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js.map +0 -1
  496. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.tsx +0 -428
  497. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts +0 -2
  498. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts.map +0 -1
  499. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js +0 -660
  500. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js.map +0 -1
  501. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.tsx +0 -992
  502. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts +0 -2
  503. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts.map +0 -1
  504. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js +0 -515
  505. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js.map +0 -1
  506. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.tsx +0 -707
  507. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts +0 -2
  508. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts.map +0 -1
  509. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js +0 -1141
  510. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js.map +0 -1
  511. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.tsx +0 -1705
  512. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts +0 -2
  513. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts.map +0 -1
  514. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js +0 -8
  515. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js.map +0 -1
  516. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.tsx +0 -5
  517. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts +0 -2
  518. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts.map +0 -1
  519. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js +0 -436
  520. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js.map +0 -1
  521. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.tsx +0 -675
  522. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts +0 -2
  523. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts.map +0 -1
  524. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js +0 -563
  525. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js.map +0 -1
  526. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.tsx +0 -846
  527. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts +0 -6
  528. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts.map +0 -1
  529. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js +0 -9
  530. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js.map +0 -1
  531. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.tsx +0 -11
  532. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts +0 -6
  533. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts.map +0 -1
  534. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js +0 -9
  535. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js.map +0 -1
  536. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.tsx +0 -11
  537. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts +0 -2
  538. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts.map +0 -1
  539. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js +0 -8
  540. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js.map +0 -1
  541. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.tsx +0 -5
  542. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts +0 -2
  543. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts.map +0 -1
  544. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js +0 -492
  545. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js.map +0 -1
  546. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.tsx +0 -757
  547. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts +0 -2
  548. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts.map +0 -1
  549. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js +0 -342
  550. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js.map +0 -1
  551. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.tsx +0 -430
  552. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts +0 -2
  553. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts.map +0 -1
  554. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js +0 -338
  555. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js.map +0 -1
  556. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.tsx +0 -428
  557. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts +0 -2
  558. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts.map +0 -1
  559. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js +0 -660
  560. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js.map +0 -1
  561. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.tsx +0 -992
  562. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts +0 -2
  563. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts.map +0 -1
  564. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js +0 -515
  565. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js.map +0 -1
  566. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.tsx +0 -707
  567. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts +0 -2
  568. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts.map +0 -1
  569. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js +0 -1141
  570. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js.map +0 -1
  571. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.tsx +0 -1705
@@ -1,1277 +0,0 @@
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
- }