@hed-hog/operations 0.0.328 → 0.0.330

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 (596) hide show
  1. package/dist/controllers/operations-tasks.controller.d.ts +5 -5
  2. package/dist/operations.service.d.ts +5 -5
  3. package/dist/operations.service.d.ts.map +1 -1
  4. package/dist/operations.service.js +24 -4
  5. package/dist/operations.service.js.map +1 -1
  6. package/dist/operations.service.spec.js +1 -1
  7. package/dist/operations.service.spec.js.map +1 -1
  8. package/hedhog/data/dashboard_component_role.yaml +8 -8
  9. package/hedhog/data/dashboard_role.yaml +1 -1
  10. package/hedhog/data/menu.yaml +6 -16
  11. package/hedhog/data/role.yaml +1 -1
  12. package/hedhog/data/route.yaml +55 -55
  13. package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +15 -9
  14. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +7 -7
  15. package/hedhog/frontend/app/_components/department-picker.tsx.ejs +125 -0
  16. package/hedhog/frontend/app/_components/department-select-with-create.tsx.ejs +64 -325
  17. package/hedhog/frontend/app/_components/project-costs-section.tsx.ejs +51 -81
  18. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +39 -11
  19. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +37 -20
  20. package/hedhog/frontend/app/_components/system-user-picker.tsx.ejs +198 -0
  21. package/hedhog/frontend/app/_components/system-user-select-with-create.tsx.ejs +107 -569
  22. package/hedhog/frontend/app/_components/task-file-attachments.tsx.ejs +10 -8
  23. package/hedhog/frontend/app/_lib/hooks/use-values-visibility.ts.ejs +61 -0
  24. package/hedhog/frontend/app/approvals/page.tsx.ejs +5 -1
  25. package/hedhog/frontend/app/collaborators/page.tsx.ejs +68 -34
  26. package/hedhog/frontend/app/my-projects/page.tsx.ejs +45 -6
  27. package/hedhog/frontend/app/my-tasks/page.tsx.ejs +1 -1
  28. package/hedhog/frontend/app/projects/page.tsx.ejs +60 -5
  29. package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +65 -52
  30. package/hedhog/frontend/app/reports/projects/page.tsx.ejs +80 -82
  31. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +7 -1
  32. package/hedhog/frontend/messages/en.json +284 -8
  33. package/hedhog/frontend/messages/operations/en.json +67 -3
  34. package/hedhog/frontend/messages/operations/pt.json +67 -3
  35. package/hedhog/frontend/messages/pt.json +282 -6
  36. package/package.json +5 -5
  37. package/src/operations.service.spec.ts +1 -1
  38. package/src/operations.service.ts +25 -5
  39. package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +0 -476
  40. package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +0 -261
  41. package/hedhog/frontend/app/_components/contract-content-editor.tsx.ejs +0 -258
  42. package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +0 -1
  43. package/hedhog/frontend/messages/en.json.ejs +0 -2060
  44. package/hedhog/frontend/messages/operations/operations/en.json +0 -2102
  45. package/hedhog/frontend/messages/operations/operations/pt.json +0 -2111
  46. package/hedhog/frontend/messages/pt.json.ejs +0 -2067
  47. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts +0 -29
  48. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts.map +0 -1
  49. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js +0 -95
  50. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js.map +0 -1
  51. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.tsx +0 -233
  52. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts +0 -10
  53. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts.map +0 -1
  54. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js +0 -577
  55. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js.map +0 -1
  56. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.tsx +0 -868
  57. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts +0 -4
  58. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts.map +0 -1
  59. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js +0 -337
  60. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js.map +0 -1
  61. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.tsx +0 -476
  62. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts +0 -9
  63. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts.map +0 -1
  64. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js +0 -1348
  65. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js.map +0 -1
  66. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.tsx +0 -2233
  67. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts +0 -12
  68. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts.map +0 -1
  69. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js +0 -162
  70. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js.map +0 -1
  71. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.tsx +0 -261
  72. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts +0 -18
  73. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts.map +0 -1
  74. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js +0 -145
  75. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js.map +0 -1
  76. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.tsx +0 -258
  77. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts +0 -4
  78. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts.map +0 -1
  79. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js +0 -223
  80. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js.map +0 -1
  81. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.tsx +0 -342
  82. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts +0 -58
  83. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts.map +0 -1
  84. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js +0 -438
  85. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js.map +0 -1
  86. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.tsx +0 -698
  87. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts +0 -20
  88. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts.map +0 -1
  89. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js +0 -233
  90. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js.map +0 -1
  91. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.tsx +0 -392
  92. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts +0 -4
  93. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts.map +0 -1
  94. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js +0 -814
  95. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js.map +0 -1
  96. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.tsx +0 -1288
  97. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts +0 -21
  98. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts.map +0 -1
  99. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js +0 -174
  100. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js.map +0 -1
  101. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.tsx +0 -306
  102. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts +0 -10
  103. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts.map +0 -1
  104. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js +0 -12
  105. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js.map +0 -1
  106. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.tsx +0 -29
  107. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts +0 -15
  108. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts.map +0 -1
  109. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js +0 -501
  110. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js.map +0 -1
  111. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.tsx +0 -853
  112. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts +0 -6
  113. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts.map +0 -1
  114. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js +0 -847
  115. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js.map +0 -1
  116. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.tsx +0 -1340
  117. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts +0 -4
  118. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts.map +0 -1
  119. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js +0 -2930
  120. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js.map +0 -1
  121. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.tsx +0 -4378
  122. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts +0 -9
  123. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts.map +0 -1
  124. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js +0 -1013
  125. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js.map +0 -1
  126. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.tsx +0 -1745
  127. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts +0 -13
  128. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts.map +0 -1
  129. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js +0 -38
  130. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js.map +0 -1
  131. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.tsx +0 -74
  132. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts +0 -7
  133. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts.map +0 -1
  134. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js +0 -11
  135. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js.map +0 -1
  136. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.tsx +0 -15
  137. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts +0 -18
  138. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts.map +0 -1
  139. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js +0 -406
  140. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js.map +0 -1
  141. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.tsx +0 -660
  142. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts +0 -26
  143. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts.map +0 -1
  144. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js +0 -332
  145. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js.map +0 -1
  146. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.tsx +0 -518
  147. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts +0 -6
  148. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts.map +0 -1
  149. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js +0 -255
  150. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js.map +0 -1
  151. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.tsx +0 -388
  152. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts +0 -10
  153. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts.map +0 -1
  154. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js +0 -131
  155. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js.map +0 -1
  156. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.tsx +0 -214
  157. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts +0 -108
  158. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts.map +0 -1
  159. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js +0 -162
  160. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js.map +0 -1
  161. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.ts +0 -428
  162. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts +0 -8
  163. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts.map +0 -1
  164. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js +0 -36
  165. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js.map +0 -1
  166. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.ts +0 -44
  167. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts +0 -837
  168. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts.map +0 -1
  169. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js +0 -3
  170. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js.map +0 -1
  171. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.ts +0 -861
  172. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts +0 -16
  173. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts.map +0 -1
  174. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js +0 -182
  175. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js.map +0 -1
  176. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.ts +0 -250
  177. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts +0 -4
  178. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts.map +0 -1
  179. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js +0 -51
  180. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js.map +0 -1
  181. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.ts +0 -61
  182. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts +0 -2
  183. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts.map +0 -1
  184. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js +0 -954
  185. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js.map +0 -1
  186. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.tsx +0 -1277
  187. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts +0 -2
  188. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts.map +0 -1
  189. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js +0 -488
  190. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js.map +0 -1
  191. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.tsx +0 -805
  192. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts +0 -6
  193. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts.map +0 -1
  194. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js +0 -9
  195. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js.map +0 -1
  196. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.tsx +0 -11
  197. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts +0 -6
  198. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts.map +0 -1
  199. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js +0 -9
  200. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js.map +0 -1
  201. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.tsx +0 -11
  202. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts +0 -2
  203. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts.map +0 -1
  204. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js +0 -8
  205. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js.map +0 -1
  206. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.tsx +0 -5
  207. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts +0 -2
  208. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts.map +0 -1
  209. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js +0 -612
  210. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js.map +0 -1
  211. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.tsx +0 -939
  212. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts +0 -6
  213. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts.map +0 -1
  214. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js +0 -9
  215. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js.map +0 -1
  216. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.tsx +0 -11
  217. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts +0 -6
  218. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts.map +0 -1
  219. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js +0 -9
  220. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js.map +0 -1
  221. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.tsx +0 -11
  222. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts +0 -6
  223. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts.map +0 -1
  224. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js +0 -9
  225. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js.map +0 -1
  226. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.tsx +0 -17
  227. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts +0 -2
  228. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts.map +0 -1
  229. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js +0 -348
  230. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js.map +0 -1
  231. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.tsx +0 -536
  232. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts +0 -2
  233. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts.map +0 -1
  234. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js +0 -401
  235. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js.map +0 -1
  236. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.tsx +0 -607
  237. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts +0 -5
  238. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts.map +0 -1
  239. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js +0 -7
  240. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js.map +0 -1
  241. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.tsx +0 -9
  242. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts +0 -6
  243. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts.map +0 -1
  244. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js +0 -9
  245. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js.map +0 -1
  246. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.tsx +0 -11
  247. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts +0 -2
  248. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts.map +0 -1
  249. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js +0 -321
  250. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js.map +0 -1
  251. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.tsx +0 -440
  252. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts +0 -2
  253. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts.map +0 -1
  254. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js +0 -939
  255. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js.map +0 -1
  256. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.tsx +0 -1499
  257. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts +0 -29
  258. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts.map +0 -1
  259. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js +0 -95
  260. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js.map +0 -1
  261. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.tsx +0 -233
  262. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts +0 -10
  263. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts.map +0 -1
  264. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js +0 -577
  265. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js.map +0 -1
  266. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.tsx +0 -868
  267. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts +0 -4
  268. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts.map +0 -1
  269. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js +0 -337
  270. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js.map +0 -1
  271. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.tsx +0 -476
  272. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts +0 -9
  273. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts.map +0 -1
  274. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js +0 -1348
  275. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js.map +0 -1
  276. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.tsx +0 -2233
  277. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts +0 -12
  278. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts.map +0 -1
  279. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js +0 -162
  280. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js.map +0 -1
  281. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.tsx +0 -261
  282. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts +0 -18
  283. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts.map +0 -1
  284. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js +0 -145
  285. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js.map +0 -1
  286. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.tsx +0 -258
  287. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts +0 -4
  288. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts.map +0 -1
  289. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js +0 -223
  290. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js.map +0 -1
  291. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.tsx +0 -342
  292. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts +0 -58
  293. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts.map +0 -1
  294. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js +0 -438
  295. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js.map +0 -1
  296. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.tsx +0 -698
  297. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts +0 -20
  298. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts.map +0 -1
  299. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js +0 -233
  300. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js.map +0 -1
  301. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.tsx +0 -392
  302. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts +0 -4
  303. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts.map +0 -1
  304. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js +0 -814
  305. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js.map +0 -1
  306. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.tsx +0 -1288
  307. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts +0 -21
  308. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts.map +0 -1
  309. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js +0 -174
  310. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js.map +0 -1
  311. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.tsx +0 -306
  312. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts +0 -10
  313. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts.map +0 -1
  314. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js +0 -12
  315. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js.map +0 -1
  316. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.tsx +0 -29
  317. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts +0 -15
  318. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts.map +0 -1
  319. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js +0 -501
  320. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js.map +0 -1
  321. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.tsx +0 -853
  322. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts +0 -6
  323. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts.map +0 -1
  324. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js +0 -459
  325. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js.map +0 -1
  326. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.tsx +0 -598
  327. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts +0 -6
  328. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts.map +0 -1
  329. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js +0 -876
  330. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js.map +0 -1
  331. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.tsx +0 -1368
  332. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts +0 -4
  333. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts.map +0 -1
  334. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js +0 -2930
  335. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js.map +0 -1
  336. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.tsx +0 -4378
  337. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts +0 -9
  338. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts.map +0 -1
  339. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js +0 -1013
  340. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js.map +0 -1
  341. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.tsx +0 -1745
  342. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts +0 -13
  343. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts.map +0 -1
  344. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js +0 -38
  345. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js.map +0 -1
  346. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.tsx +0 -74
  347. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts +0 -7
  348. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts.map +0 -1
  349. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js +0 -11
  350. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js.map +0 -1
  351. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.tsx +0 -15
  352. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts +0 -18
  353. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts.map +0 -1
  354. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js +0 -406
  355. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js.map +0 -1
  356. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.tsx +0 -660
  357. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts +0 -26
  358. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts.map +0 -1
  359. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js +0 -332
  360. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js.map +0 -1
  361. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.tsx +0 -518
  362. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts +0 -6
  363. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts.map +0 -1
  364. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js +0 -255
  365. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js.map +0 -1
  366. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.tsx +0 -388
  367. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts +0 -10
  368. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts.map +0 -1
  369. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js +0 -131
  370. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js.map +0 -1
  371. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.tsx +0 -214
  372. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts +0 -108
  373. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts.map +0 -1
  374. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js +0 -162
  375. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js.map +0 -1
  376. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.ts +0 -428
  377. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts +0 -8
  378. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts.map +0 -1
  379. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js +0 -36
  380. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js.map +0 -1
  381. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.ts +0 -44
  382. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts +0 -837
  383. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts.map +0 -1
  384. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js +0 -3
  385. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js.map +0 -1
  386. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.ts +0 -861
  387. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts +0 -16
  388. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts.map +0 -1
  389. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js +0 -182
  390. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js.map +0 -1
  391. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.ts +0 -250
  392. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts +0 -4
  393. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts.map +0 -1
  394. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js +0 -51
  395. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js.map +0 -1
  396. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.ts +0 -61
  397. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts +0 -2
  398. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts.map +0 -1
  399. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js +0 -954
  400. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js.map +0 -1
  401. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.tsx +0 -1277
  402. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts +0 -2
  403. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts.map +0 -1
  404. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js +0 -488
  405. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js.map +0 -1
  406. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.tsx +0 -805
  407. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts +0 -6
  408. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts.map +0 -1
  409. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js +0 -9
  410. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js.map +0 -1
  411. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.tsx +0 -11
  412. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts +0 -6
  413. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts.map +0 -1
  414. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js +0 -9
  415. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js.map +0 -1
  416. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.tsx +0 -11
  417. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts +0 -2
  418. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts.map +0 -1
  419. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js +0 -8
  420. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js.map +0 -1
  421. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.tsx +0 -5
  422. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts +0 -2
  423. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts.map +0 -1
  424. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js +0 -612
  425. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js.map +0 -1
  426. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.tsx +0 -939
  427. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts +0 -6
  428. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts.map +0 -1
  429. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js +0 -9
  430. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js.map +0 -1
  431. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.tsx +0 -11
  432. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts +0 -6
  433. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts.map +0 -1
  434. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js +0 -9
  435. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js.map +0 -1
  436. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.tsx +0 -11
  437. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts +0 -6
  438. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts.map +0 -1
  439. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js +0 -9
  440. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js.map +0 -1
  441. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.tsx +0 -17
  442. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts +0 -2
  443. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts.map +0 -1
  444. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js +0 -348
  445. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js.map +0 -1
  446. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.tsx +0 -536
  447. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts +0 -2
  448. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts.map +0 -1
  449. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js +0 -401
  450. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js.map +0 -1
  451. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.tsx +0 -607
  452. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts +0 -5
  453. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts.map +0 -1
  454. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js +0 -7
  455. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js.map +0 -1
  456. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.tsx +0 -9
  457. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts +0 -6
  458. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts.map +0 -1
  459. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js +0 -9
  460. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js.map +0 -1
  461. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.tsx +0 -11
  462. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts +0 -2
  463. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts.map +0 -1
  464. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js +0 -321
  465. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js.map +0 -1
  466. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.tsx +0 -440
  467. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts +0 -2
  468. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts.map +0 -1
  469. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js +0 -939
  470. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js.map +0 -1
  471. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.tsx +0 -1499
  472. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts +0 -2
  473. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts.map +0 -1
  474. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js +0 -8
  475. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js.map +0 -1
  476. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.tsx +0 -5
  477. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts +0 -2
  478. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts.map +0 -1
  479. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js +0 -436
  480. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js.map +0 -1
  481. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.tsx +0 -675
  482. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts +0 -2
  483. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts.map +0 -1
  484. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js +0 -563
  485. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js.map +0 -1
  486. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.tsx +0 -846
  487. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts +0 -6
  488. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts.map +0 -1
  489. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js +0 -9
  490. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js.map +0 -1
  491. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.tsx +0 -10
  492. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts +0 -6
  493. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts.map +0 -1
  494. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js +0 -9
  495. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js.map +0 -1
  496. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.tsx +0 -11
  497. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts +0 -6
  498. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts.map +0 -1
  499. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js +0 -9
  500. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js.map +0 -1
  501. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.tsx +0 -11
  502. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts +0 -2
  503. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts.map +0 -1
  504. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js +0 -8
  505. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js.map +0 -1
  506. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.tsx +0 -5
  507. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts +0 -2
  508. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts.map +0 -1
  509. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js +0 -492
  510. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js.map +0 -1
  511. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.tsx +0 -757
  512. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts +0 -2
  513. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts.map +0 -1
  514. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js +0 -342
  515. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js.map +0 -1
  516. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.tsx +0 -430
  517. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts +0 -2
  518. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts.map +0 -1
  519. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js +0 -338
  520. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js.map +0 -1
  521. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.tsx +0 -428
  522. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts +0 -2
  523. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts.map +0 -1
  524. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js +0 -660
  525. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js.map +0 -1
  526. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.tsx +0 -992
  527. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts +0 -2
  528. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts.map +0 -1
  529. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js +0 -515
  530. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js.map +0 -1
  531. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.tsx +0 -707
  532. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts +0 -2
  533. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts.map +0 -1
  534. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js +0 -1141
  535. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js.map +0 -1
  536. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.tsx +0 -1705
  537. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts +0 -2
  538. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts.map +0 -1
  539. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js +0 -8
  540. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js.map +0 -1
  541. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.tsx +0 -5
  542. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts +0 -2
  543. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts.map +0 -1
  544. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js +0 -436
  545. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js.map +0 -1
  546. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.tsx +0 -675
  547. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts +0 -2
  548. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts.map +0 -1
  549. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js +0 -563
  550. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js.map +0 -1
  551. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.tsx +0 -846
  552. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts +0 -6
  553. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts.map +0 -1
  554. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js +0 -9
  555. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js.map +0 -1
  556. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.tsx +0 -11
  557. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts +0 -6
  558. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts.map +0 -1
  559. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js +0 -9
  560. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js.map +0 -1
  561. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.tsx +0 -11
  562. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts +0 -2
  563. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts.map +0 -1
  564. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js +0 -8
  565. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js.map +0 -1
  566. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.tsx +0 -5
  567. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts +0 -2
  568. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts.map +0 -1
  569. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js +0 -492
  570. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js.map +0 -1
  571. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.tsx +0 -757
  572. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts +0 -2
  573. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts.map +0 -1
  574. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js +0 -342
  575. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js.map +0 -1
  576. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.tsx +0 -430
  577. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts +0 -2
  578. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts.map +0 -1
  579. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js +0 -338
  580. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js.map +0 -1
  581. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.tsx +0 -428
  582. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts +0 -2
  583. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts.map +0 -1
  584. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js +0 -660
  585. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js.map +0 -1
  586. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.tsx +0 -992
  587. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts +0 -2
  588. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts.map +0 -1
  589. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js +0 -515
  590. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js.map +0 -1
  591. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.tsx +0 -707
  592. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts +0 -2
  593. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts.map +0 -1
  594. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js +0 -1141
  595. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js.map +0 -1
  596. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.tsx +0 -1705
