@open-mercato/core 0.6.4-develop.4217.1.c9aa050183 → 0.6.4-develop.4239.1.4a264a5828

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 (408) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/staff_time_entry/index.js +37 -0
  3. package/dist/generated/entities/staff_time_entry/index.js.map +7 -0
  4. package/dist/generated/entities/staff_time_entry_segment/index.js +23 -0
  5. package/dist/generated/entities/staff_time_entry_segment/index.js.map +7 -0
  6. package/dist/generated/entities/staff_time_project/index.js +35 -0
  7. package/dist/generated/entities/staff_time_project/index.js.map +7 -0
  8. package/dist/generated/entities/staff_time_project_member/index.js +29 -0
  9. package/dist/generated/entities/staff_time_project_member/index.js.map +7 -0
  10. package/dist/generated/entities.ids.generated.js +5 -1
  11. package/dist/generated/entities.ids.generated.js.map +2 -2
  12. package/dist/generated/entity-fields-registry.js +64 -0
  13. package/dist/generated/entity-fields-registry.js.map +2 -2
  14. package/dist/helpers/integration/timesheetFixtures.js +50 -0
  15. package/dist/helpers/integration/timesheetFixtures.js.map +7 -0
  16. package/dist/modules/attachments/api/library/[id]/route.js +20 -16
  17. package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
  18. package/dist/modules/attachments/api/route.js +18 -14
  19. package/dist/modules/attachments/api/route.js.map +2 -2
  20. package/dist/modules/auth/api/roles/acl/route.js +10 -4
  21. package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
  22. package/dist/modules/auth/api/sidebar/preferences/route.js +27 -20
  23. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  24. package/dist/modules/auth/api/users/acl/route.js +16 -11
  25. package/dist/modules/auth/api/users/acl/route.js.map +2 -2
  26. package/dist/modules/auth/commands/users.js +87 -71
  27. package/dist/modules/auth/commands/users.js.map +2 -2
  28. package/dist/modules/auth/services/sidebarPreferencesService.js +39 -30
  29. package/dist/modules/auth/services/sidebarPreferencesService.js.map +2 -2
  30. package/dist/modules/business_rules/backend/logs/[id]/page.js +24 -5
  31. package/dist/modules/business_rules/backend/logs/[id]/page.js.map +2 -2
  32. package/dist/modules/catalog/api/offers/route.js +15 -5
  33. package/dist/modules/catalog/api/offers/route.js.map +2 -2
  34. package/dist/modules/catalog/commands/categories.js +61 -12
  35. package/dist/modules/catalog/commands/categories.js.map +2 -2
  36. package/dist/modules/catalog/commands/products.js +79 -54
  37. package/dist/modules/catalog/commands/products.js.map +2 -2
  38. package/dist/modules/catalog/commands/variants.js +29 -16
  39. package/dist/modules/catalog/commands/variants.js.map +2 -2
  40. package/dist/modules/currencies/backend/currencies/[id]/page.js +19 -2
  41. package/dist/modules/currencies/backend/currencies/[id]/page.js.map +2 -2
  42. package/dist/modules/currencies/commands/currencies.js +15 -8
  43. package/dist/modules/currencies/commands/currencies.js.map +2 -2
  44. package/dist/modules/customer_accounts/api/admin/users.js +27 -26
  45. package/dist/modules/customer_accounts/api/admin/users.js.map +2 -2
  46. package/dist/modules/customer_accounts/api/password/reset-confirm.js +5 -5
  47. package/dist/modules/customer_accounts/api/password/reset-confirm.js.map +2 -2
  48. package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js +11 -10
  49. package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js.map +2 -2
  50. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +27 -7
  51. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
  52. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +27 -7
  53. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  54. package/dist/modules/customers/backend/customers/people/[id]/page.js +29 -8
  55. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  56. package/dist/modules/customers/commands/addresses.js +35 -21
  57. package/dist/modules/customers/commands/addresses.js.map +2 -2
  58. package/dist/modules/customers/commands/companies.js +163 -162
  59. package/dist/modules/customers/commands/companies.js.map +2 -2
  60. package/dist/modules/customers/commands/deals.js +3 -4
  61. package/dist/modules/customers/commands/deals.js.map +2 -2
  62. package/dist/modules/customers/commands/interactions.js +19 -22
  63. package/dist/modules/customers/commands/interactions.js.map +2 -2
  64. package/dist/modules/customers/commands/people.js +18 -15
  65. package/dist/modules/customers/commands/people.js.map +2 -2
  66. package/dist/modules/customers/commands/personCompanyLinks.js +105 -94
  67. package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
  68. package/dist/modules/customers/commands/pipeline-stages.js +30 -23
  69. package/dist/modules/customers/commands/pipeline-stages.js.map +2 -2
  70. package/dist/modules/customers/commands/pipelines.js +27 -20
  71. package/dist/modules/customers/commands/pipelines.js.map +2 -2
  72. package/dist/modules/customers/commands/tags.js +13 -5
  73. package/dist/modules/customers/commands/tags.js.map +2 -2
  74. package/dist/modules/dashboards/api/users/widgets/route.js +0 -1
  75. package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
  76. package/dist/modules/dashboards/api/widgets/data/route.js +29 -1
  77. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  78. package/dist/modules/data_sync/lib/sync-engine.js +4 -4
  79. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  80. package/dist/modules/data_sync/lib/sync-run-service.js +51 -27
  81. package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
  82. package/dist/modules/directory/commands/organizations.js +192 -158
  83. package/dist/modules/directory/commands/organizations.js.map +3 -3
  84. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +22 -16
  85. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
  86. package/dist/modules/messages/commands/messages.js +77 -75
  87. package/dist/modules/messages/commands/messages.js.map +2 -2
  88. package/dist/modules/messages/commands/shared.js +132 -132
  89. package/dist/modules/messages/commands/shared.js.map +2 -2
  90. package/dist/modules/perspectives/api/[tableId]/route.js +37 -26
  91. package/dist/modules/perspectives/api/[tableId]/route.js.map +2 -2
  92. package/dist/modules/progress/acl.js +8 -4
  93. package/dist/modules/progress/acl.js.map +2 -2
  94. package/dist/modules/resources/commands/resources.js +125 -117
  95. package/dist/modules/resources/commands/resources.js.map +2 -2
  96. package/dist/modules/resources/commands/tags.js +7 -3
  97. package/dist/modules/resources/commands/tags.js.map +2 -2
  98. package/dist/modules/sales/api/quotes/send/route.js +12 -11
  99. package/dist/modules/sales/api/quotes/send/route.js.map +2 -2
  100. package/dist/modules/sales/commands/documents.js +629 -478
  101. package/dist/modules/sales/commands/documents.js.map +2 -2
  102. package/dist/modules/sales/commands/payments.js +146 -146
  103. package/dist/modules/sales/commands/payments.js.map +2 -2
  104. package/dist/modules/sales/commands/returns.js +68 -60
  105. package/dist/modules/sales/commands/returns.js.map +2 -2
  106. package/dist/modules/staff/acl.js +10 -1
  107. package/dist/modules/staff/acl.js.map +2 -2
  108. package/dist/modules/staff/analytics.js +33 -0
  109. package/dist/modules/staff/analytics.js.map +7 -0
  110. package/dist/modules/staff/api/guards.js +31 -0
  111. package/dist/modules/staff/api/guards.js.map +7 -0
  112. package/dist/modules/staff/api/interceptors.js +96 -0
  113. package/dist/modules/staff/api/interceptors.js.map +7 -0
  114. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +170 -0
  115. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +7 -0
  116. package/dist/modules/staff/api/timesheets/my-projects/route.js +103 -0
  117. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +7 -0
  118. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +147 -0
  119. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +7 -0
  120. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +171 -0
  121. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +7 -0
  122. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +180 -0
  123. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +7 -0
  124. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +155 -0
  125. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +7 -0
  126. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +173 -0
  127. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +7 -0
  128. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +260 -0
  129. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +7 -0
  130. package/dist/modules/staff/api/timesheets/time-entries/route.js +188 -0
  131. package/dist/modules/staff/api/timesheets/time-entries/route.js.map +7 -0
  132. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +159 -0
  133. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +7 -0
  134. package/dist/modules/staff/api/timesheets/time-projects/route.js +230 -0
  135. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +7 -0
  136. package/dist/modules/staff/backend/staff/timesheets/page.js +710 -0
  137. package/dist/modules/staff/backend/staff/timesheets/page.js.map +7 -0
  138. package/dist/modules/staff/backend/staff/timesheets/page.meta.js +22 -0
  139. package/dist/modules/staff/backend/staff/timesheets/page.meta.js.map +7 -0
  140. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +125 -0
  141. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +7 -0
  142. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js +16 -0
  143. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js.map +7 -0
  144. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +418 -0
  145. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +7 -0
  146. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js +16 -0
  147. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js.map +7 -0
  148. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +79 -0
  149. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +7 -0
  150. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js +16 -0
  151. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js.map +7 -0
  152. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +602 -0
  153. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +7 -0
  154. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js +25 -0
  155. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js.map +7 -0
  156. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js +123 -0
  157. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js.map +7 -0
  158. package/dist/modules/staff/cli.js +38 -1
  159. package/dist/modules/staff/cli.js.map +2 -2
  160. package/dist/modules/staff/commands/index.js +2 -0
  161. package/dist/modules/staff/commands/index.js.map +2 -2
  162. package/dist/modules/staff/commands/leave-requests.js +30 -28
  163. package/dist/modules/staff/commands/leave-requests.js.map +3 -3
  164. package/dist/modules/staff/commands/team-members.js +21 -20
  165. package/dist/modules/staff/commands/team-members.js.map +2 -2
  166. package/dist/modules/staff/commands/timesheets-entries.js +409 -0
  167. package/dist/modules/staff/commands/timesheets-entries.js.map +7 -0
  168. package/dist/modules/staff/commands/timesheets-projects.js +618 -0
  169. package/dist/modules/staff/commands/timesheets-projects.js.map +7 -0
  170. package/dist/modules/staff/data/enrichers.js +104 -0
  171. package/dist/modules/staff/data/enrichers.js.map +7 -0
  172. package/dist/modules/staff/data/entities.js +226 -1
  173. package/dist/modules/staff/data/entities.js.map +2 -2
  174. package/dist/modules/staff/data/validators.js +113 -1
  175. package/dist/modules/staff/data/validators.js.map +2 -2
  176. package/dist/modules/staff/events.js +13 -1
  177. package/dist/modules/staff/events.js.map +2 -2
  178. package/dist/modules/staff/lib/crud.js +7 -1
  179. package/dist/modules/staff/lib/crud.js.map +2 -2
  180. package/dist/modules/staff/lib/staffMemberResolver.js +15 -0
  181. package/dist/modules/staff/lib/staffMemberResolver.js.map +7 -0
  182. package/dist/modules/staff/lib/timesheets-projects/computeProjectHoursTrend.js +60 -0
  183. package/dist/modules/staff/lib/timesheets-projects/computeProjectHoursTrend.js.map +7 -0
  184. package/dist/modules/staff/lib/timesheets-projects/computeProjectsKpis.js +260 -0
  185. package/dist/modules/staff/lib/timesheets-projects/computeProjectsKpis.js.map +7 -0
  186. package/dist/modules/staff/lib/timesheets-projects/dateBuckets.js +41 -0
  187. package/dist/modules/staff/lib/timesheets-projects/dateBuckets.js.map +7 -0
  188. package/dist/modules/staff/lib/timesheets-projects/initials.js +10 -0
  189. package/dist/modules/staff/lib/timesheets-projects/initials.js.map +7 -0
  190. package/dist/modules/staff/lib/timesheets-projects/kpiMath.js +12 -0
  191. package/dist/modules/staff/lib/timesheets-projects/kpiMath.js.map +7 -0
  192. package/dist/modules/staff/lib/timesheets-projects/listProjectMembersPreview.js +55 -0
  193. package/dist/modules/staff/lib/timesheets-projects/listProjectMembersPreview.js.map +7 -0
  194. package/dist/modules/staff/lib/timesheets-projects-ui/HoursSparkline.js +66 -0
  195. package/dist/modules/staff/lib/timesheets-projects-ui/HoursSparkline.js.map +7 -0
  196. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js +81 -0
  197. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js.map +7 -0
  198. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectMembersAvatarStack.js +58 -0
  199. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectMembersAvatarStack.js.map +7 -0
  200. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsKpiStrip.js +152 -0
  201. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsKpiStrip.js.map +7 -0
  202. package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js +37 -0
  203. package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js.map +7 -0
  204. package/dist/modules/staff/lib/timesheets-projects-ui/ViewModeToggle.js +57 -0
  205. package/dist/modules/staff/lib/timesheets-projects-ui/ViewModeToggle.js.map +7 -0
  206. package/dist/modules/staff/lib/timesheets-projects-ui/useProjectsViewMode.js +50 -0
  207. package/dist/modules/staff/lib/timesheets-projects-ui/useProjectsViewMode.js.map +7 -0
  208. package/dist/modules/staff/lib/timesheets-ui/AddRowDropdown.js +163 -0
  209. package/dist/modules/staff/lib/timesheets-ui/AddRowDropdown.js.map +7 -0
  210. package/dist/modules/staff/lib/timesheets-ui/CalendarPicker.js +209 -0
  211. package/dist/modules/staff/lib/timesheets-ui/CalendarPicker.js.map +7 -0
  212. package/dist/modules/staff/lib/timesheets-ui/ColorPicker.js +52 -0
  213. package/dist/modules/staff/lib/timesheets-ui/ColorPicker.js.map +7 -0
  214. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js +77 -0
  215. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js.map +7 -0
  216. package/dist/modules/staff/lib/timesheets-ui/ListView.js +173 -0
  217. package/dist/modules/staff/lib/timesheets-ui/ListView.js.map +7 -0
  218. package/dist/modules/staff/lib/timesheets-ui/ProjectColorDot.js +32 -0
  219. package/dist/modules/staff/lib/timesheets-ui/ProjectColorDot.js.map +7 -0
  220. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js +270 -0
  221. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js.map +7 -0
  222. package/dist/modules/staff/lib/timesheets-ui/ViewSwitcher.js +57 -0
  223. package/dist/modules/staff/lib/timesheets-ui/ViewSwitcher.js.map +7 -0
  224. package/dist/modules/staff/lib/timesheets-ui/colors.js +43 -0
  225. package/dist/modules/staff/lib/timesheets-ui/colors.js.map +7 -0
  226. package/dist/modules/staff/migrations/Migration20260326135612.js +24 -0
  227. package/dist/modules/staff/migrations/Migration20260326135612.js.map +7 -0
  228. package/dist/modules/staff/migrations/Migration20260413102715.js +23 -0
  229. package/dist/modules/staff/migrations/Migration20260413102715.js.map +7 -0
  230. package/dist/modules/staff/migrations/Migration20260413111602.js +13 -0
  231. package/dist/modules/staff/migrations/Migration20260413111602.js.map +7 -0
  232. package/dist/modules/staff/migrations/Migration20260511112759.js +19 -0
  233. package/dist/modules/staff/migrations/Migration20260511112759.js.map +7 -0
  234. package/dist/modules/staff/search.js +35 -0
  235. package/dist/modules/staff/search.js.map +2 -2
  236. package/dist/modules/staff/setup.js +15 -1
  237. package/dist/modules/staff/setup.js.map +2 -2
  238. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/config.js +16 -0
  239. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/config.js.map +7 -0
  240. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.js +126 -0
  241. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.js.map +7 -0
  242. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.js +26 -0
  243. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.js.map +7 -0
  244. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/config.js +15 -0
  245. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/config.js.map +7 -0
  246. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.js +238 -0
  247. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.js.map +7 -0
  248. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.js +26 -0
  249. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.js.map +7 -0
  250. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js +145 -0
  251. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js.map +7 -0
  252. package/dist/modules/staff/widgets/injection-table.js +12 -0
  253. package/dist/modules/staff/widgets/injection-table.js.map +7 -0
  254. package/dist/modules/sync_excel/api/import/route.js +19 -17
  255. package/dist/modules/sync_excel/api/import/route.js.map +2 -2
  256. package/dist/modules/translations/commands/translations.js +22 -19
  257. package/dist/modules/translations/commands/translations.js.map +2 -2
  258. package/dist/modules/workflows/backend/events/[id]/page.js +24 -6
  259. package/dist/modules/workflows/backend/events/[id]/page.js.map +2 -2
  260. package/dist/modules/workflows/backend/instances/[id]/page.js +27 -5
  261. package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
  262. package/dist/modules/workflows/backend/tasks/[id]/page.js +25 -6
  263. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  264. package/generated/entities/staff_time_entry/index.ts +17 -0
  265. package/generated/entities/staff_time_entry_segment/index.ts +10 -0
  266. package/generated/entities/staff_time_project/index.ts +16 -0
  267. package/generated/entities/staff_time_project_member/index.ts +13 -0
  268. package/generated/entities.ids.generated.ts +5 -1
  269. package/generated/entity-fields-registry.ts +64 -0
  270. package/package.json +7 -7
  271. package/src/helpers/integration/timesheetFixtures.ts +61 -0
  272. package/src/modules/attachments/api/library/[id]/route.ts +24 -17
  273. package/src/modules/attachments/api/route.ts +20 -14
  274. package/src/modules/auth/api/roles/acl/route.ts +11 -5
  275. package/src/modules/auth/api/sidebar/preferences/route.ts +33 -24
  276. package/src/modules/auth/api/users/acl/route.ts +17 -12
  277. package/src/modules/auth/commands/users.ts +96 -80
  278. package/src/modules/auth/services/sidebarPreferencesService.ts +40 -32
  279. package/src/modules/business_rules/backend/logs/[id]/page.tsx +32 -7
  280. package/src/modules/catalog/api/offers/route.ts +20 -5
  281. package/src/modules/catalog/commands/categories.ts +61 -12
  282. package/src/modules/catalog/commands/products.ts +93 -60
  283. package/src/modules/catalog/commands/variants.ts +29 -16
  284. package/src/modules/currencies/backend/currencies/[id]/page.tsx +21 -2
  285. package/src/modules/currencies/commands/currencies.ts +27 -14
  286. package/src/modules/currencies/i18n/de.json +1 -0
  287. package/src/modules/currencies/i18n/en.json +1 -0
  288. package/src/modules/currencies/i18n/es.json +1 -0
  289. package/src/modules/currencies/i18n/pl.json +1 -0
  290. package/src/modules/customer_accounts/api/admin/users.ts +31 -26
  291. package/src/modules/customer_accounts/api/password/reset-confirm.ts +5 -6
  292. package/src/modules/customer_accounts/api/portal/users/[id]/roles.ts +14 -13
  293. package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +34 -11
  294. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +34 -11
  295. package/src/modules/customers/backend/customers/people/[id]/page.tsx +35 -11
  296. package/src/modules/customers/commands/addresses.ts +35 -23
  297. package/src/modules/customers/commands/companies.ts +166 -165
  298. package/src/modules/customers/commands/deals.ts +2 -4
  299. package/src/modules/customers/commands/interactions.ts +20 -26
  300. package/src/modules/customers/commands/people.ts +18 -15
  301. package/src/modules/customers/commands/personCompanyLinks.ts +109 -100
  302. package/src/modules/customers/commands/pipeline-stages.ts +31 -27
  303. package/src/modules/customers/commands/pipelines.ts +29 -23
  304. package/src/modules/customers/commands/tags.ts +13 -5
  305. package/src/modules/dashboards/api/users/widgets/route.ts +0 -1
  306. package/src/modules/dashboards/api/widgets/data/route.ts +36 -1
  307. package/src/modules/data_sync/lib/sync-engine.ts +4 -5
  308. package/src/modules/data_sync/lib/sync-run-service.ts +57 -28
  309. package/src/modules/directory/commands/organizations.ts +203 -166
  310. package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +26 -18
  311. package/src/modules/messages/commands/messages.ts +82 -80
  312. package/src/modules/messages/commands/shared.ts +138 -133
  313. package/src/modules/perspectives/api/[tableId]/route.ts +38 -27
  314. package/src/modules/progress/acl.ts +4 -0
  315. package/src/modules/resources/commands/resources.ts +127 -117
  316. package/src/modules/resources/commands/tags.ts +7 -3
  317. package/src/modules/sales/api/quotes/send/route.ts +17 -12
  318. package/src/modules/sales/commands/documents.ts +673 -481
  319. package/src/modules/sales/commands/payments.ts +158 -152
  320. package/src/modules/sales/commands/returns.ts +74 -63
  321. package/src/modules/staff/acl.ts +11 -0
  322. package/src/modules/staff/analytics.ts +30 -0
  323. package/src/modules/staff/api/guards.ts +59 -0
  324. package/src/modules/staff/api/interceptors.ts +122 -0
  325. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +191 -0
  326. package/src/modules/staff/api/timesheets/my-projects/route.ts +115 -0
  327. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +159 -0
  328. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +187 -0
  329. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +191 -0
  330. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +168 -0
  331. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +191 -0
  332. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +292 -0
  333. package/src/modules/staff/api/timesheets/time-entries/route.ts +193 -0
  334. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +167 -0
  335. package/src/modules/staff/api/timesheets/time-projects/route.ts +244 -0
  336. package/src/modules/staff/backend/staff/timesheets/page.meta.ts +20 -0
  337. package/src/modules/staff/backend/staff/timesheets/page.tsx +899 -0
  338. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.ts +12 -0
  339. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +141 -0
  340. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.ts +12 -0
  341. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +579 -0
  342. package/src/modules/staff/backend/staff/timesheets/projects/create/page.meta.ts +12 -0
  343. package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +90 -0
  344. package/src/modules/staff/backend/staff/timesheets/projects/page.meta.ts +23 -0
  345. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +765 -0
  346. package/src/modules/staff/backend/staff/timesheets/projects/projectFormConfig.ts +138 -0
  347. package/src/modules/staff/cli.ts +40 -1
  348. package/src/modules/staff/commands/index.ts +2 -0
  349. package/src/modules/staff/commands/leave-requests.ts +37 -29
  350. package/src/modules/staff/commands/team-members.ts +25 -20
  351. package/src/modules/staff/commands/timesheets-entries.ts +504 -0
  352. package/src/modules/staff/commands/timesheets-projects.ts +699 -0
  353. package/src/modules/staff/data/enrichers.ts +134 -0
  354. package/src/modules/staff/data/entities.ts +198 -0
  355. package/src/modules/staff/data/validators.ts +129 -0
  356. package/src/modules/staff/events.ts +13 -0
  357. package/src/modules/staff/i18n/de.json +209 -1
  358. package/src/modules/staff/i18n/en.json +209 -1
  359. package/src/modules/staff/i18n/es.json +209 -1
  360. package/src/modules/staff/i18n/pl.json +209 -1
  361. package/src/modules/staff/lib/crud.ts +8 -0
  362. package/src/modules/staff/lib/staffMemberResolver.ts +22 -0
  363. package/src/modules/staff/lib/timesheets-projects/computeProjectHoursTrend.ts +89 -0
  364. package/src/modules/staff/lib/timesheets-projects/computeProjectsKpis.ts +311 -0
  365. package/src/modules/staff/lib/timesheets-projects/dateBuckets.ts +37 -0
  366. package/src/modules/staff/lib/timesheets-projects/initials.ts +6 -0
  367. package/src/modules/staff/lib/timesheets-projects/kpiMath.ts +8 -0
  368. package/src/modules/staff/lib/timesheets-projects/listProjectMembersPreview.ts +83 -0
  369. package/src/modules/staff/lib/timesheets-projects-ui/HoursSparkline.tsx +75 -0
  370. package/src/modules/staff/lib/timesheets-projects-ui/ProjectCard.tsx +110 -0
  371. package/src/modules/staff/lib/timesheets-projects-ui/ProjectMembersAvatarStack.tsx +73 -0
  372. package/src/modules/staff/lib/timesheets-projects-ui/ProjectsKpiStrip.tsx +185 -0
  373. package/src/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.tsx +53 -0
  374. package/src/modules/staff/lib/timesheets-projects-ui/ViewModeToggle.tsx +63 -0
  375. package/src/modules/staff/lib/timesheets-projects-ui/useProjectsViewMode.ts +63 -0
  376. package/src/modules/staff/lib/timesheets-ui/AddRowDropdown.tsx +188 -0
  377. package/src/modules/staff/lib/timesheets-ui/CalendarPicker.tsx +229 -0
  378. package/src/modules/staff/lib/timesheets-ui/ColorPicker.tsx +65 -0
  379. package/src/modules/staff/lib/timesheets-ui/CreateProjectDialog.tsx +99 -0
  380. package/src/modules/staff/lib/timesheets-ui/ListView.tsx +230 -0
  381. package/src/modules/staff/lib/timesheets-ui/ProjectColorDot.tsx +40 -0
  382. package/src/modules/staff/lib/timesheets-ui/TimerBar.tsx +327 -0
  383. package/src/modules/staff/lib/timesheets-ui/ViewSwitcher.tsx +60 -0
  384. package/src/modules/staff/lib/timesheets-ui/colors.ts +58 -0
  385. package/src/modules/staff/migrations/.snapshot-open-mercato.json +1148 -0
  386. package/src/modules/staff/migrations/Migration20260326135612.ts +26 -0
  387. package/src/modules/staff/migrations/Migration20260413102715.ts +25 -0
  388. package/src/modules/staff/migrations/Migration20260413111602.ts +13 -0
  389. package/src/modules/staff/migrations/Migration20260511112759.ts +21 -0
  390. package/src/modules/staff/search.ts +35 -0
  391. package/src/modules/staff/setup.ts +15 -0
  392. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/config.ts +17 -0
  393. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.tsx +158 -0
  394. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.ts +25 -0
  395. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/config.ts +15 -0
  396. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.tsx +297 -0
  397. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.ts +25 -0
  398. package/src/modules/staff/widgets/injection/timer-sidebar-indicator/widget.tsx +161 -0
  399. package/src/modules/staff/widgets/injection-table.ts +10 -0
  400. package/src/modules/sync_excel/api/import/route.ts +23 -18
  401. package/src/modules/translations/commands/translations.ts +49 -41
  402. package/src/modules/workflows/backend/events/[id]/page.tsx +32 -10
  403. package/src/modules/workflows/backend/instances/[id]/page.tsx +33 -9
  404. package/src/modules/workflows/backend/tasks/[id]/page.tsx +33 -10
  405. package/src/modules/workflows/i18n/de.json +1 -0
  406. package/src/modules/workflows/i18n/en.json +1 -0
  407. package/src/modules/workflows/i18n/es.json +1 -0
  408. package/src/modules/workflows/i18n/pl.json +1 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/staff/backend/staff/timesheets/page.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport Link from 'next/link'\nimport { ViewSwitcher } from '../../../lib/timesheets-ui/ViewSwitcher'\nimport { CalendarPicker } from '../../../lib/timesheets-ui/CalendarPicker'\nimport { ListView } from '../../../lib/timesheets-ui/ListView'\nimport { TimerBar } from '../../../lib/timesheets-ui/TimerBar'\nimport { AddRowDropdown } from '../../../lib/timesheets-ui/AddRowDropdown'\nimport { CreateProjectDialog } from '../../../lib/timesheets-ui/CreateProjectDialog'\nimport { ProjectColorDot } from '../../../lib/timesheets-ui/ProjectColorDot'\n\n// --- Types ---\n\ntype ProjectRow = { id: string; name: string; code: string | null; color?: string | null }\ntype CellEntry = { id?: string; minutes: number }\ntype EntryMap = Record<string, Record<string, CellEntry[]>>\ntype DirtyMap = Record<string, Record<string, CellEntry>>\ntype RawTextMap = Record<string, Record<string, string>>\ntype ViewMode = 'weekly' | 'monthly'\ntype ViewType = 'timesheet' | 'list'\n\ntype RawTimeEntry = Record<string, unknown>\n\n// --- Date Helpers ---\n\nfunction getMonday(date: Date): Date {\n const d = new Date(date)\n const day = d.getDay()\n const diff = day === 0 ? -6 : 1 - day\n d.setDate(d.getDate() + diff)\n d.setHours(0, 0, 0, 0)\n return d\n}\n\nfunction getSunday(monday: Date): Date {\n const d = new Date(monday)\n d.setDate(d.getDate() + 6)\n return d\n}\n\nfunction getWeekNumber(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7))\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1))\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7)\n}\n\nfunction formatDateKey(date: Date): string {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${y}-${m}-${d}`\n}\n\nfunction formatDateKeyFromParts(year: number, month: number, day: number): string {\n const m = String(month + 1).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n return `${year}-${m}-${d}`\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction isWeekendDay(date: Date): boolean {\n const d = date.getDay()\n return d === 0 || d === 6\n}\n\nfunction minutesToDecimal(minutes: number): string {\n if (minutes === 0) return ''\n const hours = minutes / 60\n return hours % 1 === 0 ? String(hours) : hours.toFixed(2).replace(/0+$/, '').replace(/\\.$/, '')\n}\n\nfunction decimalToMinutes(value: string): number {\n const trimmed = value.trim()\n if (!trimmed) return 0\n const num = parseFloat(trimmed)\n if (isNaN(num) || num < 0) return 0\n return Math.min(Math.round(num * 60), 1440)\n}\n\nfunction getLocalizedDayName(date: Date): string {\n return date.toLocaleDateString(undefined, { weekday: 'short' })\n}\n\n// --- Derived date ranges ---\n\nfunction getWeekDays(weekStart: Date): Date[] {\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(weekStart)\n d.setDate(d.getDate() + i)\n return d\n })\n}\n\nfunction getMonthDays(year: number, month: number): Date[] {\n const count = getDaysInMonth(year, month)\n return Array.from({ length: count }, (_, i) => new Date(year, month, i + 1))\n}\n\n// --- Week label ---\n\nfunction formatWeekLabel(weekStart: Date): string {\n const weekEnd = getSunday(weekStart)\n const weekNum = getWeekNumber(weekStart)\n const startDay = weekStart.getDate()\n const endDay = weekEnd.getDate()\n const startMonth = weekStart.toLocaleString(undefined, { month: 'short' })\n const endMonth = weekEnd.toLocaleString(undefined, { month: 'short' })\n const year = weekStart.getFullYear()\n\n const dateRange = weekStart.getMonth() === weekEnd.getMonth()\n ? `${startDay} - ${endDay} ${startMonth} ${year}`\n : `${startDay} ${startMonth} - ${endDay} ${endMonth} ${year}`\n\n return `${dateRange} \\u00b7 W${weekNum}`\n}\n\nfunction formatMonthLabel(year: number, month: number): string {\n const date = new Date(year, month, 1)\n return date.toLocaleString(undefined, { month: 'long', year: 'numeric' })\n}\n\n// --- Component ---\n\nexport default function MyTimesheetsPage() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n\n const now = new Date()\n const [viewMode, setViewMode] = React.useState<ViewMode>('weekly')\n const [viewType, setViewType] = React.useState<ViewType>('timesheet')\n const [weekStart, setWeekStart] = React.useState<Date>(() => getMonday(now))\n const [monthYear, setMonthYear] = React.useState(now.getFullYear())\n const [monthIndex, setMonthIndex] = React.useState(now.getMonth())\n\n const [projects, setProjects] = React.useState<ProjectRow[]>([])\n const [entries, setEntries] = React.useState<EntryMap>({})\n const [rawEntries, setRawEntries] = React.useState<RawTimeEntry[]>([])\n const [dirty, setDirty] = React.useState<DirtyMap>({})\n const [rawText, setRawText] = React.useState<RawTextMap>({})\n const [staffMemberId, setStaffMemberId] = React.useState<string | null>(null)\n const [staffMemberMissing, setStaffMemberMissing] = React.useState(false)\n const [isInitialLoad, setIsInitialLoad] = React.useState(true)\n const [isRefreshing, setIsRefreshing] = React.useState(false)\n const [isSaving, setIsSaving] = React.useState(false)\n const [canManageProjects, setCanManageProjects] = React.useState(false)\n const [createDialogOpen, setCreateDialogOpen] = React.useState(false)\n const [allAssignedProjects, setAllAssignedProjects] = React.useState<ProjectRow[]>([])\n\n const mutationContextId = React.useMemo(\n () => (staffMemberId ? `staff-timesheets:${staffMemberId}` : 'staff-timesheets:pending'),\n [staffMemberId],\n )\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId?: string\n staffMemberId: string | null\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n\n // --- Feature check ---\n React.useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const res = await apiCall<{ ok: boolean; granted: string[] }>('/api/auth/feature-check', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ features: ['staff.timesheets.projects.manage'] }),\n })\n if (!cancelled) {\n setCanManageProjects(new Set(res.result?.granted ?? []).has('staff.timesheets.projects.manage'))\n }\n } catch {\n // default: no manage access\n }\n })()\n return () => { cancelled = true }\n }, [])\n\n // --- Computed days for current view ---\n const visibleDays = React.useMemo(() => {\n if (viewMode === 'weekly') return getWeekDays(weekStart)\n return getMonthDays(monthYear, monthIndex)\n }, [viewMode, weekStart, monthYear, monthIndex])\n\n const dateRange = React.useMemo(() => {\n if (viewMode === 'weekly') {\n return { from: formatDateKey(weekStart), to: formatDateKey(getSunday(weekStart)) }\n }\n const daysInMonth = getDaysInMonth(monthYear, monthIndex)\n return {\n from: formatDateKeyFromParts(monthYear, monthIndex, 1),\n to: formatDateKeyFromParts(monthYear, monthIndex, daysInMonth),\n }\n }, [viewMode, weekStart, monthYear, monthIndex])\n\n // --- Navigation ---\n const goToPrev = React.useCallback(() => {\n if (viewMode === 'weekly') {\n setWeekStart((prev) => {\n const d = new Date(prev)\n d.setDate(d.getDate() - 7)\n return d\n })\n } else {\n setMonthIndex((prev) => {\n if (prev === 0) { setMonthYear((y) => y - 1); return 11 }\n return prev - 1\n })\n }\n }, [viewMode])\n\n const goToNext = React.useCallback(() => {\n if (viewMode === 'weekly') {\n setWeekStart((prev) => {\n const d = new Date(prev)\n d.setDate(d.getDate() + 7)\n return d\n })\n } else {\n setMonthIndex((prev) => {\n if (prev === 11) { setMonthYear((y) => y + 1); return 0 }\n return prev + 1\n })\n }\n }, [viewMode])\n\n const navigationLabel = React.useMemo(() => {\n if (viewMode === 'weekly') return formatWeekLabel(weekStart)\n return formatMonthLabel(monthYear, monthIndex)\n }, [viewMode, weekStart, monthYear, monthIndex])\n\n // --- Data loading ---\n const isInitialLoadRef = React.useRef(true)\n\n const loadData = React.useCallback(async () => {\n if (!isInitialLoadRef.current) setIsRefreshing(true)\n try {\n const selfRes = await readApiResultOrThrow<{ member?: { id: string; displayName: string } | null }>(\n '/api/staff/team-members/self',\n undefined,\n { errorMessage: t('staff.timesheets.my.errors.load', 'Failed to load timesheets.'), fallback: { member: null } },\n )\n const memberId = selfRes.member?.id ?? null\n setStaffMemberId(memberId)\n if (!memberId) {\n setStaffMemberMissing(true)\n setProjects([])\n setEntries({})\n setRawEntries([])\n setIsInitialLoad(false)\n setIsRefreshing(false)\n return\n }\n setStaffMemberMissing(false)\n\n const assignmentsRes = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/staff/timesheets/my-projects?pageSize=100',\n undefined,\n { errorMessage: t('staff.timesheets.my.errors.load', 'Failed to load timesheets.'), fallback: { items: [] } },\n )\n const assignmentItems = Array.isArray(assignmentsRes.items) ? assignmentsRes.items : []\n const assignedProjectIds = assignmentItems\n .map((item) => String(item.time_project_id ?? item.timeProjectId ?? ''))\n .filter((id) => id.length > 0)\n const visibleProjectIdSet = new Set(\n assignmentItems\n .filter((item) => item.show_in_grid === true || item.showInGrid === true)\n .map((item) => String(item.time_project_id ?? item.timeProjectId ?? ''))\n .filter((id) => id.length > 0),\n )\n\n const [projectsRes, entriesRes] = await Promise.all([\n assignedProjectIds.length > 0\n ? readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n `/api/staff/timesheets/time-projects?ids=${assignedProjectIds.join(',')}&pageSize=100`,\n undefined,\n { errorMessage: t('staff.timesheets.my.errors.load', 'Failed to load timesheets.'), fallback: { items: [] } },\n )\n : Promise.resolve({ items: [] as Array<Record<string, unknown>> }),\n readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n `/api/staff/timesheets/time-entries?pageSize=100&staffMemberId=${memberId}&from=${dateRange.from}&to=${dateRange.to}`,\n undefined,\n { errorMessage: t('staff.timesheets.my.errors.load', 'Failed to load timesheets.'), fallback: { items: [] } },\n ),\n ])\n\n const projectItems = Array.isArray(projectsRes.items) ? projectsRes.items : []\n const mappedProjects = projectItems.map((item) => ({\n id: String(item.id ?? ''),\n name: String(item.name ?? ''),\n code: typeof item.code === 'string' ? item.code : null,\n color: typeof item.color === 'string' ? item.color : null,\n }))\n setAllAssignedProjects(mappedProjects)\n const visibleProjects = mappedProjects.filter((p) => visibleProjectIdSet.has(p.id))\n setProjects(visibleProjects)\n\n const entryItems = Array.isArray(entriesRes.items) ? entriesRes.items : []\n setRawEntries(entryItems)\n const map: EntryMap = {}\n for (const item of entryItems) {\n const projectId = String(item.time_project_id ?? item.timeProjectId ?? '')\n const rawDate = String(item.date ?? '')\n const dateKey = rawDate.slice(0, 10)\n const minutes = typeof item.duration_minutes === 'number'\n ? item.duration_minutes\n : typeof item.durationMinutes === 'number'\n ? item.durationMinutes\n : 0\n const entryId = String(item.id ?? '')\n if (!map[projectId]) map[projectId] = {}\n if (!map[projectId][dateKey]) map[projectId][dateKey] = []\n map[projectId][dateKey].push({ id: entryId || undefined, minutes })\n }\n setEntries(map)\n setDirty({})\n setRawText({})\n } catch (error) {\n console.error('staff.timesheets.my.load', error)\n flash(t('staff.timesheets.my.errors.load', 'Failed to load timesheets.'), 'error')\n } finally {\n isInitialLoadRef.current = false\n setIsInitialLoad(false)\n setIsRefreshing(false)\n }\n }, [dateRange.from, dateRange.to, t])\n\n React.useEffect(() => {\n void loadData()\n }, [loadData, scopeVersion])\n\n // --- Cell handlers ---\n const handleCellChange = React.useCallback((projectId: string, dateKey: string, value: string) => {\n // Only allow digits, dots, and commas (decimal separators)\n const sanitized = value.replace(/[^0-9.,]/g, '')\n setRawText((prev) => {\n const projectTexts = { ...(prev[projectId] ?? {}) }\n projectTexts[dateKey] = sanitized\n return { ...prev, [projectId]: projectTexts }\n })\n }, [])\n\n const handleCellBlur = React.useCallback((projectId: string, dateKey: string) => {\n const text = rawText[projectId]?.[dateKey]\n if (text === undefined) return\n const minutes = decimalToMinutes(text)\n const cellEntries = entries[projectId]?.[dateKey] ?? []\n const existingMinutes = cellEntries.reduce((sum, e) => sum + e.minutes, 0)\n\n // Only mark dirty if the value actually changed\n if (minutes !== existingMinutes || cellEntries.length > 0) {\n setDirty((prev) => {\n const projectEntries: Record<string, CellEntry> = { ...(prev[projectId] ?? {}) }\n const firstId = cellEntries[0]?.id\n projectEntries[dateKey] = { id: firstId, minutes }\n return { ...prev, [projectId]: projectEntries }\n })\n }\n setRawText((prev) => {\n const projectTexts = { ...(prev[projectId] ?? {}) }\n delete projectTexts[dateKey]\n const hasKeys = Object.keys(projectTexts).length > 0\n if (!hasKeys) {\n const next = { ...prev }\n delete next[projectId]\n return next\n }\n return { ...prev, [projectId]: projectTexts }\n })\n }, [rawText, entries])\n\n const getCellValue = React.useCallback((projectId: string, dateKey: string): number => {\n const dirtyCell = dirty[projectId]?.[dateKey] as CellEntry | undefined\n if (dirtyCell !== undefined) return dirtyCell.minutes\n const cellEntries = entries[projectId]?.[dateKey] ?? []\n return cellEntries.reduce((sum, e) => sum + e.minutes, 0)\n }, [dirty, entries])\n\n // --- Save ---\n const hasChanges = Object.keys(dirty).length > 0 || Object.keys(rawText).length > 0\n\n const handleSave = React.useCallback(async () => {\n if (!hasChanges) return\n const confirmed = await confirm({\n title: t('staff.timesheets.my.confirm_save.title', 'Save changes?'),\n text: t('staff.timesheets.my.confirm_save.body', 'Your timesheet entries will be saved.'),\n })\n if (!confirmed) return\n\n setIsSaving(true)\n try {\n const bulkEntries: Array<{ id?: string; date: string; timeProjectId: string; durationMinutes: number }> = []\n for (const [projectId, dateMap] of Object.entries(dirty)) {\n for (const [dateKey, cellValue] of Object.entries(dateMap)) {\n const cell = cellValue as CellEntry\n const cellEntries = entries[projectId]?.[dateKey] ?? []\n const firstId = cell.id ?? cellEntries[0]?.id\n bulkEntries.push({ id: firstId, date: dateKey, timeProjectId: projectId, durationMinutes: cell.minutes })\n }\n }\n if (bulkEntries.length === 0) return\n\n const payload = { entries: bulkEntries }\n await runMutation({\n operation: () =>\n apiCallOrThrow('/api/staff/timesheets/time-entries/bulk', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n context: {\n formId: mutationContextId,\n resourceKind: 'staff.timesheets.time_entry',\n resourceId: staffMemberId ?? undefined,\n staffMemberId,\n retryLastMutation,\n },\n mutationPayload: payload as unknown as Record<string, unknown>,\n })\n\n flash(t('staff.timesheets.my.saved', 'Timesheet saved.'), 'success')\n await loadData()\n } catch (error) {\n console.error('staff.timesheets.my.save', error)\n flash(t('staff.timesheets.my.errors.save', 'Failed to save timesheets.'), 'error')\n } finally {\n setIsSaving(false)\n }\n }, [dirty, entries, hasChanges, confirm, t, loadData, runMutation, mutationContextId, staffMemberId, retryLastMutation])\n\n // --- Totals ---\n const getRowTotal = React.useCallback((projectId: string): number => {\n let total = 0\n for (const day of visibleDays) {\n total += getCellValue(projectId, formatDateKey(day))\n }\n return total\n }, [visibleDays, getCellValue])\n\n const getDayTotal = React.useCallback((date: Date): number => {\n const dateKey = formatDateKey(date)\n let total = 0\n for (const project of projects) {\n total += getCellValue(project.id, dateKey)\n }\n return total\n }, [projects, getCellValue])\n\n const grandTotal = React.useMemo(() => {\n let total = 0\n for (const project of projects) {\n total += getRowTotal(project.id)\n }\n return total\n }, [projects, getRowTotal])\n\n const workingDays = React.useMemo(() => {\n let count = 0\n for (const day of visibleDays) {\n if (!isWeekendDay(day)) {\n const dateKey = formatDateKey(day)\n for (const project of projects) {\n if (getCellValue(project.id, dateKey) > 0) { count++; break }\n }\n }\n }\n return count\n }, [visibleDays, projects, getCellValue])\n\n const dailyAverage = React.useMemo(() => {\n if (workingDays === 0) return 0\n return grandTotal / workingDays\n }, [grandTotal, workingDays])\n\n // --- List view entries ---\n const listViewEntries = React.useMemo(() => {\n return rawEntries.map((item) => ({\n id: String(item.id ?? ''),\n date: String(item.date ?? '').slice(0, 10),\n durationMinutes: typeof item.duration_minutes === 'number' ? item.duration_minutes\n : typeof item.durationMinutes === 'number' ? item.durationMinutes : 0,\n projectId: String(item.time_project_id ?? item.timeProjectId ?? ''),\n projectName: projects.find((p) => p.id === String(item.time_project_id ?? item.timeProjectId ?? ''))?.name ?? '',\n projectCode: projects.find((p) => p.id === String(item.time_project_id ?? item.timeProjectId ?? ''))?.code ?? null,\n projectColor: projects.find((p) => p.id === String(item.time_project_id ?? item.timeProjectId ?? ''))?.color ?? null,\n notes: typeof item.notes === 'string' ? item.notes : null,\n source: typeof item.source === 'string' ? item.source : 'manual',\n startedAt: typeof item.started_at === 'string' ? item.started_at : typeof item.startedAt === 'string' ? item.startedAt : null,\n endedAt: typeof item.ended_at === 'string' ? item.ended_at : typeof item.endedAt === 'string' ? item.endedAt : null,\n }))\n }, [rawEntries, projects])\n\n // --- Handle view mode change ---\n const handleViewModeChange = React.useCallback((mode: ViewMode) => {\n setViewMode(mode)\n if (mode === 'monthly') {\n // Use Thursday of the week to determine month (handles cross-month weeks)\n const thursday = new Date(weekStart)\n thursday.setDate(thursday.getDate() + 3)\n setMonthYear(thursday.getFullYear())\n setMonthIndex(thursday.getMonth())\n } else {\n // Find the Monday of the week containing the 15th (mid-month, always stable)\n const midMonth = new Date(monthYear, monthIndex, 15)\n setWeekStart(getMonday(midMonth))\n }\n }, [weekStart, monthYear, monthIndex])\n\n // --- Add row handler ---\n const visibleProjectIds = React.useMemo(() => new Set(projects.map((p) => p.id)), [projects])\n\n const handleAddProject = React.useCallback(async (project: ProjectRow) => {\n try {\n const payload = { showInGrid: true }\n await runMutation({\n operation: () =>\n apiCallOrThrow(`/api/staff/timesheets/my-projects/${project.id}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n context: {\n formId: mutationContextId,\n resourceKind: 'staff.timesheets.time_project_member',\n resourceId: project.id,\n staffMemberId,\n retryLastMutation,\n },\n mutationPayload: payload,\n })\n setProjects((prev) => {\n if (prev.some((p) => p.id === project.id)) return prev\n return [...prev, project]\n })\n } catch (error) {\n console.error('staff.timesheets.my.addRow', error)\n flash(t('staff.timesheets.my.addRow.error', 'Could not add the project. Please try again.'), 'error')\n }\n }, [t, runMutation, mutationContextId, staffMemberId, retryLastMutation])\n\n const handleRemoveProject = React.useCallback(async (project: ProjectRow) => {\n const confirmed = await confirm({\n title: t('staff.timesheets.my.removeRow', 'Remove from grid'),\n text: t(\n 'staff.timesheets.my.removeRow.confirm',\n 'Remove {projectName} from your timesheet grid? You can re-add it anytime via \"+ Add row\".',\n ).replace('{projectName}', project.name),\n })\n if (!confirmed) return\n\n try {\n const payload = { showInGrid: false }\n await runMutation({\n operation: () =>\n apiCallOrThrow(`/api/staff/timesheets/my-projects/${project.id}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n context: {\n formId: mutationContextId,\n resourceKind: 'staff.timesheets.time_project_member',\n resourceId: project.id,\n staffMemberId,\n retryLastMutation,\n },\n mutationPayload: payload,\n })\n setProjects((prev) => prev.filter((p) => p.id !== project.id))\n setDirty((prev) => {\n if (!prev[project.id]) return prev\n const next = { ...prev }\n delete next[project.id]\n return next\n })\n setRawText((prev) => {\n if (!prev[project.id]) return prev\n const next = { ...prev }\n delete next[project.id]\n return next\n })\n } catch (error) {\n console.error('staff.timesheets.my.removeRow', error)\n flash(t('staff.timesheets.my.removeRow.error', 'Could not remove the project. Please try again.'), 'error')\n }\n }, [confirm, t, runMutation, mutationContextId, staffMemberId, retryLastMutation])\n\n const handleProjectCreated = React.useCallback(async (project: { id: string; name: string; code: string | null }) => {\n setAllAssignedProjects((prev) => [...prev, project])\n // New projects start hidden; immediately opt them into the grid for the creator.\n try {\n const payload = { showInGrid: true }\n await runMutation({\n operation: () =>\n apiCallOrThrow(`/api/staff/timesheets/my-projects/${project.id}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n context: {\n formId: mutationContextId,\n resourceKind: 'staff.timesheets.time_project_member',\n resourceId: project.id,\n staffMemberId,\n retryLastMutation,\n },\n mutationPayload: payload,\n })\n } catch (error) {\n console.error('staff.timesheets.my.createProject.visibility', error)\n }\n setProjects((prev) => [...prev, project])\n setCreateDialogOpen(false)\n }, [runMutation, mutationContextId, staffMemberId, retryLastMutation])\n\n // --- Loading ---\n if (isInitialLoad) {\n return <Page><PageBody><LoadingMessage label={t('staff.timesheets.my.loading', 'Loading timesheets...')} /></PageBody></Page>\n }\n\n // --- No profile ---\n if (staffMemberMissing) {\n return (\n <Page>\n <PageBody>\n <div className=\"py-12 text-center\">\n <p className=\"text-lg font-semibold mb-2\">\n {t('staff.timesheets.my.noProfile.title', 'Set up your profile to start tracking time')}\n </p>\n <p className=\"text-sm text-muted-foreground mb-6\">\n {t('staff.timesheets.my.noProfile', 'You need a Team Member profile to track time.')}\n </p>\n <Button asChild>\n <Link href=\"/backend/staff/profile/create\">\n {t('staff.timesheets.my.createProfile', 'Create My Profile')}\n </Link>\n </Button>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n {/* Timer bar */}\n <TimerBar\n projects={allAssignedProjects}\n staffMemberId={staffMemberId}\n onTimerStopped={loadData}\n />\n\n {/* Summary cards */}\n <div className=\"mb-4 grid grid-cols-1 gap-4 sm:grid-cols-4\">\n <div className=\"rounded-lg border bg-card p-4\">\n <p className=\"text-sm text-muted-foreground\">\n {viewMode === 'weekly'\n ? t('staff.timesheets.my.weekTotal', 'Week Total')\n : t('staff.timesheets.my.total_hours', 'Total Hours')}\n </p>\n <p className=\"text-2xl font-semibold\">{minutesToDecimal(grandTotal) || '0'}</p>\n </div>\n <div className=\"rounded-lg border bg-card p-4\">\n <p className=\"text-sm text-muted-foreground\">{t('staff.timesheets.my.working_days', 'Working Days')}</p>\n <p className=\"text-2xl font-semibold\">{workingDays}</p>\n </div>\n <div className=\"rounded-lg border bg-card p-4\">\n <p className=\"text-sm text-muted-foreground\">{t('staff.timesheets.my.daily_average', 'Daily Average')}</p>\n <p className=\"text-2xl font-semibold\">{minutesToDecimal(Math.round(dailyAverage)) || '0'}</p>\n </div>\n <div className=\"rounded-lg border bg-card p-4\">\n <p className=\"text-sm text-muted-foreground\">{t('staff.timesheets.my.status', 'Status')}</p>\n <p className=\"text-2xl font-semibold\">\n <span className=\"inline-flex items-center rounded-full bg-green-100 px-2.5 py-0.5 text-xs font-medium text-green-800\">\n {t('staff.timesheets.my.status_open', 'Open')}\n </span>\n </p>\n </div>\n </div>\n\n {/* Navigation + controls */}\n <div className=\"mb-4 flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"icon\" type=\"button\" onClick={goToPrev}>\n <ChevronLeft className=\"size-4\" />\n </Button>\n <span className=\"text-sm font-semibold min-w-[220px] text-center\">{navigationLabel}</span>\n <Button variant=\"outline\" size=\"icon\" type=\"button\" onClick={goToNext}>\n <ChevronRight className=\"size-4\" />\n </Button>\n {viewMode === 'weekly' && (\n <CalendarPicker selectedWeekStart={weekStart} onWeekSelect={setWeekStart} />\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <ViewSwitcher\n viewMode={viewMode}\n onViewModeChange={handleViewModeChange}\n viewType={viewType}\n onViewTypeChange={setViewType}\n />\n <div className=\"flex items-center gap-2\">\n {hasChanges && (\n <span className=\"text-xs text-amber-600 font-medium\">\n {t('staff.timesheets.my.unsaved', 'Unsaved changes')}\n </span>\n )}\n <Button size=\"sm\" type=\"button\" onClick={handleSave} disabled={!hasChanges || isSaving}>\n {isSaving ? t('staff.timesheets.my.saving', 'Saving...') : t('staff.timesheets.my.save_changes', 'Save Changes')}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Content: Grid or List */}\n <div className={isRefreshing ? 'opacity-50 pointer-events-none transition-opacity' : 'transition-opacity'}>\n {allAssignedProjects.length === 0 ? (\n <div className=\"py-12 text-center\">\n <p className=\"text-lg font-semibold mb-2\">\n {t('staff.timesheets.my.noProjects.title', 'No projects assigned yet')}\n </p>\n <p className=\"text-sm text-muted-foreground mb-6\">\n {canManageProjects\n ? t('staff.timesheets.my.noProjects.admin', 'Create a project and assign yourself to start tracking time.')\n : t('staff.timesheets.my.noProjects.employee', 'Ask your manager to assign you to a project.')}\n </p>\n <div className=\"flex items-center justify-center gap-3\">\n {canManageProjects && (\n <Button asChild>\n <Link href=\"/backend/staff/timesheets/projects/create\">\n {t('staff.timesheets.my.noProjects.createProject', 'Create Project')}\n </Link>\n </Button>\n )}\n <Button variant=\"outline\" asChild>\n <Link href=\"/backend/staff/timesheets/projects\">\n {t('staff.timesheets.my.noProjects.viewProjects', 'View Projects')}\n </Link>\n </Button>\n </div>\n </div>\n ) : viewType === 'list' ? (\n <ListView entries={listViewEntries} onEntryUpdated={loadData} />\n ) : (\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full text-sm table-fixed\">\n <colgroup>\n <col className={viewMode === 'weekly' ? 'w-[35%]' : 'w-[140px] min-w-[140px]'} />\n {visibleDays.map((date) => (\n <col key={formatDateKey(date)} className={viewMode === 'weekly' ? '' : 'w-[36px] min-w-[36px]'} />\n ))}\n <col className={viewMode === 'weekly' ? 'w-[72px]' : 'w-[56px] min-w-[56px]'} />\n </colgroup>\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"sticky left-0 z-10 bg-muted px-3 py-2 text-left font-medium\">\n {t('staff.timesheets.my.project', 'Project')}\n </th>\n {visibleDays.map((date) => {\n const dayName = getLocalizedDayName(date)\n const weekend = isWeekendDay(date)\n return (\n <th\n key={formatDateKey(date)}\n className={`py-2 text-center font-medium px-1 ${weekend ? 'bg-muted/80 text-muted-foreground' : ''}`}\n >\n <div className=\"text-[10px] uppercase text-muted-foreground\">{dayName}</div>\n <div className=\"text-xs\">{date.getDate()}</div>\n </th>\n )\n })}\n <th className=\"px-3 py-2 text-right font-medium\">\n {t('staff.timesheets.my.total', 'Total')}\n </th>\n </tr>\n </thead>\n <tbody>\n {projects.map((project) => (\n <tr key={project.id} className=\"group border-b hover:bg-muted/30\">\n <td className=\"sticky left-0 z-10 bg-background px-3 py-1.5 font-medium text-foreground\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 truncate\" title={project.name}>\n <ProjectColorDot colorKey={project.color} projectName={project.name} size=\"sm\" />\n <span className=\"truncate\">{project.name}</span>\n </div>\n {project.code && (\n <div className=\"text-[10px] text-muted-foreground\">{project.code}</div>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => { void handleRemoveProject(project) }}\n aria-label={t('staff.timesheets.my.removeRow', 'Remove from grid')}\n title={t('staff.timesheets.my.removeRow', 'Remove from grid')}\n className=\"opacity-0 group-hover:opacity-100 focus:opacity-100 inline-flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground transition-opacity\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </td>\n {visibleDays.map((date) => {\n const dateKey = formatDateKey(date)\n const weekend = isWeekendDay(date)\n const cellMinutes = getCellValue(project.id, dateKey)\n const isDirty = dirty[project.id]?.[dateKey] !== undefined\n return (\n <td key={dateKey} className={`px-0.5 py-0.5 ${weekend ? 'bg-muted/40' : ''}`}>\n {weekend ? (\n <div className=\"rounded px-1 py-1 text-center text-xs text-muted-foreground/50\">-</div>\n ) : (\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className={`mx-auto block rounded border text-center tabular-nums transition-colors\n ${viewMode === 'weekly' ? 'w-12 px-1 py-0.5 text-xs' : 'w-8 px-0 py-1 text-[10px]'}\n ${isDirty ? 'border-amber-400 bg-amber-50' : 'border-muted-foreground/20 bg-transparent'}\n ${cellMinutes > 0 ? 'font-semibold' : 'text-muted-foreground'}\n hover:border-muted-foreground/40 focus:border-primary focus:bg-background focus:outline-none`}\n value={rawText[project.id]?.[dateKey] ?? minutesToDecimal(cellMinutes)}\n onChange={(e) => handleCellChange(project.id, dateKey, e.target.value)}\n onBlur={() => handleCellBlur(project.id, dateKey)}\n placeholder={t('staff.timesheets.my.durationPlaceholder', '0')}\n />\n )}\n </td>\n )\n })}\n <td className=\"px-3 py-1.5 text-right font-semibold text-xs tabular-nums\">\n {minutesToDecimal(getRowTotal(project.id)) || '0'}\n </td>\n </tr>\n ))}\n <tr className=\"border-b\">\n <td colSpan={visibleDays.length + 2} className=\"sticky left-0 bg-background px-1 py-0.5\">\n <AddRowDropdown\n assignedProjects={allAssignedProjects}\n visibleProjectIds={visibleProjectIds}\n canCreateProject={canManageProjects}\n onAddProject={handleAddProject}\n onCreateProject={() => setCreateDialogOpen(true)}\n />\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr className=\"border-t bg-muted/50 font-semibold\">\n <td className=\"sticky left-0 z-10 bg-muted px-3 py-2\">\n {t('staff.timesheets.my.daily_total', 'Daily Total')}\n </td>\n {visibleDays.map((date) => {\n const weekend = isWeekendDay(date)\n const dayMinutes = getDayTotal(date)\n return (\n <td key={formatDateKey(date)} className={`py-2 text-center text-xs tabular-nums ${weekend ? 'text-muted-foreground/50' : ''}`}>\n {weekend ? '-' : (minutesToDecimal(dayMinutes) || '-')}\n </td>\n )\n })}\n <td className=\"px-3 py-2 text-right tabular-nums font-semibold\">{minutesToDecimal(grandTotal) || '0'}</td>\n </tr>\n </tfoot>\n </table>\n </div>\n )}\n </div>\n </PageBody>\n {ConfirmDialogElement}\n <CreateProjectDialog\n open={createDialogOpen}\n onOpenChange={setCreateDialogOpen}\n onProjectCreated={handleProjectCreated}\n />\n </Page>\n )\n}\n"],