@@ -1,1499 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- EmptyState,
5
- Page,
6
- PaginationFooter,
7
- SearchBar,
8
- } from '@/components/entity-list';
9
- import { RichTextEditor } from '@/components/rich-text-editor';
10
- import { Button } from '@/components/ui/button';
11
- import { Card, CardContent } from '@/components/ui/card';
12
- import {
13
- Dialog,
14
- DialogContent,
15
- DialogFooter,
16
- DialogHeader,
17
- DialogTitle,
18
- } from '@/components/ui/dialog';
19
- import { Input } from '@/components/ui/input';
20
- import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
21
- import { Label } from '@/components/ui/label';
22
- import {
23
- Select,
24
- SelectContent,
25
- SelectItem,
26
- SelectTrigger,
27
- SelectValue,
28
- } from '@/components/ui/select';
29
- import {
30
- Table,
31
- TableBody,
32
- TableCell,
33
- TableHead,
34
- TableHeader,
35
- TableRow,
36
- } from '@/components/ui/table';
37
- import { Progress } from '@/components/ui/progress';
38
- import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
39
- import {
40
- closestCenter,
41
- DndContext,
42
- PointerSensor,
43
- useDraggable,
44
- useDroppable,
45
- useSensor,
46
- useSensors,
47
- type DragEndEvent,
48
- type UniqueIdentifier,
49
- } from '@dnd-kit/core';
50
- import { CSS } from '@dnd-kit/utilities';
51
- import { useApp, useQuery } from '@hed-hog/next-app-provider';
52
- import { AnimatePresence, motion } from 'framer-motion';
53
- import {
54
- AlarmClock,
55
- Archive,
56
- ArchiveRestore,
57
- CheckCircle2,
58
- ClipboardList,
59
- Eye,
60
- KanbanSquare,
61
- LayoutGrid,
62
- List,
63
- Loader2,
64
- MessageSquare,
65
- Paperclip,
66
- Pencil,
67
- PlayCircle,
68
- Plus,
69
- Rows3,
70
- Timer,
71
- Trash2,
72
- } from 'lucide-react';
73
- import { useTranslations } from 'next-intl';
74
- import Link from 'next/link';
75
- import { useCallback, useMemo, useState } from 'react';
76
- import { OperationsHeader } from '../_components/operations-header';
77
- import { StatusBadge } from '../_components/status-badge';
78
- import {
79
- TaskDetailSheet,
80
- type TaskDetailSheetData,
81
- } from '../_components/task-detail-sheet';
82
- import { fetchOperations, mutateOperations } from '../_lib/api';
83
- import type {
84
- OperationsProjectOption,
85
- OperationsTaskOption,
86
- PaginatedResponse,
87
- } from '../_lib/types';
88
- import {
89
- formatDate,
90
- getStatusBadgeClass,
91
- } from '../_lib/utils/format';
92
-
93
- type TaskViewMode = 'table' | 'cards' | 'board';
94
-
95
- type BoardColumnId = 'todo' | 'doing' | 'review' | 'done';
96
-
97
- type BoardColumns = Record<BoardColumnId, OperationsTaskOption[]>;
98
-
99
- type BoardOverride = {
100
- columns: BoardColumns;
101
- } | null;
102
-
103
- type TaskCollection = 'active' | 'archived';
104
-
105
- type TaskFormState = {
106
- projectId: string;
107
- name: string;
108
- description: string;
109
- priority: 'low' | 'medium' | 'high';
110
- status: BoardColumnId;
111
- dueDate: string;
112
- estimateHours: string;
113
- tags: string;
114
- };
115
-
116
- const KANBAN_COLUMNS: Array<{ id: BoardColumnId; label: string }> = [
117
- { id: 'todo', label: 'Backlog' },
118
- { id: 'doing', label: 'Em execução' },
119
- { id: 'review', label: 'Revisão' },
120
- { id: 'done', label: 'Concluído' },
121
- ];
122
-
123
- const EMPTY_TASK_FORM: TaskFormState = {
124
- projectId: '',
125
- name: '',
126
- description: '',
127
- priority: 'medium',
128
- status: 'todo',
129
- dueDate: '',
130
- estimateHours: '',
131
- tags: '',
132
- };
133
-
134
- function taskDragId(taskId: number) {
135
- return `task-${taskId}`;
136
- }
137
-
138
- function columnDropId(columnId: BoardColumnId) {
139
- return `col-${columnId}`;
140
- }
141
-
142
- function parseTaskId(value: UniqueIdentifier | null | undefined) {
143
- if (!value) return null;
144
- const match = String(value).match(/^task-(\d+)$/);
145
- return match ? Number(match[1]) : null;
146
- }
147
-
148
- function parseColumnId(
149
- value: UniqueIdentifier | null | undefined
150
- ): BoardColumnId | null {
151
- if (!value) return null;
152
- const match = String(value).match(/^col-(.+)$/);
153
- const id = match?.[1];
154
- return KANBAN_COLUMNS.some((c) => c.id === id) ? (id as BoardColumnId) : null;
155
- }
156
-
157
- function splitTasksByColumn(tasks: OperationsTaskOption[]): BoardColumns {
158
- return {
159
- todo: tasks.filter((t) => t.status === 'todo'),
160
- doing: tasks.filter((t) => t.status === 'doing'),
161
- review: tasks.filter((t) => t.status === 'review'),
162
- done: tasks.filter((t) => t.status === 'done'),
163
- };
164
- }
165
-
166
- function getTaskPriorityLabel(value?: string | null) {
167
- const labels: Record<string, string> = {
168
- low: 'Baixa',
169
- medium: 'Média',
170
- high: 'Alta',
171
- };
172
- return labels[value ?? ''] ?? String(value ?? '');
173
- }
174
-
175
- function getPriorityClassName(priority?: string | null) {
176
- if (priority === 'high') return 'border-rose-300 bg-rose-100 text-rose-700';
177
- if (priority === 'medium') return 'border-amber-300 bg-amber-100 text-amber-700';
178
- return 'border-emerald-300 bg-emerald-100 text-emerald-700';
179
- }
180
-
181
- function getTaskProgress(status?: string | null) {
182
- const map: Record<string, number> = {
183
- todo: 0,
184
- doing: 33,
185
- review: 66,
186
- done: 100,
187
- };
188
- return map[status ?? ''] ?? 0;
189
- }
190
-
191
- function isPastDue(dueDate?: string | null) {
192
- if (!dueDate) return false;
193
- return new Date(dueDate) < new Date();
194
- }
195
-
196
- function getInitials(value?: string | null) {
197
- const parts = String(value ?? '')
198
- .trim()
199
- .split(/\s+/)
200
- .filter(Boolean)
201
- .slice(0, 2);
202
- if (!parts.length) return '??';
203
- return parts.map((part) => part[0]?.toUpperCase() ?? '').join('');
204
- }
205
-
206
- function getPersonAvatarUrl(avatarId?: number | null) {
207
- return typeof avatarId === 'number' && avatarId > 0
208
- ? `${process.env.NEXT_PUBLIC_API_BASE_URL}/person/avatar/${avatarId}`
209
- : '/placeholder.png';
210
- }
211
-
212
- function getUserPhotoUrl(photoId?: number | null) {
213
- return typeof photoId === 'number' && photoId > 0
214
- ? `${process.env.NEXT_PUBLIC_API_BASE_URL}/file/open/${photoId}`
215
- : null;
216
- }
217
-
218
- function normalizeDateInputValue(value?: string | null) {
219
- if (!value) {
220
- return '';
221
- }
222
-
223
- const normalizedValue = String(value).trim();
224
- const directMatch = normalizedValue.match(/^\d{4}-\d{2}-\d{2}/);
225
-
226
- if (directMatch?.[0]) {
227
- return directMatch[0];
228
- }
229
-
230
- const parsedDate = new Date(normalizedValue);
231
- if (Number.isNaN(parsedDate.getTime())) {
232
- return '';
233
- }
234
-
235
- return parsedDate.toISOString().slice(0, 10);
236
- }
237
-
238
- function DraggableTaskCard({
239
- task,
240
- children,
241
- }: {
242
- task: OperationsTaskOption;
243
- children: (isDragging: boolean) => React.ReactNode;
244
- }) {
245
- const { attributes, listeners, setNodeRef, transform, isDragging } =
246
- useDraggable({
247
- id: taskDragId(task.id),
248
- });
249
- return (
250
- <div
251
- ref={setNodeRef}
252
- style={{ transform: CSS.Translate.toString(transform) }}
253
- {...listeners}
254
- {...attributes}
255
- className={isDragging ? 'z-20' : undefined}
256
- >
257
- {children(isDragging)}
258
- </div>
259
- );
260
- }
261
-
262
- function DroppableColumn({
263
- columnId,
264
- children,
265
- }: {
266
- columnId: BoardColumnId;
267
- children: (isOver: boolean) => React.ReactNode;
268
- }) {
269
- const { setNodeRef, isOver } = useDroppable({ id: columnDropId(columnId) });
270
- return <div ref={setNodeRef}>{children(isOver)}</div>;
271
- }
272
-
273
- const MY_TASKS_VIEW_STORAGE_KEY = 'operations-my-tasks-view-mode';
274
-
275
- export default function OperationsMyTasksPage() {
276
- const t = useTranslations('operations.MyTasksPage');
277
- const commonT = useTranslations('operations.Common');
278
- const detailT = useTranslations('operations.ProjectDetailsPage');
279
-
280
- const { request, currentLocaleCode, getSettingValue } = useApp();
281
- const [search, setSearch] = useState('');
282
- const [statusFilter, setStatusFilter] = useState('all');
283
- const [page, setPage] = useState(1);
284
- const [pageSize, setPageSize] = useState(20);
285
- const [taskCollection, setTaskCollection] =
286
- useState<TaskCollection>('active');
287
- const [viewMode, setViewMode] = useState<TaskViewMode>(() => {
288
- if (typeof window === 'undefined') {
289
- return 'table';
290
- }
291
- const savedViewMode = window.localStorage.getItem(
292
- MY_TASKS_VIEW_STORAGE_KEY
293
- );
294
- if (savedViewMode === 'cards' || savedViewMode === 'board')
295
- return savedViewMode;
296
- return 'table';
297
- });
298
-
299
- const [boardOverride, setBoardOverride] = useState<BoardOverride>(null);
300
- const [selectedTask, setSelectedTask] = useState<TaskDetailSheetData | null>(
301
- null
302
- );
303
- const [deletePromptTask, setDeletePromptTask] =
304
- useState<OperationsTaskOption | null>(null);
305
- const [taskFormOpen, setTaskFormOpen] = useState(false);
306
- const [editingTaskId, setEditingTaskId] = useState<number | null>(null);
307
- const [taskFormLoading, setTaskFormLoading] = useState(false);
308
- const [taskFormData, setTaskFormData] =
309
- useState<TaskFormState>(EMPTY_TASK_FORM);
310
- const [inlineCreateColumn, setInlineCreateColumn] =
311
- useState<BoardColumnId | null>(null);
312
- const [inlineCreateName, setInlineCreateName] = useState('');
313
- const [inlineCreateLoading, setInlineCreateLoading] = useState(false);
314
-
315
- // Paginated query for table/cards views
316
- const { data: tasksResponse, refetch } = useQuery<
317
- PaginatedResponse<OperationsTaskOption>
318
- >({
319
- queryKey: [
320
- 'operations-my-tasks-list',
321
- currentLocaleCode,
322
- search,
323
- statusFilter,
324
- taskCollection,
325
- page,
326
- pageSize,
327
- ],
328
- queryFn: () => {
329
- const params = new URLSearchParams({
330
- page: String(page),
331
- pageSize: String(pageSize),
332
- sortField: 'createdAt',
333
- sortOrder: 'desc',
334
- });
335
- if (search.trim()) params.set('search', search.trim());
336
- if (statusFilter !== 'all') params.set('status', statusFilter);
337
- if (taskCollection === 'archived') params.set('archived', 'true');
338
- return fetchOperations<PaginatedResponse<OperationsTaskOption>>(
339
- request,
340
- `/operations/my-tasks?${params.toString()}`
341
- );
342
- },
343
- placeholderData: (previous) => previous,
344
- });
345
-
346
- // Full-load query for board view (no pagination limit)
347
- const { data: boardTasksResponse, refetch: refetchBoard } = useQuery<
348
- PaginatedResponse<OperationsTaskOption>
349
- >({
350
- queryKey: ['operations-my-tasks-board', currentLocaleCode],
351
- queryFn: () =>
352
- fetchOperations<PaginatedResponse<OperationsTaskOption>>(
353
- request,
354
- `/operations/my-tasks?pageSize=1000&sortField=createdAt&sortOrder=desc`
355
- ),
356
- enabled: viewMode === 'board' && taskCollection === 'active',
357
- placeholderData: (previous) => previous,
358
- });
359
- const { data: projectOptionsResponse } = useQuery<
360
- PaginatedResponse<OperationsProjectOption>
361
- >({
362
- queryKey: ['operations-my-task-project-options', currentLocaleCode],
363
- queryFn: () =>
364
- fetchOperations<PaginatedResponse<OperationsProjectOption>>(
365
- request,
366
- '/operations/projects/options?pageSize=200&sortField=name&sortOrder=asc'
367
- ),
368
- placeholderData: (previous) => previous,
369
- });
370
-
371
- const tasks = tasksResponse?.data ?? [];
372
- const boardApiTasks = boardTasksResponse?.data ?? [];
373
- const projectOptions = projectOptionsResponse?.data ?? [];
374
-
375
- const boardColumns: BoardColumns = useMemo(() => {
376
- if (boardOverride) return boardOverride.columns;
377
- return splitTasksByColumn(boardApiTasks);
378
- }, [boardOverride, boardApiTasks]);
379
-
380
- const statsCards = useMemo(
381
- () => [
382
- {
383
- key: 'total',
384
- title: t('cards.total'),
385
- description: t('cards.totalDescription'),
386
- value: tasks.length,
387
- icon: ClipboardList,
388
- accentClassName: 'from-slate-500/20 via-slate-400/10 to-transparent',
389
- iconContainerClassName: 'bg-slate-100 text-slate-700',
390
- },
391
- {
392
- key: 'doing',
393
- title: t('cards.doing'),
394
- description: t('cards.doingDescription'),
395
- value: tasks.filter((item) => item.status === 'doing').length,
396
- icon: PlayCircle,
397
- accentClassName: 'from-blue-500/20 via-cyan-500/10 to-transparent',
398
- iconContainerClassName: 'bg-blue-50 text-blue-600',
399
- },
400
- {
401
- key: 'review',
402
- title: t('cards.review'),
403
- description: t('cards.reviewDescription'),
404
- value: tasks.filter((item) => item.status === 'review').length,
405
- icon: Loader2,
406
- accentClassName: 'from-amber-500/20 via-orange-500/10 to-transparent',
407
- iconContainerClassName: 'bg-amber-50 text-amber-600',
408
- },
409
- {
410
- key: 'done',
411
- title: t('cards.done'),
412
- description: t('cards.doneDescription'),
413
- value: tasks.filter((item) => item.status === 'done').length,
414
- icon: CheckCircle2,
415
- accentClassName: 'from-green-500/20 via-emerald-500/10 to-transparent',
416
- iconContainerClassName: 'bg-green-50 text-green-600',
417
- },
418
- ],
419
- [tasks, t]
420
- );
421
-
422
- const handleViewModeChange = (value: string) => {
423
- if (taskCollection === 'archived' && value === 'board') return;
424
- if (value !== 'table' && value !== 'cards' && value !== 'board') return;
425
- setViewMode(value);
426
- if (typeof window !== 'undefined') {
427
- window.localStorage.setItem(MY_TASKS_VIEW_STORAGE_KEY, value);
428
- }
429
- };
430
-
431
- const sensors = useSensors(
432
- useSensor(PointerSensor, { activationConstraint: { distance: 6 } })
433
- );
434
-
435
- const findColumnByTask = useCallback(
436
- (taskId: number) => {
437
- const match = KANBAN_COLUMNS.find((column) =>
438
- boardColumns[column.id].some((task) => task.id === taskId)
439
- );
440
- return match?.id ?? null;
441
- },
442
- [boardColumns]
443
- );
444
-
445
- const moveTaskToColumn = useCallback(
446
- (taskId: number, targetColumn: BoardColumnId) => {
447
- const originColumn = findColumnByTask(taskId);
448
- if (!originColumn || originColumn === targetColumn) return;
449
-
450
- const sourceTask = boardColumns[originColumn].find(
451
- (task) => task.id === taskId
452
- );
453
- if (!sourceTask) return;
454
-
455
- setBoardOverride({
456
- columns: {
457
- ...boardColumns,
458
- [originColumn]: boardColumns[originColumn].filter(
459
- (task) => task.id !== taskId
460
- ),
461
- [targetColumn]: [
462
- { ...sourceTask, status: targetColumn },
463
- ...boardColumns[targetColumn],
464
- ],
465
- },
466
- });
467
-
468
- mutateOperations(request, `/operations/tasks/${taskId}`, 'PATCH', {
469
- status: targetColumn,
470
- }).catch(() => {
471
- setBoardOverride(null);
472
- void refetchBoard();
473
- });
474
- },
475
- [boardColumns, findColumnByTask, request, refetchBoard]
476
- );
477
-
478
- const onBoardDragEnd = (event: DragEndEvent) => {
479
- const taskId = parseTaskId(event.active.id);
480
- const targetColumn = parseColumnId(event.over?.id);
481
- if (!taskId || !targetColumn) return;
482
- moveTaskToColumn(taskId, targetColumn);
483
- };
484
-
485
- const refetchAll = useCallback(async () => {
486
- await Promise.all([refetch(), refetchBoard()]);
487
- }, [refetch, refetchBoard]);
488
-
489
- const handleArchiveTask = useCallback(
490
- async (taskId: number) => {
491
- await mutateOperations(request, `/operations/tasks/${taskId}`, 'PATCH', {
492
- archived: true,
493
- });
494
- setSelectedTask(null);
495
- setBoardOverride(null);
496
- await refetchAll();
497
- },
498
- [request, refetchAll]
499
- );
500
-
501
- const handleRestoreTask = useCallback(
502
- async (taskId: number) => {
503
- await mutateOperations(request, `/operations/tasks/${taskId}`, 'PATCH', {
504
- archived: false,
505
- });
506
- setSelectedTask(null);
507
- setBoardOverride(null);
508
- await refetchAll();
509
- },
510
- [request, refetchAll]
511
- );
512
-
513
- const handlePermanentDeleteTask = useCallback(
514
- async (taskId: number) => {
515
- await mutateOperations(
516
- request,
517
- `/operations/tasks/${taskId}?permanent=true`,
518
- 'DELETE'
519
- );
520
- setDeletePromptTask(null);
521
- setSelectedTask(null);
522
- setBoardOverride(null);
523
- await refetchAll();
524
- },
525
- [request, refetchAll]
526
- );
527
-
528
- const handleInlineCreateTask = useCallback(
529
- async (column: BoardColumnId) => {
530
- const trimmed = inlineCreateName.trim();
531
- if (!trimmed) {
532
- setInlineCreateColumn(null);
533
- setInlineCreateName('');
534
- return;
535
- }
536
- setInlineCreateLoading(true);
537
- try {
538
- await mutateOperations(request, '/operations/tasks', 'POST', {
539
- name: trimmed,
540
- status: column,
541
- priority: 'medium',
542
- });
543
- setBoardOverride(null);
544
- setInlineCreateColumn(null);
545
- setInlineCreateName('');
546
- await refetchBoard();
547
- } finally {
548
- setInlineCreateLoading(false);
549
- }
550
- },
551
- [inlineCreateName, request, refetchBoard]
552
- );
553
-
554
- const openCreateTaskForm = useCallback(() => {
555
- setEditingTaskId(null);
556
- setTaskFormData(EMPTY_TASK_FORM);
557
- setSelectedTask(null);
558
- setTaskFormOpen(true);
559
- }, []);
560
-
561
- const openEditTaskForm = useCallback((task: OperationsTaskOption) => {
562
- setEditingTaskId(task.id);
563
- setTaskFormData({
564
- projectId: String(task.projectId),
565
- name: task.name,
566
- description: task.description ?? '',
567
- priority: (task.priority as TaskFormState['priority']) ?? 'medium',
568
- status: KANBAN_COLUMNS.some((column) => column.id === task.status)
569
- ? (task.status as BoardColumnId)
570
- : 'todo',
571
- dueDate: normalizeDateInputValue(task.dueDate),
572
- estimateHours:
573
- task.estimateHours != null ? String(task.estimateHours) : '',
574
- tags: task.tags ?? '',
575
- });
576
- setSelectedTask(null);
577
- setTaskFormOpen(true);
578
- }, []);
579
-
580
- const handleTaskFormSubmit = useCallback(async () => {
581
- const selectedProject = projectOptions.find(
582
- (project) => String(project.id) === taskFormData.projectId
583
- );
584
- const normalizedName = taskFormData.name.trim();
585
- if (!selectedProject || !normalizedName) return;
586
-
587
- setTaskFormLoading(true);
588
- try {
589
- const payload = {
590
- projectId: selectedProject.id,
591
- projectAssignmentId: selectedProject.projectAssignmentId ?? null,
592
- name: normalizedName,
593
- description: taskFormData.description.trim() || null,
594
- priority: taskFormData.priority,
595
- status: taskFormData.status,
596
- dueDate: taskFormData.dueDate || null,
597
- estimateHours: taskFormData.estimateHours
598
- ? Number(taskFormData.estimateHours)
599
- : null,
600
- tags: taskFormData.tags.trim() || null,
601
- };
602
- if (editingTaskId) {
603
- await mutateOperations(
604
- request,
605
- `/operations/tasks/${editingTaskId}`,
606
- 'PATCH',
607
- payload
608
- );
609
- } else {
610
- await mutateOperations(request, '/operations/tasks', 'POST', payload);
611
- }
612
-
613
- setTaskFormOpen(false);
614
- setEditingTaskId(null);
615
- setTaskFormData(EMPTY_TASK_FORM);
616
- setTaskCollection('active');
617
- setPage(1);
618
- setBoardOverride(null);
619
- await refetchAll();
620
- } finally {
621
- setTaskFormLoading(false);
622
- }
623
- }, [editingTaskId, projectOptions, request, refetchAll, taskFormData]);
624
-
625
- return (
626
- <Page>
627
- <OperationsHeader
628
- title={t('title')}
629
- description={t('description')}
630
- current={t('breadcrumb')}
631
- actions={
632
- <Button size="sm" className="gap-2" onClick={openCreateTaskForm}>
633
- <Plus className="size-4" />
634
- {t('actions.create')}
635
- </Button>
636
- }
637
- />
638
-
639
- <KpiCardsGrid items={statsCards} columns={4} />
640
-
641
- <div className="flex min-w-0 flex-wrap items-center gap-2">
642
- {viewMode !== 'board' ? (
643
- <SearchBar
644
- className="w-auto"
645
- searchQuery={search}
646
- onSearchChange={(value) => {
647
- setSearch(value);
648
- setPage(1);
649
- }}
650
- showSearchButton={false}
651
- debounceMs={500}
652
- placeholder={t('searchPlaceholder')}
653
- controls={[
654
- {
655
- id: 'status',
656
- type: 'select',
657
- value: statusFilter,
658
- onChange: (value) => {
659
- setStatusFilter(value);
660
- setPage(1);
661
- },
662
- placeholder: commonT('labels.status'),
663
- options: [
664
- { value: 'all', label: commonT('filters.allStatuses') },
665
- { value: 'todo', label: t('status.todo') },
666
- { value: 'doing', label: t('status.doing') },
667
- { value: 'review', label: t('status.review') },
668
- { value: 'done', label: t('status.done') },
669
- ],
670
- },
671
- ]}
672
- />
673
- ) : null}
674
-
675
- <Button
676
- variant={taskCollection === 'active' ? 'default' : 'outline'}
677
- size="sm"
678
- onClick={() => {
679
- setTaskCollection('active');
680
- setPage(1);
681
- }}
682
- >
683
- {t('collections.active')}
684
- </Button>
685
- <Button
686
- variant={taskCollection === 'archived' ? 'default' : 'outline'}
687
- size="sm"
688
- onClick={() => {
689
- setTaskCollection('archived');
690
- setPage(1);
691
- if (viewMode === 'board') {
692
- handleViewModeChange('table');
693
- }
694
- }}
695
- >
696
- {t('collections.archived')}
697
- </Button>
698
-
699
- <div className="flex-1" />
700
-
701
- <ToggleGroup
702
- type="single"
703
- value={viewMode}
704
- onValueChange={handleViewModeChange}
705
- variant="outline"
706
- size="sm"
707
- aria-label={t('viewMode')}
708
- >
709
- <ToggleGroupItem
710
- value="table"
711
- className="gap-1.5 px-2.5"
712
- aria-label={t('viewModeTable')}
713
- >
714
- <List className="h-4 w-4" />
715
- <span className="hidden sm:inline">{t('viewModeTable')}</span>
716
- </ToggleGroupItem>
717
- <ToggleGroupItem
718
- value="cards"
719
- className="gap-1.5 px-2.5"
720
- aria-label={t('viewModeCards')}
721
- >
722
- <LayoutGrid className="h-4 w-4" />
723
- <span className="hidden sm:inline">{t('viewModeCards')}</span>
724
- </ToggleGroupItem>
725
- {taskCollection === 'active' ? (
726
- <ToggleGroupItem
727
- value="board"
728
- className="gap-1.5 px-2.5"
729
- aria-label={t('viewModeBoard')}
730
- >
731
- <KanbanSquare className="h-4 w-4" />
732
- <span className="hidden sm:inline">{t('viewModeBoard')}</span>
733
- </ToggleGroupItem>
734
- ) : null}
735
- </ToggleGroup>
736
- </div>
737
-
738
- {viewMode === 'board' ? (
739
- boardApiTasks.length > 0 ? (
740
- <DndContext
741
- sensors={sensors}
742
- collisionDetection={closestCenter}
743
- onDragEnd={onBoardDragEnd}
744
- >
745
- <div className="grid gap-4 xl:grid-cols-4">
746
- {KANBAN_COLUMNS.map((column) => (
747
- <DroppableColumn key={column.id} columnId={column.id}>
748
- {(isOver) => (
749
- <div
750
- className={[
751
- 'rounded-xl border bg-muted/20 p-3 transition-colors',
752
- isOver
753
- ? 'border-primary bg-primary/5'
754
- : 'border-border',
755
- ].join(' ')}
756
- >
757
- <div className="mb-3 flex items-center justify-between">
758
- <div className="flex items-center gap-2 text-sm font-semibold">
759
- <Rows3 className="size-4 text-muted-foreground" />
760
- {column.label}
761
- </div>
762
- <div className="flex items-center gap-1">
763
- <span className="rounded-full bg-background px-2 py-0.5 text-xs text-muted-foreground">
764
- {boardColumns[column.id].length}
765
- </span>
766
- <button
767
- type="button"
768
- className="flex size-5 cursor-pointer items-center justify-center rounded-full text-muted-foreground transition hover:bg-muted hover:text-foreground"
769
- onClick={() => {
770
- setInlineCreateColumn(column.id);
771
- setInlineCreateName('');
772
- }}
773
- >
774
- <Plus className="size-3.5" />
775
- </button>
776
- </div>
777
- </div>
778
-
779
- <div className="flex flex-1 flex-col gap-2">
780
- <AnimatePresence initial={false}>
781
- {boardColumns[column.id].map((task) => {
782
- const taskTags = task.tags ? task.tags.split(',').map((t) => t.trim()).filter(Boolean) : [];
783
- const comments = task.commentCount ?? 0;
784
- return (
785
- <DraggableTaskCard key={task.id} task={task}>
786
- {(isDragging) => (
787
- <motion.div
788
- initial={{ opacity: 0, scale: 0.96 }}
789
- animate={{ opacity: 1, scale: 1 }}
790
- exit={{ opacity: 0, scale: 0.95, y: -4 }}
791
- transition={{ duration: 0.18 }}
792
- role="button"
793
- tabIndex={0}
794
- onClick={() =>
795
- !isDragging && setSelectedTask(task)
796
- }
797
- onKeyDown={(event) => {
798
- if (event.key === 'Enter' || event.key === ' ') {
799
- event.preventDefault();
800
- setSelectedTask(task);
801
- }
802
- }}
803
- className={[
804
- 'group w-full cursor-pointer rounded-2xl border bg-card p-3 text-left shadow-xs transition',
805
- isDragging
806
- ? 'opacity-0'
807
- : 'hover:border-primary/40 hover:shadow-lg',
808
- ].join(' ')}
809
- >
810
- <div className="mb-3 flex items-start justify-between gap-2">
811
- <div className="min-w-0 space-y-1">
812
- <p className="line-clamp-2 text-sm font-semibold leading-snug">
813
- {task.name}
814
- </p>
815
- <p className="truncate text-[11px] text-muted-foreground">
816
- {[task.projectName, task.projectCode]
817
- .filter(Boolean)
818
- .join(' • ') ||
819
- commonT('labels.notAvailable')}
820
- </p>
821
- {task.description ? (
822
- <p className="line-clamp-2 text-xs leading-5 text-muted-foreground">
823
- {task.description.replace(/<[^>]*>/g, '')}
824
- </p>
825
- ) : null}
826
- </div>
827
- <div className="flex items-start gap-2">
828
- <span
829
- className={[
830
- 'shrink-0 rounded-full border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide',
831
- getPriorityClassName(task.priority),
832
- ].join(' ')}
833
- >
834
- {getTaskPriorityLabel(task.priority)}
835
- </span>
836
- <Button
837
- type="button"
838
- variant="ghost"
839
- size="icon"
840
- className="size-7 shrink-0 rounded-full opacity-0 transition group-hover:opacity-100"
841
- onPointerDown={(event) =>
842
- event.stopPropagation()
843
- }
844
- onClick={(event) => {
845
- event.stopPropagation();
846
- openEditTaskForm(task);
847
- }}
848
- >
849
- <Pencil className="size-3.5" />
850
- </Button>
851
- </div>
852
- </div>
853
-
854
- {taskTags.length > 0 ? (
855
- <div className="mb-3 flex flex-wrap gap-1">
856
- {taskTags.slice(0, 4).map((tag) => (
857
- <span
858
- key={`${task.id}-${tag}`}
859
- className="rounded-full border bg-muted/60 px-2 py-0.5 text-[10px] font-medium text-muted-foreground"
860
- >
861
- {tag}
862
- </span>
863
- ))}
864
- {taskTags.length > 4 ? (
865
- <span className="rounded-full border bg-muted/60 px-2 py-0.5 text-[10px] font-medium text-muted-foreground">
866
- +{taskTags.length - 4}
867
- </span>
868
- ) : null}
869
- </div>
870
- ) : null}
871
-
872
- <div className="grid grid-cols-2 gap-2 text-xs">
873
- <div
874
- className={[
875
- 'rounded-xl border bg-muted/20 px-2 py-1.5',
876
- isPastDue(task.dueDate) && task.status !== 'done'
877
- ? 'border-rose-500/30 bg-rose-500/10 text-rose-700 dark:text-rose-300'
878
- : 'text-muted-foreground',
879
- ].join(' ')}
880
- >
881
- <span className="flex items-center gap-1">
882
- <AlarmClock className="size-3.5" />
883
- {formatDate(
884
- task.dueDate,
885
- getSettingValue,
886
- currentLocaleCode
887
- )}
888
- </span>
889
- </div>
890
- <div className="rounded-xl border bg-muted/20 px-2 py-1.5 text-muted-foreground">
891
- <span className="flex items-center gap-1">
892
- <Timer className="size-3.5" />
893
- {task.estimateHours != null
894
- ? `${task.estimateHours}h`
895
- : '—'}
896
- </span>
897
- </div>
898
- </div>
899
-
900
- <div className="mt-3 space-y-1.5">
901
- <div className="flex items-center justify-between text-[11px] text-muted-foreground">
902
- <span>Progresso</span>
903
- <span>{getTaskProgress(task.status)}%</span>
904
- </div>
905
- <Progress
906
- value={getTaskProgress(task.status)}
907
- className="h-1.5"
908
- />
909
- </div>
910
-
911
- <div className="mt-3 flex items-center justify-between gap-3 border-t pt-3">
912
- <div className="flex min-w-0 items-center gap-2">
913
- <div className="flex size-7 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-[10px] font-semibold uppercase text-muted-foreground ring-1 ring-border">
914
- {(() => {
915
- const photoUrl = getUserPhotoUrl(
916
- task.assigneeUserPhotoId
917
- );
918
- const avatarUrl =
919
- task.assigneePersonAvatarId
920
- ? getPersonAvatarUrl(
921
- task.assigneePersonAvatarId
922
- )
923
- : null;
924
- const imgSrc = photoUrl ?? avatarUrl;
925
- return imgSrc ? (
926
- // eslint-disable-next-line @next/next/no-img-element
927
- <img
928
- src={imgSrc}
929
- alt={task.assigneeName ?? ''}
930
- className="size-full object-cover"
931
- />
932
- ) : (
933
- getInitials(task.assigneeName)
934
- );
935
- })()}
936
- </div>
937
- <span className="truncate text-[11px] text-muted-foreground">
938
- {task.assigneeName ?? '—'}
939
- </span>
940
- </div>
941
- <div className="flex shrink-0 items-center gap-2 text-[11px] text-muted-foreground">
942
- <span className="inline-flex items-center gap-1">
943
- <MessageSquare className="size-3.5" />
944
- {comments}
945
- </span>
946
- <span className="inline-flex items-center gap-1">
947
- <Paperclip className="size-3.5" />
948
- 0
949
- </span>
950
- </div>
951
- </div>
952
- </motion.div>
953
- )}
954
- </DraggableTaskCard>
955
- );
956
- })}
957
- </AnimatePresence>
958
- </div>
959
-
960
- {inlineCreateColumn === column.id ? (
961
- <div className="space-y-1.5 rounded-lg border bg-card p-2">
962
- <Input
963
- autoFocus
964
- placeholder={detailT('taskForm.namePlaceholder')}
965
- value={inlineCreateName}
966
- onChange={(e) =>
967
- setInlineCreateName(e.target.value)
968
- }
969
- onKeyDown={(e) => {
970
- if (e.key === 'Enter') {
971
- e.preventDefault();
972
- void handleInlineCreateTask(column.id);
973
- } else if (e.key === 'Escape') {
974
- setInlineCreateColumn(null);
975
- setInlineCreateName('');
976
- }
977
- }}
978
- onBlur={() => {
979
- if (!inlineCreateName.trim()) {
980
- setInlineCreateColumn(null);
981
- setInlineCreateName('');
982
- }
983
- }}
984
- disabled={inlineCreateLoading}
985
- className="h-8 text-sm"
986
- />
987
- <div className="flex gap-1">
988
- <Button
989
- type="button"
990
- size="sm"
991
- className="h-7 px-2 text-xs"
992
- disabled={
993
- !inlineCreateName.trim() || inlineCreateLoading
994
- }
995
- onMouseDown={(e) => e.preventDefault()}
996
- onClick={() =>
997
- void handleInlineCreateTask(column.id)
998
- }
999
- >
1000
- {t('actions.create')}
1001
- </Button>
1002
- <Button
1003
- type="button"
1004
- variant="ghost"
1005
- size="sm"
1006
- className="h-7 px-2 text-xs"
1007
- onMouseDown={(e) => e.preventDefault()}
1008
- onClick={() => {
1009
- setInlineCreateColumn(null);
1010
- setInlineCreateName('');
1011
- }}
1012
- >
1013
- {commonT('actions.cancel')}
1014
- </Button>
1015
- </div>
1016
- </div>
1017
- ) : (
1018
- <button
1019
- type="button"
1020
- className="flex w-full cursor-pointer items-center gap-1 rounded-md px-1 py-1 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground"
1021
- onClick={() => {
1022
- setInlineCreateColumn(column.id);
1023
- setInlineCreateName('');
1024
- }}
1025
- >
1026
- <Plus className="size-3" />
1027
- {t('actions.create')}
1028
- </button>
1029
- )}
1030
- </div>
1031
- )}
1032
- </DroppableColumn>
1033
- ))}
1034
- </div>
1035
- </DndContext>
1036
- ) : (
1037
- <EmptyState
1038
- icon={<ClipboardList className="size-12" />}
1039
- title={commonT('states.emptyTitle')}
1040
- description={t('emptyDescription')}
1041
- actionLabel={commonT('actions.refresh')}
1042
- onAction={() => void refetchBoard()}
1043
- />
1044
- )
1045
- ) : tasks.length > 0 ? (
1046
- viewMode === 'cards' ? (
1047
- <div className="grid gap-4 md:grid-cols-2 2xl:grid-cols-3">
1048
- {tasks.map((task) => (
1049
- <Card
1050
- key={task.id}
1051
- className="cursor-pointer overflow-hidden border-border/60 py-0 shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md"
1052
- onClick={() => setSelectedTask(task)}
1053
- >
1054
- <CardContent className="space-y-4 p-4">
1055
- <div className="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
1056
- <div className="min-w-0">
1057
- <div className="truncate font-semibold">{task.name}</div>
1058
- <div className="truncate text-xs text-muted-foreground">
1059
- {[task.projectName, task.projectCode]
1060
- .filter(Boolean)
1061
- .join(' • ') || commonT('labels.notAvailable')}
1062
- </div>
1063
- </div>
1064
- <StatusBadge
1065
- label={t(`status.${task.status}`)}
1066
- className={getStatusBadgeClass(task.status)}
1067
- />
1068
- </div>
1069
-
1070
- {task.description ? (
1071
- <p className="line-clamp-3 text-sm text-muted-foreground">
1072
- {task.description}
1073
- </p>
1074
- ) : null}
1075
-
1076
- <div className="flex justify-end border-t border-border/60 pt-3">
1077
- {task.projectId ? (
1078
- <Button
1079
- variant="outline"
1080
- size="icon"
1081
- asChild
1082
- onClick={(event) => event.stopPropagation()}
1083
- >
1084
- <Link
1085
- href={`/operations/my-projects/${task.projectId}`}
1086
- >
1087
- <Eye className="size-4" />
1088
- </Link>
1089
- </Button>
1090
- ) : null}
1091
- </div>
1092
- </CardContent>
1093
- </Card>
1094
- ))}
1095
- </div>
1096
- ) : (
1097
- <div className="overflow-x-auto rounded-md border">
1098
- <Table>
1099
- <TableHeader>
1100
- <TableRow>
1101
- <TableHead>{commonT('labels.task')}</TableHead>
1102
- <TableHead>{commonT('labels.project')}</TableHead>
1103
- <TableHead>{commonT('labels.status')}</TableHead>
1104
- <TableHead className="w-20 text-right">
1105
- {commonT('labels.actions')}
1106
- </TableHead>
1107
- </TableRow>
1108
- </TableHeader>
1109
- <TableBody>
1110
- {tasks.map((task) => (
1111
- <TableRow
1112
- key={task.id}
1113
- className="cursor-pointer hover:bg-muted/30"
1114
- onClick={() => setSelectedTask(task)}
1115
- >
1116
- <TableCell>
1117
- <div className="min-w-0">
1118
- <div className="truncate font-medium">{task.name}</div>
1119
- {task.description ? (
1120
- <div className="truncate text-xs text-muted-foreground">
1121
- {task.description}
1122
- </div>
1123
- ) : null}
1124
- </div>
1125
- </TableCell>
1126
- <TableCell>
1127
- <div className="truncate text-sm">
1128
- {[task.projectName, task.projectCode]
1129
- .filter(Boolean)
1130
- .join(' • ') || commonT('labels.notAvailable')}
1131
- </div>
1132
- </TableCell>
1133
- <TableCell>
1134
- <StatusBadge
1135
- label={t(`status.${task.status}`)}
1136
- className={getStatusBadgeClass(task.status)}
1137
- />
1138
- </TableCell>
1139
- <TableCell>
1140
- <div className="flex justify-end">
1141
- {task.projectId ? (
1142
- <Button
1143
- variant="outline"
1144
- size="icon"
1145
- asChild
1146
- onClick={(event) => event.stopPropagation()}
1147
- >
1148
- <Link
1149
- href={`/operations/my-projects/${task.projectId}`}
1150
- >
1151
- <Eye className="size-4" />
1152
- </Link>
1153
- </Button>
1154
- ) : null}
1155
- </div>
1156
- </TableCell>
1157
- </TableRow>
1158
- ))}
1159
- </TableBody>
1160
- </Table>
1161
- </div>
1162
- )
1163
- ) : (
1164
- <EmptyState
1165
- icon={<ClipboardList className="size-12" />}
1166
- title={commonT('states.emptyTitle')}
1167
- description={t('emptyDescription')}
1168
- actionLabel={commonT('actions.refresh')}
1169
- onAction={() => void refetch()}
1170
- />
1171
- )}
1172
-
1173
- {viewMode !== 'board' ? (
1174
- <PaginationFooter
1175
- currentPage={tasksResponse?.page ?? page}
1176
- pageSize={tasksResponse?.pageSize ?? pageSize}
1177
- totalItems={tasksResponse?.total ?? 0}
1178
- onPageChange={setPage}
1179
- onPageSizeChange={(value) => {
1180
- setPageSize(value);
1181
- setPage(1);
1182
- }}
1183
- pageSizeOptions={[10, 20, 50]}
1184
- />
1185
- ) : null}
1186
-
1187
- <TaskDetailSheet
1188
- task={selectedTask}
1189
- open={selectedTask !== null}
1190
- onOpenChange={(open) => {
1191
- if (!open) setSelectedTask(null);
1192
- }}
1193
- statusLabel={(status) => {
1194
- try {
1195
- return t(`status.${status}`);
1196
- } catch {
1197
- return status;
1198
- }
1199
- }}
1200
- footer={
1201
- selectedTask ? (
1202
- <div className="grid grid-cols-2 gap-3">
1203
- {taskCollection === 'archived' ? (
1204
- <>
1205
- <Button
1206
- variant="outline"
1207
- className="gap-2"
1208
- onClick={() => void handleRestoreTask(selectedTask.id)}
1209
- >
1210
- <ArchiveRestore className="size-4" />
1211
- {commonT('actions.unarchive')}
1212
- </Button>
1213
- <Button
1214
- variant="destructive"
1215
- className="gap-2"
1216
- onClick={() =>
1217
- setDeletePromptTask(selectedTask as OperationsTaskOption)
1218
- }
1219
- >
1220
- <Trash2 className="size-4" />
1221
- {commonT('actions.delete')}
1222
- </Button>
1223
- </>
1224
- ) : (
1225
- <>
1226
- <Button
1227
- variant="outline"
1228
- className="gap-2"
1229
- onClick={() =>
1230
- openEditTaskForm(selectedTask as OperationsTaskOption)
1231
- }
1232
- >
1233
- <Pencil className="size-4" />
1234
- {commonT('actions.edit')}
1235
- </Button>
1236
- <Button
1237
- variant="outline"
1238
- className="gap-2"
1239
- onClick={() => void handleArchiveTask(selectedTask.id)}
1240
- >
1241
- <Archive className="size-4" />
1242
- {commonT('actions.archive')}
1243
- </Button>
1244
- </>
1245
- )}
1246
- </div>
1247
- ) : null
1248
- }
1249
- />
1250
-
1251
- <Dialog
1252
- open={deletePromptTask !== null}
1253
- onOpenChange={(open) => {
1254
- if (!open) setDeletePromptTask(null);
1255
- }}
1256
- >
1257
- <DialogContent className="sm:max-w-sm">
1258
- <DialogHeader>
1259
- <DialogTitle>{t('dialogs.deleteTitle')}</DialogTitle>
1260
- </DialogHeader>
1261
- <p className="text-sm text-muted-foreground">
1262
- {t('dialogs.deleteDescription')}
1263
- </p>
1264
- <DialogFooter className="mt-4">
1265
- <Button variant="outline" onClick={() => setDeletePromptTask(null)}>
1266
- {commonT('actions.cancel')}
1267
- </Button>
1268
- {deletePromptTask ? (
1269
- <Button
1270
- variant="destructive"
1271
- onClick={() =>
1272
- void handlePermanentDeleteTask(deletePromptTask.id)
1273
- }
1274
- >
1275
- {commonT('actions.delete')}
1276
- </Button>
1277
- ) : null}
1278
- </DialogFooter>
1279
- </DialogContent>
1280
- </Dialog>
1281
-
1282
- <Dialog
1283
- open={taskFormOpen}
1284
- onOpenChange={(open) => {
1285
- if (!taskFormLoading) {
1286
- setTaskFormOpen(open);
1287
- if (!open) {
1288
- setEditingTaskId(null);
1289
- setTaskFormData(EMPTY_TASK_FORM);
1290
- }
1291
- }
1292
- }}
1293
- >
1294
- <DialogContent className="sm:max-w-2xl">
1295
- <DialogHeader>
1296
- <DialogTitle>
1297
- {editingTaskId
1298
- ? detailT('taskForm.titleEdit')
1299
- : detailT('taskForm.titleNew')}
1300
- </DialogTitle>
1301
- </DialogHeader>
1302
- <div className="space-y-4">
1303
- <div className="space-y-2">
1304
- <Label htmlFor="task-project">{commonT('labels.project')}</Label>
1305
- <Select
1306
- value={taskFormData.projectId}
1307
- onValueChange={(value) =>
1308
- setTaskFormData((prev) => ({
1309
- ...prev,
1310
- projectId: value,
1311
- }))
1312
- }
1313
- >
1314
- <SelectTrigger className="w-full" id="task-project">
1315
- <SelectValue
1316
- placeholder={t('dialogs.createProjectPlaceholder')}
1317
- />
1318
- </SelectTrigger>
1319
- <SelectContent>
1320
- {projectOptions.map((project) => (
1321
- <SelectItem key={project.id} value={String(project.id)}>
1322
- {project.label}
1323
- </SelectItem>
1324
- ))}
1325
- </SelectContent>
1326
- </Select>
1327
- </div>
1328
-
1329
- <div className="space-y-2">
1330
- <Label htmlFor="task-name">
1331
- {detailT('taskForm.nameLabel')} *
1332
- </Label>
1333
- <Input
1334
- id="task-name"
1335
- value={taskFormData.name}
1336
- onChange={(event) =>
1337
- setTaskFormData((prev) => ({
1338
- ...prev,
1339
- name: event.target.value,
1340
- }))
1341
- }
1342
- placeholder={detailT('taskForm.namePlaceholder')}
1343
- />
1344
- </div>
1345
-
1346
- <div className="space-y-2">
1347
- <Label htmlFor="task-description">
1348
- {detailT('taskForm.descriptionLabel')}
1349
- </Label>
1350
- <RichTextEditor
1351
- value={taskFormData.description}
1352
- onChange={(val) =>
1353
- setTaskFormData((prev) => ({
1354
- ...prev,
1355
- description: val,
1356
- }))
1357
- }
1358
- />
1359
- </div>
1360
-
1361
- <div className="grid grid-cols-2 gap-3">
1362
- <div className="space-y-2">
1363
- <Label>{detailT('taskForm.priorityLabel')}</Label>
1364
- <Select
1365
- value={taskFormData.priority}
1366
- onValueChange={(value) =>
1367
- setTaskFormData((prev) => ({
1368
- ...prev,
1369
- priority: value as TaskFormState['priority'],
1370
- }))
1371
- }
1372
- >
1373
- <SelectTrigger className="w-full">
1374
- <SelectValue />
1375
- </SelectTrigger>
1376
- <SelectContent>
1377
- <SelectItem value="low">
1378
- {getTaskPriorityLabel('low')}
1379
- </SelectItem>
1380
- <SelectItem value="medium">
1381
- {getTaskPriorityLabel('medium')}
1382
- </SelectItem>
1383
- <SelectItem value="high">
1384
- {getTaskPriorityLabel('high')}
1385
- </SelectItem>
1386
- </SelectContent>
1387
- </Select>
1388
- </div>
1389
-
1390
- <div className="space-y-2">
1391
- <Label>{detailT('taskForm.columnLabel')}</Label>
1392
- <Select
1393
- value={taskFormData.status}
1394
- onValueChange={(value) =>
1395
- setTaskFormData((prev) => ({
1396
- ...prev,
1397
- status: value as BoardColumnId,
1398
- }))
1399
- }
1400
- >
1401
- <SelectTrigger className="w-full">
1402
- <SelectValue />
1403
- </SelectTrigger>
1404
- <SelectContent>
1405
- {KANBAN_COLUMNS.map((column) => (
1406
- <SelectItem key={column.id} value={column.id}>
1407
- {column.label}
1408
- </SelectItem>
1409
- ))}
1410
- </SelectContent>
1411
- </Select>
1412
- </div>
1413
- </div>
1414
-
1415
- <div className="grid grid-cols-2 gap-3">
1416
- <div className="space-y-2">
1417
- <Label htmlFor="task-due-date">
1418
- {detailT('taskForm.deadlineLabel')}
1419
- </Label>
1420
- <Input
1421
- id="task-due-date"
1422
- type="date"
1423
- value={taskFormData.dueDate}
1424
- onChange={(event) =>
1425
- setTaskFormData((prev) => ({
1426
- ...prev,
1427
- dueDate: event.target.value,
1428
- }))
1429
- }
1430
- />
1431
- </div>
1432
-
1433
- <div className="space-y-2">
1434
- <Label htmlFor="task-estimate">
1435
- {detailT('taskForm.estimateLabel')}
1436
- </Label>
1437
- <Input
1438
- id="task-estimate"
1439
- type="number"
1440
- min="0"
1441
- step="0.5"
1442
- placeholder="0"
1443
- value={taskFormData.estimateHours}
1444
- onChange={(event) =>
1445
- setTaskFormData((prev) => ({
1446
- ...prev,
1447
- estimateHours: event.target.value,
1448
- }))
1449
- }
1450
- />
1451
- </div>
1452
- </div>
1453
-
1454
- <div className="space-y-2">
1455
- <Label htmlFor="task-tags">{detailT('taskForm.tagsLabel')}</Label>
1456
- <Input
1457
- id="task-tags"
1458
- value={taskFormData.tags}
1459
- onChange={(event) =>
1460
- setTaskFormData((prev) => ({
1461
- ...prev,
1462
- tags: event.target.value,
1463
- }))
1464
- }
1465
- placeholder={detailT('taskForm.tagsPlaceholder')}
1466
- />
1467
- </div>
1468
- </div>
1469
- <DialogFooter className="gap-2 sm:justify-between">
1470
- <Button
1471
- variant="ghost"
1472
- onClick={() => {
1473
- setTaskFormOpen(false);
1474
- setEditingTaskId(null);
1475
- setTaskFormData(EMPTY_TASK_FORM);
1476
- }}
1477
- disabled={taskFormLoading}
1478
- >
1479
- {commonT('actions.cancel')}
1480
- </Button>
1481
- <Button
1482
- onClick={() => void handleTaskFormSubmit()}
1483
- disabled={
1484
- taskFormLoading ||
1485
- !taskFormData.projectId ||
1486
- !taskFormData.name.trim()
1487
- }
1488
- >
1489
- {taskFormLoading ? (
1490
- <Loader2 className="size-4 animate-spin" />
1491
- ) : null}
1492
- {editingTaskId ? commonT('actions.save') : t('actions.create')}
1493
- </Button>
1494
- </DialogFooter>
1495
- </DialogContent>
1496
- </Dialog>
1497
- </Page>
1498
- );
1499
- }