5
+ "mappings": ";AA8nB2B,cAQjB,YARiB;AA5nB3B,YAAY,WAAW;AACvB,SAAS,MAAM,gBAAgB;AAC/B,SAAS,cAAc;AACvB,SAAS,SAAS,gBAAgB,4BAA4B;AAC9D,SAAS,0BAA0B;AACnC,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mCAAmC;AAC5C,SAAS,YAAY;AACrB,SAAS,aAAa,cAAc,SAAS;AAC7C,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAgBhC,SAAS,UAAU,MAAkB;AACnC,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,QAAM,MAAM,EAAE,OAAO;AACrB,QAAM,OAAO,QAAQ,IAAI,KAAK,IAAI;AAClC,IAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI;AAC5B,IAAE,SAAS,GAAG,GAAG,GAAG,CAAC;AACrB,SAAO;AACT;AAEA,SAAS,UAAU,QAAoB;AACrC,QAAM,IAAI,IAAI,KAAK,MAAM;AACzB,IAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,SAAO;AACT;AAEA,SAAS,cAAc,MAAoB;AACzC,QAAM,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC,CAAC;AAChF,IAAE,WAAW,EAAE,WAAW,IAAI,KAAK,EAAE,UAAU,KAAK,EAAE;AACtD,QAAM,YAAY,IAAI,KAAK,KAAK,IAAI,EAAE,eAAe,GAAG,GAAG,CAAC,CAAC;AAC7D,SAAO,KAAK,OAAO,EAAE,QAAQ,IAAI,UAAU,QAAQ,KAAK,QAAW,KAAK,CAAC;AAC3E;AAEA,SAAS,cAAc,MAAoB;AACzC,QAAM,IAAI,KAAK,YAAY;AAC3B,QAAM,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB;AAEA,SAAS,uBAAuB,MAAc,OAAe,KAAqB;AAChF,QAAM,IAAI,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC3C,QAAM,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG;AACrC,SAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;AAC1B;AAEA,SAAS,eAAe,MAAc,OAAuB;AAC3D,SAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ;AAC9C;AAEA,SAAS,aAAa,MAAqB;AACzC,QAAM,IAAI,KAAK,OAAO;AACtB,SAAO,MAAM,KAAK,MAAM;AAC1B;AAEA,SAAS,iBAAiB,SAAyB;AACjD,MAAI,YAAY,EAAG,QAAO;AAC1B,QAAM,QAAQ,UAAU;AACxB,SAAO,QAAQ,MAAM,IAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAChG;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,WAAW,OAAO;AAC9B,MAAI,MAAM,GAAG,KAAK,MAAM,EAAG,QAAO;AAClC,SAAO,KAAK,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,IAAI;AAC5C;AAEA,SAAS,oBAAoB,MAAoB;AAC/C,SAAO,KAAK,mBAAmB,QAAW,EAAE,SAAS,QAAQ,CAAC;AAChE;AAIA,SAAS,YAAY,WAAyB;AAC5C,SAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM;AACzC,UAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,MAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,aAAa,MAAc,OAAuB;AACzD,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC;AAC7E;AAIA,SAAS,gBAAgB,WAAyB;AAChD,QAAM,UAAU,UAAU,SAAS;AACnC,QAAM,UAAU,cAAc,SAAS;AACvC,QAAM,WAAW,UAAU,QAAQ;AACnC,QAAM,SAAS,QAAQ,QAAQ;AAC/B,QAAM,aAAa,UAAU,eAAe,QAAW,EAAE,OAAO,QAAQ,CAAC;AACzE,QAAM,WAAW,QAAQ,eAAe,QAAW,EAAE,OAAO,QAAQ,CAAC;AACrE,QAAM,OAAO,UAAU,YAAY;AAEnC,QAAM,YAAY,UAAU,SAAS,MAAM,QAAQ,SAAS,IACxD,GAAG,QAAQ,MAAM,MAAM,IAAI,UAAU,IAAI,IAAI,KAC7C,GAAG,QAAQ,IAAI,UAAU,MAAM,MAAM,IAAI,QAAQ,IAAI,IAAI;AAE7D,SAAO,GAAG,SAAS,UAAY,OAAO;AACxC;AAEA,SAAS,iBAAiB,MAAc,OAAuB;AAC7D,QAAM,OAAO,IAAI,KAAK,MAAM,OAAO,CAAC;AACpC,SAAO,KAAK,eAAe,QAAW,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAC1E;AAIe,SAAR,mBAAoC;AACzC,QAAM,IAAI,KAAK;AACf,QAAM,eAAe,4BAA4B;AACjD,QAAM,EAAE,SAAS,qBAAqB,IAAI,iBAAiB;AAE3D,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAmB,QAAQ;AACjE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAmB,WAAW;AACpE,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAe,MAAM,UAAU,GAAG,CAAC;AAC3E,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,IAAI,YAAY,CAAC;AAClE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,IAAI,SAAS,CAAC;AAEjE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAuB,CAAC,CAAC;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAmB,CAAC,CAAC;AACzD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAyB,CAAC,CAAC;AACrE,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAmB,CAAC,CAAC;AACrD,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAqB,CAAC,CAAC;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAwB,IAAI;AAC5E,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,KAAK;AACxE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,IAAI;AAC7D,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AACpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,KAAK;AACtE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,KAAK;AACpE,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,SAAuB,CAAC,CAAC;AAErF,QAAM,oBAAoB,MAAM;AAAA,IAC9B,MAAO,gBAAgB,oBAAoB,aAAa,KAAK;AAAA,IAC7D,CAAC,aAAa;AAAA,EAChB;AACA,QAAM,EAAE,aAAa,kBAAkB,IAAI,mBAMxC;AAAA,IACD,WAAW;AAAA,IACX,gBAAgB,EAAE,8BAA8B,4BAA4B;AAAA,EAC9E,CAAC;AAGD,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,MAAM,MAAM,QAA4C,2BAA2B;AAAA,UACvF,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC,kCAAkC,EAAE,CAAC;AAAA,QACzE,CAAC;AACD,YAAI,CAAC,WAAW;AACd,+BAAqB,IAAI,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC,EAAE,IAAI,kCAAkC,CAAC;AAAA,QACjG;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAK;AAAA,EAClC,GAAG,CAAC,CAAC;AAGL,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,QAAI,aAAa,SAAU,QAAO,YAAY,SAAS;AACvD,WAAO,aAAa,WAAW,UAAU;AAAA,EAC3C,GAAG,CAAC,UAAU,WAAW,WAAW,UAAU,CAAC;AAE/C,QAAM,YAAY,MAAM,QAAQ,MAAM;AACpC,QAAI,aAAa,UAAU;AACzB,aAAO,EAAE,MAAM,cAAc,SAAS,GAAG,IAAI,cAAc,UAAU,SAAS,CAAC,EAAE;AAAA,IACnF;AACA,UAAM,cAAc,eAAe,WAAW,UAAU;AACxD,WAAO;AAAA,MACL,MAAM,uBAAuB,WAAW,YAAY,CAAC;AAAA,MACrD,IAAI,uBAAuB,WAAW,YAAY,WAAW;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,UAAU,WAAW,WAAW,UAAU,CAAC;AAG/C,QAAM,WAAW,MAAM,YAAY,MAAM;AACvC,QAAI,aAAa,UAAU;AACzB,mBAAa,CAAC,SAAS;AACrB,cAAM,IAAI,IAAI,KAAK,IAAI;AACvB,UAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AACL,oBAAc,CAAC,SAAS;AACtB,YAAI,SAAS,GAAG;AAAE,uBAAa,CAAC,MAAM,IAAI,CAAC;AAAG,iBAAO;AAAA,QAAG;AACxD,eAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,WAAW,MAAM,YAAY,MAAM;AACvC,QAAI,aAAa,UAAU;AACzB,mBAAa,CAAC,SAAS;AACrB,cAAM,IAAI,IAAI,KAAK,IAAI;AACvB,UAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AACL,oBAAc,CAAC,SAAS;AACtB,YAAI,SAAS,IAAI;AAAE,uBAAa,CAAC,MAAM,IAAI,CAAC;AAAG,iBAAO;AAAA,QAAE;AACxD,eAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAkB,MAAM,QAAQ,MAAM;AAC1C,QAAI,aAAa,SAAU,QAAO,gBAAgB,SAAS;AAC3D,WAAO,iBAAiB,WAAW,UAAU;AAAA,EAC/C,GAAG,CAAC,UAAU,WAAW,WAAW,UAAU,CAAC;AAG/C,QAAM,mBAAmB,MAAM,OAAO,IAAI;AAE1C,QAAM,WAAW,MAAM,YAAY,YAAY;AAC7C,QAAI,CAAC,iBAAiB,QAAS,iBAAgB,IAAI;AACnD,QAAI;AACF,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA,EAAE,cAAc,EAAE,mCAAmC,4BAA4B,GAAG,UAAU,EAAE,QAAQ,KAAK,EAAE;AAAA,MACjH;AACA,YAAM,WAAW,QAAQ,QAAQ,MAAM;AACvC,uBAAiB,QAAQ;AACzB,UAAI,CAAC,UAAU;AACb,8BAAsB,IAAI;AAC1B,oBAAY,CAAC,CAAC;AACd,mBAAW,CAAC,CAAC;AACb,sBAAc,CAAC,CAAC;AAChB,yBAAiB,KAAK;AACtB,wBAAgB,KAAK;AACrB;AAAA,MACF;AACA,4BAAsB,KAAK;AAE3B,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,EAAE,cAAc,EAAE,mCAAmC,4BAA4B,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC9G;AACA,YAAM,kBAAkB,MAAM,QAAQ,eAAe,KAAK,IAAI,eAAe,QAAQ,CAAC;AACtF,YAAM,qBAAqB,gBACxB,IAAI,CAAC,SAAS,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE,CAAC,EACtE,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;AAC/B,YAAM,sBAAsB,IAAI;AAAA,QAC9B,gBACG,OAAO,CAAC,SAAS,KAAK,iBAAiB,QAAQ,KAAK,eAAe,IAAI,EACvE,IAAI,CAAC,SAAS,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE,CAAC,EACtE,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;AAAA,MACjC;AAEA,YAAM,CAAC,aAAa,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClD,mBAAmB,SAAS,IACxB;AAAA,UACE,2CAA2C,mBAAmB,KAAK,GAAG,CAAC;AAAA,UACvE;AAAA,UACA,EAAE,cAAc,EAAE,mCAAmC,4BAA4B,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,QAC9G,IACA,QAAQ,QAAQ,EAAE,OAAO,CAAC,EAAoC,CAAC;AAAA,QACnE;AAAA,UACE,iEAAiE,QAAQ,SAAS,UAAU,IAAI,OAAO,UAAU,EAAE;AAAA,UACnH;AAAA,UACA,EAAE,cAAc,EAAE,mCAAmC,4BAA4B,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,QAC9G;AAAA,MACF,CAAC;AAED,YAAM,eAAe,MAAM,QAAQ,YAAY,KAAK,IAAI,YAAY,QAAQ,CAAC;AAC7E,YAAM,iBAAiB,aAAa,IAAI,CAAC,UAAU;AAAA,QACjD,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,QACxB,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,QAC5B,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,QAClD,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACvD,EAAE;AACF,6BAAuB,cAAc;AACrC,YAAM,kBAAkB,eAAe,OAAO,CAAC,MAAM,oBAAoB,IAAI,EAAE,EAAE,CAAC;AAClF,kBAAY,eAAe;AAE3B,YAAM,aAAa,MAAM,QAAQ,WAAW,KAAK,IAAI,WAAW,QAAQ,CAAC;AACzE,oBAAc,UAAU;AACxB,YAAM,MAAgB,CAAC;AACvB,iBAAW,QAAQ,YAAY;AAC7B,cAAM,YAAY,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE;AACzE,cAAM,UAAU,OAAO,KAAK,QAAQ,EAAE;AACtC,cAAM,UAAU,QAAQ,MAAM,GAAG,EAAE;AACnC,cAAM,UAAU,OAAO,KAAK,qBAAqB,WAC7C,KAAK,mBACL,OAAO,KAAK,oBAAoB,WAC9B,KAAK,kBACL;AACN,cAAM,UAAU,OAAO,KAAK,MAAM,EAAE;AACpC,YAAI,CAAC,IAAI,SAAS,EAAG,KAAI,SAAS,IAAI,CAAC;AACvC,YAAI,CAAC,IAAI,SAAS,EAAE,OAAO,EAAG,KAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AACzD,YAAI,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,WAAW,QAAW,QAAQ,CAAC;AAAA,MACpE;AACA,iBAAW,GAAG;AACd,eAAS,CAAC,CAAC;AACX,iBAAW,CAAC,CAAC;AAAA,IACf,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C,YAAM,EAAE,mCAAmC,4BAA4B,GAAG,OAAO;AAAA,IACnF,UAAE;AACA,uBAAiB,UAAU;AAC3B,uBAAiB,KAAK;AACtB,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,UAAU,IAAI,CAAC,CAAC;AAEpC,QAAM,UAAU,MAAM;AACpB,SAAK,SAAS;AAAA,EAChB,GAAG,CAAC,UAAU,YAAY,CAAC;AAG3B,QAAM,mBAAmB,MAAM,YAAY,CAAC,WAAmB,SAAiB,UAAkB;AAEhG,UAAM,YAAY,MAAM,QAAQ,aAAa,EAAE;AAC/C,eAAW,CAAC,SAAS;AACnB,YAAM,eAAe,EAAE,GAAI,KAAK,SAAS,KAAK,CAAC,EAAG;AAClD,mBAAa,OAAO,IAAI;AACxB,aAAO,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,aAAa;AAAA,IAC9C,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,MAAM,YAAY,CAAC,WAAmB,YAAoB;AAC/E,UAAM,OAAO,QAAQ,SAAS,IAAI,OAAO;AACzC,QAAI,SAAS,OAAW;AACxB,UAAM,UAAU,iBAAiB,IAAI;AACrC,UAAM,cAAc,QAAQ,SAAS,IAAI,OAAO,KAAK,CAAC;AACtD,UAAM,kBAAkB,YAAY,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAGzE,QAAI,YAAY,mBAAmB,YAAY,SAAS,GAAG;AACzD,eAAS,CAAC,SAAS;AACjB,cAAM,iBAA4C,EAAE,GAAI,KAAK,SAAS,KAAK,CAAC,EAAG;AAC/E,cAAM,UAAU,YAAY,CAAC,GAAG;AAChC,uBAAe,OAAO,IAAI,EAAE,IAAI,SAAS,QAAQ;AACjD,eAAO,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,eAAe;AAAA,MAChD,CAAC;AAAA,IACH;AACA,eAAW,CAAC,SAAS;AACnB,YAAM,eAAe,EAAE,GAAI,KAAK,SAAS,KAAK,CAAC,EAAG;AAClD,aAAO,aAAa,OAAO;AAC3B,YAAM,UAAU,OAAO,KAAK,YAAY,EAAE,SAAS;AACnD,UAAI,CAAC,SAAS;AACZ,cAAM,OAAO,EAAE,GAAG,KAAK;AACvB,eAAO,KAAK,SAAS;AACrB,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,aAAa;AAAA,IAC9C,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,OAAO,CAAC;AAErB,QAAM,eAAe,MAAM,YAAY,CAAC,WAAmB,YAA4B;AACrF,UAAM,YAAY,MAAM,SAAS,IAAI,OAAO;AAC5C,QAAI,cAAc,OAAW,QAAO,UAAU;AAC9C,UAAM,cAAc,QAAQ,SAAS,IAAI,OAAO,KAAK,CAAC;AACtD,WAAO,YAAY,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAAA,EAC1D,GAAG,CAAC,OAAO,OAAO,CAAC;AAGnB,QAAM,aAAa,OAAO,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO,KAAK,OAAO,EAAE,SAAS;AAElF,QAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,QAAI,CAAC,WAAY;AACjB,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,OAAO,EAAE,0CAA0C,eAAe;AAAA,MAClE,MAAM,EAAE,yCAAyC,uCAAuC;AAAA,IAC1F,CAAC;AACD,QAAI,CAAC,UAAW;AAEhB,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,cAAoG,CAAC;AAC3G,iBAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,mBAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC1D,gBAAM,OAAO;AACb,gBAAM,cAAc,QAAQ,SAAS,IAAI,OAAO,KAAK,CAAC;AACtD,gBAAM,UAAU,KAAK,MAAM,YAAY,CAAC,GAAG;AAC3C,sBAAY,KAAK,EAAE,IAAI,SAAS,MAAM,SAAS,eAAe,WAAW,iBAAiB,KAAK,QAAQ,CAAC;AAAA,QAC1G;AAAA,MACF;AACA,UAAI,YAAY,WAAW,EAAG;AAE9B,YAAM,UAAU,EAAE,SAAS,YAAY;AACvC,YAAM,YAAY;AAAA,QAChB,WAAW,MACT,eAAe,2CAA2C;AAAA,UACxD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,QAC9B,CAAC;AAAA,QACH,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY,iBAAiB;AAAA,UAC7B;AAAA,UACA;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AAED,YAAM,EAAE,6BAA6B,kBAAkB,GAAG,SAAS;AACnE,YAAM,SAAS;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C,YAAM,EAAE,mCAAmC,4BAA4B,GAAG,OAAO;AAAA,IACnF,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,YAAY,SAAS,GAAG,UAAU,aAAa,mBAAmB,eAAe,iBAAiB,CAAC;AAGvH,QAAM,cAAc,MAAM,YAAY,CAAC,cAA8B;AACnE,QAAI,QAAQ;AACZ,eAAW,OAAO,aAAa;AAC7B,eAAS,aAAa,WAAW,cAAc,GAAG,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,YAAY,CAAC;AAE9B,QAAM,cAAc,MAAM,YAAY,CAAC,SAAuB;AAC5D,UAAM,UAAU,cAAc,IAAI;AAClC,QAAI,QAAQ;AACZ,eAAW,WAAW,UAAU;AAC9B,eAAS,aAAa,QAAQ,IAAI,OAAO;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,YAAY,CAAC;AAE3B,QAAM,aAAa,MAAM,QAAQ,MAAM;AACrC,QAAI,QAAQ;AACZ,eAAW,WAAW,UAAU;AAC9B,eAAS,YAAY,QAAQ,EAAE;AAAA,IACjC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,QAAI,QAAQ;AACZ,eAAW,OAAO,aAAa;AAC7B,UAAI,CAAC,aAAa,GAAG,GAAG;AACtB,cAAM,UAAU,cAAc,GAAG;AACjC,mBAAW,WAAW,UAAU;AAC9B,cAAI,aAAa,QAAQ,IAAI,OAAO,IAAI,GAAG;AAAE;AAAS;AAAA,UAAM;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,UAAU,YAAY,CAAC;AAExC,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,gBAAgB,EAAG,QAAO;AAC9B,WAAO,aAAa;AAAA,EACtB,GAAG,CAAC,YAAY,WAAW,CAAC;AAG5B,QAAM,kBAAkB,MAAM,QAAQ,MAAM;AAC1C,WAAO,WAAW,IAAI,CAAC,UAAU;AAAA,MAC/B,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,MACxB,MAAM,OAAO,KAAK,QAAQ,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,MACzC,iBAAiB,OAAO,KAAK,qBAAqB,WAAW,KAAK,mBAC9D,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,MACtE,WAAW,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE;AAAA,MAClE,aAAa,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE,CAAC,GAAG,QAAQ;AAAA,MAC9G,aAAa,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE,CAAC,GAAG,QAAQ;AAAA,MAC9G,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE,CAAC,GAAG,SAAS;AAAA,MAChH,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACrD,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,MACxD,WAAW,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,MACzH,SAAS,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,IACjH,EAAE;AAAA,EACJ,GAAG,CAAC,YAAY,QAAQ,CAAC;AAGzB,QAAM,uBAAuB,MAAM,YAAY,CAAC,SAAmB;AACjE,gBAAY,IAAI;AAChB,QAAI,SAAS,WAAW;AAEtB,YAAM,WAAW,IAAI,KAAK,SAAS;AACnC,eAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACvC,mBAAa,SAAS,YAAY,CAAC;AACnC,oBAAc,SAAS,SAAS,CAAC;AAAA,IACnC,OAAO;AAEL,YAAM,WAAW,IAAI,KAAK,WAAW,YAAY,EAAE;AACnD,mBAAa,UAAU,QAAQ,CAAC;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,UAAU,CAAC;AAGrC,QAAM,oBAAoB,MAAM,QAAQ,MAAM,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE5F,QAAM,mBAAmB,MAAM,YAAY,OAAO,YAAwB;AACxE,QAAI;AACF,YAAM,UAAU,EAAE,YAAY,KAAK;AACnC,YAAM,YAAY;AAAA,QAChB,WAAW,MACT,eAAe,qCAAqC,QAAQ,EAAE,IAAI;AAAA,UAChE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,QAC9B,CAAC;AAAA,QACH,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY,QAAQ;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,kBAAY,CAAC,SAAS;AACpB,YAAI,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,EAAG,QAAO;AAClD,eAAO,CAAC,GAAG,MAAM,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,YAAM,EAAE,oCAAoC,8CAA8C,GAAG,OAAO;AAAA,IACtG;AAAA,EACF,GAAG,CAAC,GAAG,aAAa,mBAAmB,eAAe,iBAAiB,CAAC;AAExE,QAAM,sBAAsB,MAAM,YAAY,OAAO,YAAwB;AAC3E,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,OAAO,EAAE,iCAAiC,kBAAkB;AAAA,MAC5D,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF,EAAE,QAAQ,iBAAiB,QAAQ,IAAI;AAAA,IACzC,CAAC;AACD,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,UAAU,EAAE,YAAY,MAAM;AACpC,YAAM,YAAY;AAAA,QAChB,WAAW,MACT,eAAe,qCAAqC,QAAQ,EAAE,IAAI;AAAA,UAChE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,QAC9B,CAAC;AAAA,QACH,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY,QAAQ;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,kBAAY,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,CAAC;AAC7D,eAAS,CAAC,SAAS;AACjB,YAAI,CAAC,KAAK,QAAQ,EAAE,EAAG,QAAO;AAC9B,cAAM,OAAO,EAAE,GAAG,KAAK;AACvB,eAAO,KAAK,QAAQ,EAAE;AACtB,eAAO;AAAA,MACT,CAAC;AACD,iBAAW,CAAC,SAAS;AACnB,YAAI,CAAC,KAAK,QAAQ,EAAE,EAAG,QAAO;AAC9B,cAAM,OAAO,EAAE,GAAG,KAAK;AACvB,eAAO,KAAK,QAAQ,EAAE;AACtB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,YAAM,EAAE,uCAAuC,iDAAiD,GAAG,OAAO;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,SAAS,GAAG,aAAa,mBAAmB,eAAe,iBAAiB,CAAC;AAEjF,QAAM,uBAAuB,MAAM,YAAY,OAAO,YAA+D;AACnH,2BAAuB,CAAC,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC;AAEnD,QAAI;AACF,YAAM,UAAU,EAAE,YAAY,KAAK;AACnC,YAAM,YAAY;AAAA,QAChB,WAAW,MACT,eAAe,qCAAqC,QAAQ,EAAE,IAAI;AAAA,UAChE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,QAC9B,CAAC;AAAA,QACH,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY,QAAQ;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,gDAAgD,KAAK;AAAA,IACrE;AACA,gBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC;AACxC,wBAAoB,KAAK;AAAA,EAC3B,GAAG,CAAC,aAAa,mBAAmB,eAAe,iBAAiB,CAAC;AAGrE,MAAI,eAAe;AACjB,WAAO,oBAAC,QAAK,8BAAC,YAAS,8BAAC,kBAAe,OAAO,EAAE,+BAA+B,uBAAuB,GAAG,GAAE,GAAW;AAAA,EACxH;AAGA,MAAI,oBAAoB;AACtB,WACE,oBAAC,QACC,8BAAC,YACC,+BAAC,SAAI,WAAU,qBACb;AAAA,0BAAC,OAAE,WAAU,8BACV,YAAE,uCAAuC,4CAA4C,GACxF;AAAA,MACA,oBAAC,OAAE,WAAU,sCACV,YAAE,iCAAiC,+CAA+C,GACrF;AAAA,MACA,oBAAC,UAAO,SAAO,MACb,8BAAC,QAAK,MAAK,iCACR,YAAE,qCAAqC,mBAAmB,GAC7D,GACF;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,QACC;AAAA,yBAAC,YAEC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU;AAAA,UACV;AAAA,UACA,gBAAgB;AAAA;AAAA,MAClB;AAAA,MAGA,qBAAC,SAAI,WAAU,8CACb;AAAA,6BAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,OAAE,WAAU,iCACV,uBAAa,WACV,EAAE,iCAAiC,YAAY,IAC/C,EAAE,mCAAmC,aAAa,GACxD;AAAA,UACA,oBAAC,OAAE,WAAU,0BAA0B,2BAAiB,UAAU,KAAK,KAAI;AAAA,WAC7E;AAAA,QACA,qBAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,OAAE,WAAU,iCAAiC,YAAE,oCAAoC,cAAc,GAAE;AAAA,UACpG,oBAAC,OAAE,WAAU,0BAA0B,uBAAY;AAAA,WACrD;AAAA,QACA,qBAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,OAAE,WAAU,iCAAiC,YAAE,qCAAqC,eAAe,GAAE;AAAA,UACtG,oBAAC,OAAE,WAAU,0BAA0B,2BAAiB,KAAK,MAAM,YAAY,CAAC,KAAK,KAAI;AAAA,WAC3F;AAAA,QACA,qBAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,OAAE,WAAU,iCAAiC,YAAE,8BAA8B,QAAQ,GAAE;AAAA,UACxF,oBAAC,OAAE,WAAU,0BACX,8BAAC,UAAK,WAAU,uGACb,YAAE,mCAAmC,MAAM,GAC9C,GACF;AAAA,WACF;AAAA,SACF;AAAA,MAGA,qBAAC,SAAI,WAAU,0DACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,UAAO,SAAQ,WAAU,MAAK,QAAO,MAAK,UAAS,SAAS,UAC3D,8BAAC,eAAY,WAAU,UAAS,GAClC;AAAA,UACA,oBAAC,UAAK,WAAU,mDAAmD,2BAAgB;AAAA,UACnF,oBAAC,UAAO,SAAQ,WAAU,MAAK,QAAO,MAAK,UAAS,SAAS,UAC3D,8BAAC,gBAAa,WAAU,UAAS,GACnC;AAAA,UACC,aAAa,YACZ,oBAAC,kBAAe,mBAAmB,WAAW,cAAc,cAAc;AAAA,WAE9E;AAAA,QAEA,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,kBAAkB;AAAA,cAClB;AAAA,cACA,kBAAkB;AAAA;AAAA,UACpB;AAAA,UACA,qBAAC,SAAI,WAAU,2BACZ;AAAA,0BACC,oBAAC,UAAK,WAAU,sCACb,YAAE,+BAA+B,iBAAiB,GACrD;AAAA,YAEF,oBAAC,UAAO,MAAK,MAAK,MAAK,UAAS,SAAS,YAAY,UAAU,CAAC,cAAc,UAC3E,qBAAW,EAAE,8BAA8B,WAAW,IAAI,EAAE,oCAAoC,cAAc,GACjH;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,MAGA,oBAAC,SAAI,WAAW,eAAe,sDAAsD,sBACpF,8BAAoB,WAAW,IAC9B,qBAAC,SAAI,WAAU,qBACb;AAAA,4BAAC,OAAE,WAAU,8BACV,YAAE,wCAAwC,0BAA0B,GACvE;AAAA,QACA,oBAAC,OAAE,WAAU,sCACV,8BACG,EAAE,wCAAwC,8DAA8D,IACxG,EAAE,2CAA2C,8CAA8C,GACjG;AAAA,QACA,qBAAC,SAAI,WAAU,0CACZ;AAAA,+BACC,oBAAC,UAAO,SAAO,MACb,8BAAC,QAAK,MAAK,6CACR,YAAE,gDAAgD,gBAAgB,GACrE,GACF;AAAA,UAEF,oBAAC,UAAO,SAAQ,WAAU,SAAO,MAC/B,8BAAC,QAAK,MAAK,sCACR,YAAE,+CAA+C,eAAe,GACnE,GACF;AAAA,WACF;AAAA,SACF,IACE,aAAa,SACf,oBAAC,YAAS,SAAS,iBAAiB,gBAAgB,UAAU,IAE9D,oBAAC,SAAI,WAAU,qCACb,+BAAC,WAAM,WAAU,8BACf;AAAA,6BAAC,cACC;AAAA,8BAAC,SAAI,WAAW,aAAa,WAAW,YAAY,2BAA2B;AAAA,UAC9E,YAAY,IAAI,CAAC,SAChB,oBAAC,SAA8B,WAAW,aAAa,WAAW,KAAK,2BAA7D,cAAc,IAAI,CAAoE,CACjG;AAAA,UACD,oBAAC,SAAI,WAAW,aAAa,WAAW,aAAa,yBAAyB;AAAA,WAChF;AAAA,QACA,oBAAC,WACC,+BAAC,QAAG,WAAU,wBACZ;AAAA,8BAAC,QAAG,WAAU,+DACX,YAAE,+BAA+B,SAAS,GAC7C;AAAA,UACC,YAAY,IAAI,CAAC,SAAS;AACzB,kBAAM,UAAU,oBAAoB,IAAI;AACxC,kBAAM,UAAU,aAAa,IAAI;AACjC,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW,qCAAqC,UAAU,sCAAsC,EAAE;AAAA,gBAElG;AAAA,sCAAC,SAAI,WAAU,+CAA+C,mBAAQ;AAAA,kBACtE,oBAAC,SAAI,WAAU,WAAW,eAAK,QAAQ,GAAE;AAAA;AAAA;AAAA,cAJpC,cAAc,IAAI;AAAA,YAKzB;AAAA,UAEJ,CAAC;AAAA,UACD,oBAAC,QAAG,WAAU,oCACX,YAAE,6BAA6B,OAAO,GACzC;AAAA,WACF,GACF;AAAA,QACA,qBAAC,WACE;AAAA,mBAAS,IAAI,CAAC,YACb,qBAAC,QAAoB,WAAU,oCAC7B;AAAA,gCAAC,QAAG,WAAU,4EACZ,+BAAC,SAAI,WAAU,2CACb;AAAA,mCAAC,SAAI,WAAU,kBACb;AAAA,qCAAC,SAAI,WAAU,sCAAqC,OAAO,QAAQ,MACjE;AAAA,sCAAC,mBAAgB,UAAU,QAAQ,OAAO,aAAa,QAAQ,MAAM,MAAK,MAAK;AAAA,kBAC/E,oBAAC,UAAK,WAAU,YAAY,kBAAQ,MAAK;AAAA,mBAC3C;AAAA,gBACC,QAAQ,QACP,oBAAC,SAAI,WAAU,qCAAqC,kBAAQ,MAAK;AAAA,iBAErE;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AAAE,yBAAK,oBAAoB,OAAO;AAAA,kBAAE;AAAA,kBACnD,cAAY,EAAE,iCAAiC,kBAAkB;AAAA,kBACjE,OAAO,EAAE,iCAAiC,kBAAkB;AAAA,kBAC5D,WAAU;AAAA,kBAEV,8BAAC,KAAE,WAAU,eAAc;AAAA;AAAA,cAC7B;AAAA,eACF,GACF;AAAA,YACC,YAAY,IAAI,CAAC,SAAS;AACzB,oBAAM,UAAU,cAAc,IAAI;AAClC,oBAAM,UAAU,aAAa,IAAI;AACjC,oBAAM,cAAc,aAAa,QAAQ,IAAI,OAAO;AACpD,oBAAM,UAAU,MAAM,QAAQ,EAAE,IAAI,OAAO,MAAM;AACjD,qBACE,oBAAC,QAAiB,WAAW,iBAAiB,UAAU,gBAAgB,EAAE,IACvE,oBACC,oBAAC,SAAI,WAAU,kEAAiE,eAAC,IAEjF;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,WAAW;AAAA,kCACP,aAAa,WAAW,6BAA6B,2BAA2B;AAAA,kCAChF,UAAU,iCAAiC,2CAA2C;AAAA,kCACtF,cAAc,IAAI,kBAAkB,uBAAuB;AAAA;AAAA,kBAE/D,OAAO,QAAQ,QAAQ,EAAE,IAAI,OAAO,KAAK,iBAAiB,WAAW;AAAA,kBACrE,UAAU,CAAC,MAAM,iBAAiB,QAAQ,IAAI,SAAS,EAAE,OAAO,KAAK;AAAA,kBACrE,QAAQ,MAAM,eAAe,QAAQ,IAAI,OAAO;AAAA,kBAChD,aAAa,EAAE,2CAA2C,GAAG;AAAA;AAAA,cAC/D,KAhBK,OAkBT;AAAA,YAEJ,CAAC;AAAA,YACD,oBAAC,QAAG,WAAU,6DACX,2BAAiB,YAAY,QAAQ,EAAE,CAAC,KAAK,KAChD;AAAA,eApDO,QAAQ,EAqDjB,CACD;AAAA,UACD,oBAAC,QAAG,WAAU,YACZ,8BAAC,QAAG,SAAS,YAAY,SAAS,GAAG,WAAU,2CAC7C;AAAA,YAAC;AAAA;AAAA,cACC,kBAAkB;AAAA,cAClB;AAAA,cACA,kBAAkB;AAAA,cAClB,cAAc;AAAA,cACd,iBAAiB,MAAM,oBAAoB,IAAI;AAAA;AAAA,UACjD,GACF,GACF;AAAA,WACF;AAAA,QACA,oBAAC,WACC,+BAAC,QAAG,WAAU,sCACZ;AAAA,8BAAC,QAAG,WAAU,yCACX,YAAE,mCAAmC,aAAa,GACrD;AAAA,UACC,YAAY,IAAI,CAAC,SAAS;AACzB,kBAAM,UAAU,aAAa,IAAI;AACjC,kBAAM,aAAa,YAAY,IAAI;AACnC,mBACE,oBAAC,QAA6B,WAAW,yCAAyC,UAAU,6BAA6B,EAAE,IACxH,oBAAU,MAAO,iBAAiB,UAAU,KAAK,OAD3C,cAAc,IAAI,CAE3B;AAAA,UAEJ,CAAC;AAAA,UACD,oBAAC,QAAG,WAAU,mDAAmD,2BAAiB,UAAU,KAAK,KAAI;AAAA,WACvG,GACF;AAAA,SACF,GACF,GAEF;AAAA,OACF;AAAA,IACC;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,kBAAkB;AAAA;AAAA,IACpB;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ const clockIcon = React.createElement(
3
+ "svg",
4
+ { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2 },
5
+ React.createElement("circle", { cx: 12, cy: 12, r: 10 }),
6
+ React.createElement("path", { d: "M12 6v6l4 2" })
7
+ );
8
+ const metadata = {
9
+ requireAuth: true,
10
+ requireFeatures: ["staff.timesheets.view"],
11
+ pageTitle: "My Timesheets",
12
+ pageTitleKey: "staff.timesheets.nav.my_timesheets",
13
+ pageGroup: "Employees",
14
+ pageGroupKey: "staff.nav.group",
15
+ pageOrder: 85,
16
+ icon: clockIcon,
17
+ breadcrumb: [{ label: "My Timesheets", labelKey: "staff.timesheets.nav.my_timesheets" }]
18
+ };
19
+ export {
20
+ metadata
21
+ };
22
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/staff/backend/staff/timesheets/page.meta.ts"],
4
+ "sourcesContent": ["import React from 'react'\n\nconst clockIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2 },\n React.createElement('circle', { cx: 12, cy: 12, r: 10 }),\n React.createElement('path', { d: 'M12 6v6l4 2' }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['staff.timesheets.view'],\n pageTitle: 'My Timesheets',\n pageTitleKey: 'staff.timesheets.nav.my_timesheets',\n pageGroup: 'Employees',\n pageGroupKey: 'staff.nav.group',\n pageOrder: 85,\n icon: clockIcon,\n breadcrumb: [{ label: 'My Timesheets', labelKey: 'staff.timesheets.nav.my_timesheets' }],\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,YAAY,MAAM;AAAA,EACtB;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,EAAE;AAAA,EACpG,MAAM,cAAc,UAAU,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,CAAC;AAAA,EACvD,MAAM,cAAc,QAAQ,EAAE,GAAG,cAAc,CAAC;AAClD;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,uBAAuB;AAAA,EACzC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY,CAAC,EAAE,OAAO,iBAAiB,UAAU,qCAAqC,CAAC;AACzF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,125 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { useRouter } from "next/navigation";
5
+ import { Page, PageBody } from "@open-mercato/ui/backend/Page";
6
+ import { CrudForm } from "@open-mercato/ui/backend/CrudForm";
7
+ import { updateCrud, deleteCrud } from "@open-mercato/ui/backend/utils/crud";
8
+ import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
9
+ import { createCrudFormError } from "@open-mercato/ui/backend/utils/serverErrors";
10
+ import { E } from "../../../../../../../../generated/entities.ids.generated.js";
11
+ import { flash } from "@open-mercato/ui/backend/FlashMessages";
12
+ import { LoadingMessage, ErrorMessage } from "@open-mercato/ui/backend/detail";
13
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
14
+ import { useOrganizationScopeVersion } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
15
+ import {
16
+ buildProjectPayload,
17
+ createProjectFormFields,
18
+ createProjectFormGroups,
19
+ createProjectFormSchema
20
+ } from "../../projectFormConfig.js";
21
+ const LIST_HREF = "/backend/staff/timesheets/projects";
22
+ function TimesheetProjectEditPage({ params }) {
23
+ const projectId = params?.id;
24
+ const t = useT();
25
+ const router = useRouter();
26
+ const scopeVersion = useOrganizationScopeVersion();
27
+ const [initialValues, setInitialValues] = React.useState(null);
28
+ const [loading, setLoading] = React.useState(true);
29
+ const [error, setError] = React.useState(null);
30
+ const formSchema = React.useMemo(() => createProjectFormSchema(), []);
31
+ const fields = React.useMemo(() => createProjectFormFields(t), [t]);
32
+ const groups = React.useMemo(() => createProjectFormGroups(t), [t]);
33
+ React.useEffect(() => {
34
+ if (!projectId) return;
35
+ let cancelled = false;
36
+ async function load() {
37
+ setLoading(true);
38
+ setError(null);
39
+ try {
40
+ const payload = await readApiResultOrThrow(
41
+ `/api/staff/timesheets/time-projects?ids=${projectId}&pageSize=1`,
42
+ void 0,
43
+ { errorMessage: t("staff.timesheets.projects.errors.load", "Failed to load project.") }
44
+ );
45
+ const record = Array.isArray(payload.items) ? payload.items[0] : null;
46
+ if (!record) throw new Error(t("staff.timesheets.projects.errors.notFound", "Project not found."));
47
+ if (!cancelled) {
48
+ setInitialValues({
49
+ id: String(record.id ?? ""),
50
+ name: String(record.name ?? ""),
51
+ code: String(record.code ?? ""),
52
+ description: typeof record.description === "string" ? record.description : null,
53
+ projectType: typeof (record.projectType ?? record.project_type) === "string" ? String(record.projectType ?? record.project_type) : null,
54
+ startDate: typeof (record.startDate ?? record.start_date) === "string" ? String(record.startDate ?? record.start_date) : null,
55
+ costCenter: typeof (record.costCenter ?? record.cost_center) === "string" ? String(record.costCenter ?? record.cost_center) : null,
56
+ status: typeof record.status === "string" ? record.status : "active"
57
+ });
58
+ }
59
+ } catch (err) {
60
+ if (!cancelled) setError(err instanceof Error ? err.message : "Failed to load project.");
61
+ } finally {
62
+ if (!cancelled) setLoading(false);
63
+ }
64
+ }
65
+ load();
66
+ return () => {
67
+ cancelled = true;
68
+ };
69
+ }, [projectId, t, scopeVersion]);
70
+ if (loading) {
71
+ return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(LoadingMessage, { label: t("staff.timesheets.projects.loading", "Loading project...") }) }) });
72
+ }
73
+ if (error || !initialValues) {
74
+ return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(ErrorMessage, { label: error ?? t("staff.timesheets.projects.errors.notFound", "Project not found.") }) }) });
75
+ }
76
+ const detailHref = `/backend/staff/timesheets/projects/${projectId}`;
77
+ return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(
78
+ CrudForm,
79
+ {
80
+ title: t("staff.timesheets.projects.form.editTitle", "Edit project"),
81
+ backHref: detailHref,
82
+ cancelHref: detailHref,
83
+ fields,
84
+ groups,
85
+ schema: formSchema,
86
+ initialValues,
87
+ entityIds: [E.staff.staff_time_project],
88
+ submitLabel: t("staff.timesheets.projects.form.actions.save", "Save"),
89
+ onDelete: async () => {
90
+ await deleteCrud("staff/timesheets/time-projects", projectId, {
91
+ errorMessage: t("staff.timesheets.projects.errors.delete", "Failed to delete project.")
92
+ });
93
+ flash(t("staff.timesheets.projects.messages.deleted", "Project deleted."), "success");
94
+ router.push(LIST_HREF);
95
+ },
96
+ onSubmit: async (values) => {
97
+ if (!values.name?.trim() || !values.code?.trim()) {
98
+ const fieldErrors = {};
99
+ if (!values.name?.trim()) fieldErrors.name = "Required";
100
+ if (!values.code?.trim()) fieldErrors.code = "Required";
101
+ throw createCrudFormError(
102
+ t("staff.timesheets.projects.errors.required", "Name and code are required."),
103
+ fieldErrors
104
+ );
105
+ }
106
+ const payload = buildProjectPayload({ ...values, id: projectId });
107
+ await updateCrud("staff/timesheets/time-projects", payload, {
108
+ errorMessage: t("staff.timesheets.projects.errors.save", "Failed to save project.")
109
+ });
110
+ flash(t("staff.timesheets.projects.messages.saved", "Project saved."), "success");
111
+ router.push(detailHref);
112
+ },
113
+ versionHistory: {
114
+ resourceKind: "staff.timesheets.time_project",
115
+ resourceId: projectId,
116
+ canUndoRedo: true,
117
+ autoCheckAcl: true
118
+ }
119
+ }
120
+ ) }) });
121
+ }
122
+ export {
123
+ TimesheetProjectEditPage as default
124
+ };
125
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../../src/modules/staff/backend/staff/timesheets/projects/%5Bid%5D/edit/page.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport { updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { E } from '#generated/entities.ids.generated'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { LoadingMessage, ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n buildProjectPayload,\n createProjectFormFields,\n createProjectFormGroups,\n createProjectFormSchema,\n type ProjectFormValues,\n} from '../../projectFormConfig'\n\nconst LIST_HREF = '/backend/staff/timesheets/projects'\n\nexport default function TimesheetProjectEditPage({ params }: { params?: { id?: string } }) {\n const projectId = params?.id\n const t = useT()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n\n const [initialValues, setInitialValues] = React.useState<ProjectFormValues | null>(null)\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n\n const formSchema = React.useMemo(() => createProjectFormSchema(), [])\n const fields = React.useMemo(() => createProjectFormFields(t), [t])\n const groups = React.useMemo(() => createProjectFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!projectId) return\n let cancelled = false\n async function load() {\n setLoading(true)\n setError(null)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n `/api/staff/timesheets/time-projects?ids=${projectId}&pageSize=1`,\n undefined,\n { errorMessage: t('staff.timesheets.projects.errors.load', 'Failed to load project.') },\n )\n const record = Array.isArray(payload.items) ? payload.items[0] : null\n if (!record) throw new Error(t('staff.timesheets.projects.errors.notFound', 'Project not found.'))\n if (!cancelled) {\n setInitialValues({\n id: String(record.id ?? ''),\n name: String(record.name ?? ''),\n code: String(record.code ?? ''),\n description: typeof record.description === 'string' ? record.description : null,\n projectType: typeof (record.projectType ?? record.project_type) === 'string'\n ? String(record.projectType ?? record.project_type)\n : null,\n startDate: typeof (record.startDate ?? record.start_date) === 'string'\n ? String(record.startDate ?? record.start_date)\n : null,\n costCenter: typeof (record.costCenter ?? record.cost_center) === 'string'\n ? String(record.costCenter ?? record.cost_center)\n : null,\n status: typeof record.status === 'string' ? record.status : 'active',\n })\n }\n } catch (err) {\n if (!cancelled) setError(err instanceof Error ? err.message : 'Failed to load project.')\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n load()\n return () => { cancelled = true }\n }, [projectId, t, scopeVersion])\n\n if (loading) {\n return <Page><PageBody><LoadingMessage label={t('staff.timesheets.projects.loading', 'Loading project...')} /></PageBody></Page>\n }\n\n if (error || !initialValues) {\n return <Page><PageBody><ErrorMessage label={error ?? t('staff.timesheets.projects.errors.notFound', 'Project not found.')} /></PageBody></Page>\n }\n\n const detailHref = `/backend/staff/timesheets/projects/${projectId}`\n\n return (\n <Page>\n <PageBody>\n <CrudForm<ProjectFormValues>\n title={t('staff.timesheets.projects.form.editTitle', 'Edit project')}\n backHref={detailHref}\n cancelHref={detailHref}\n fields={fields}\n groups={groups}\n schema={formSchema}\n initialValues={initialValues}\n entityIds={[E.staff.staff_time_project]}\n submitLabel={t('staff.timesheets.projects.form.actions.save', 'Save')}\n onDelete={async () => {\n await deleteCrud('staff/timesheets/time-projects', projectId!, {\n errorMessage: t('staff.timesheets.projects.errors.delete', 'Failed to delete project.'),\n })\n flash(t('staff.timesheets.projects.messages.deleted', 'Project deleted.'), 'success')\n router.push(LIST_HREF)\n }}\n onSubmit={async (values) => {\n if (!values.name?.trim() || !values.code?.trim()) {\n const fieldErrors: Record<string, string> = {}\n if (!values.name?.trim()) fieldErrors.name = 'Required'\n if (!values.code?.trim()) fieldErrors.code = 'Required'\n throw createCrudFormError(\n t('staff.timesheets.projects.errors.required', 'Name and code are required.'),\n fieldErrors,\n )\n }\n\n const payload = buildProjectPayload({ ...values, id: projectId })\n\n await updateCrud('staff/timesheets/time-projects', payload, {\n errorMessage: t('staff.timesheets.projects.errors.save', 'Failed to save project.'),\n })\n\n flash(t('staff.timesheets.projects.messages.saved', 'Project saved.'), 'success')\n router.push(detailHref)\n }}\n versionHistory={{\n resourceKind: 'staff.timesheets.time_project',\n resourceId: projectId!,\n canUndoRedo: true,\n autoCheckAcl: true,\n }}\n />\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ const metadata = {
2
+ requireAuth: true,
3
+ requireFeatures: ["staff.timesheets.projects.manage"],
4
+ navHidden: true,
5
+ pageTitle: "Edit Project",
6
+ pageTitleKey: "staff.timesheets.nav.edit_project",
7
+ breadcrumb: [
8
+ { label: "My Timesheets", labelKey: "staff.timesheets.nav.my_timesheets", href: "/backend/staff/timesheets" },
9
+ { label: "Projects", labelKey: "staff.timesheets.nav.projects", href: "/backend/staff/timesheets/projects" },
10
+ { label: "Edit", labelKey: "staff.timesheets.nav.edit_project" }
11
+ ]
12
+ };
13
+ export {
14
+ metadata
15
+ };
16
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../../src/modules/staff/backend/staff/timesheets/projects/%5Bid%5D/edit/page.meta.ts"],
4
+ "sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['staff.timesheets.projects.manage'],\n navHidden: true,\n pageTitle: 'Edit Project',\n pageTitleKey: 'staff.timesheets.nav.edit_project',\n breadcrumb: [\n { label: 'My Timesheets', labelKey: 'staff.timesheets.nav.my_timesheets', href: '/backend/staff/timesheets' },\n { label: 'Projects', labelKey: 'staff.timesheets.nav.projects', href: '/backend/staff/timesheets/projects' },\n { label: 'Edit', labelKey: 'staff.timesheets.nav.edit_project' },\n ],\n}\n"],
5
+ "mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,kCAAkC;AAAA,EACpD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,IACV,EAAE,OAAO,iBAAiB,UAAU,sCAAsC,MAAM,4BAA4B;AAAA,IAC5G,EAAE,OAAO,YAAY,UAAU,iCAAiC,MAAM,qCAAqC;AAAA,IAC3G,EAAE,OAAO,QAAQ,UAAU,oCAAoC;AAAA,EACjE;AACF;",
6
+ "names": []
7
+ }