@open-mercato/core 0.10.1-develop.7716.1.cefe7975df → 0.10.1-develop.7721.1.b5c4a00a68

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 (384) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/staff_support_routing_rule/index.js +21 -0
  3. package/dist/generated/entities/staff_support_routing_rule/index.js.map +7 -0
  4. package/dist/generated/entities/staff_support_ticket/index.js +37 -0
  5. package/dist/generated/entities/staff_support_ticket/index.js.map +7 -0
  6. package/dist/generated/entities/staff_time_project/index.js +2 -0
  7. package/dist/generated/entities/staff_time_project/index.js.map +2 -2
  8. package/dist/generated/entities/staff_time_project_member/index.js +2 -0
  9. package/dist/generated/entities/staff_time_project_member/index.js.map +2 -2
  10. package/dist/generated/entities/staff_time_task/index.js +4 -0
  11. package/dist/generated/entities/staff_time_task/index.js.map +2 -2
  12. package/dist/generated/entities/staff_time_task_comment/index.js +9 -1
  13. package/dist/generated/entities/staff_time_task_comment/index.js.map +2 -2
  14. package/dist/generated/entities.ids.generated.js +2 -0
  15. package/dist/generated/entities.ids.generated.js.map +2 -2
  16. package/dist/generated/entity-fields-registry.js +38 -0
  17. package/dist/generated/entity-fields-registry.js.map +2 -2
  18. package/dist/helpers/integration/auth.js +1 -0
  19. package/dist/helpers/integration/auth.js.map +2 -2
  20. package/dist/helpers/integration/communicationChannelsFixtures.js +20 -0
  21. package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
  22. package/dist/modules/catalog/api/bulk-delete/route.js +12 -2
  23. package/dist/modules/catalog/api/bulk-delete/route.js.map +2 -2
  24. package/dist/modules/communication_channels/api/post/test-seed/route.js +17 -3
  25. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
  26. package/dist/modules/communication_channels/lib/test-seed.js +38 -5
  27. package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
  28. package/dist/modules/messages/commands/messages.js +2 -3
  29. package/dist/modules/messages/commands/messages.js.map +2 -2
  30. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +2 -2
  31. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  32. package/dist/modules/staff/api/portal/support-tickets/[id]/attachments/route.js +299 -0
  33. package/dist/modules/staff/api/portal/support-tickets/[id]/attachments/route.js.map +7 -0
  34. package/dist/modules/staff/api/portal/support-tickets/[id]/messages/route.js +91 -0
  35. package/dist/modules/staff/api/portal/support-tickets/[id]/messages/route.js.map +7 -0
  36. package/dist/modules/staff/api/portal/support-tickets/[id]/route.js +146 -0
  37. package/dist/modules/staff/api/portal/support-tickets/[id]/route.js.map +7 -0
  38. package/dist/modules/staff/api/portal/support-tickets/options/route.js +60 -0
  39. package/dist/modules/staff/api/portal/support-tickets/options/route.js.map +7 -0
  40. package/dist/modules/staff/api/portal/support-tickets/route.js +220 -0
  41. package/dist/modules/staff/api/portal/support-tickets/route.js.map +7 -0
  42. package/dist/modules/staff/api/timesheets/settings/route.js +7 -1
  43. package/dist/modules/staff/api/timesheets/settings/route.js.map +2 -2
  44. package/dist/modules/staff/api/timesheets/support-routing-rules/fallback-project/route.js +122 -0
  45. package/dist/modules/staff/api/timesheets/support-routing-rules/fallback-project/route.js.map +7 -0
  46. package/dist/modules/staff/api/timesheets/support-routing-rules/preview/route.js +180 -0
  47. package/dist/modules/staff/api/timesheets/support-routing-rules/preview/route.js.map +7 -0
  48. package/dist/modules/staff/api/timesheets/support-routing-rules/route.js +147 -0
  49. package/dist/modules/staff/api/timesheets/support-routing-rules/route.js.map +7 -0
  50. package/dist/modules/staff/api/timesheets/support-tickets/options/route.js +133 -0
  51. package/dist/modules/staff/api/timesheets/support-tickets/options/route.js.map +7 -0
  52. package/dist/modules/staff/api/timesheets/tasks/[id]/claim/route.js +33 -0
  53. package/dist/modules/staff/api/timesheets/tasks/[id]/claim/route.js.map +7 -0
  54. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +25 -7
  55. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +2 -2
  56. package/dist/modules/staff/api/timesheets/tasks/[id]/release/route.js +32 -0
  57. package/dist/modules/staff/api/timesheets/tasks/[id]/release/route.js.map +7 -0
  58. package/dist/modules/staff/api/timesheets/tasks/route.js +94 -47
  59. package/dist/modules/staff/api/timesheets/tasks/route.js.map +2 -2
  60. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +3 -0
  61. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +2 -2
  62. package/dist/modules/staff/api/timesheets/time-projects/route.js +3 -0
  63. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
  64. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js +1 -0
  65. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js.map +2 -2
  66. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js +54 -4
  67. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js.map +2 -2
  68. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js +21 -5
  69. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js.map +2 -2
  70. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js +319 -254
  71. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js.map +2 -2
  72. package/dist/modules/staff/backend/staff/time-tracking/support/page.js +363 -0
  73. package/dist/modules/staff/backend/staff/time-tracking/support/page.js.map +7 -0
  74. package/dist/modules/staff/backend/staff/time-tracking/support/page.meta.js +18 -0
  75. package/dist/modules/staff/backend/staff/time-tracking/support/page.meta.js.map +7 -0
  76. package/dist/modules/staff/cli.js +27 -0
  77. package/dist/modules/staff/cli.js.map +2 -2
  78. package/dist/modules/staff/commands/index.js +3 -0
  79. package/dist/modules/staff/commands/index.js.map +2 -2
  80. package/dist/modules/staff/commands/shared.js +10 -1
  81. package/dist/modules/staff/commands/shared.js.map +2 -2
  82. package/dist/modules/staff/commands/support-routing-rules.js +505 -0
  83. package/dist/modules/staff/commands/support-routing-rules.js.map +7 -0
  84. package/dist/modules/staff/commands/support-tickets.js +513 -0
  85. package/dist/modules/staff/commands/support-tickets.js.map +7 -0
  86. package/dist/modules/staff/commands/timesheets-projects.js +72 -14
  87. package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
  88. package/dist/modules/staff/commands/timesheets-task-assignment.js +270 -0
  89. package/dist/modules/staff/commands/timesheets-task-assignment.js.map +7 -0
  90. package/dist/modules/staff/commands/timesheets-task-comments.js +58 -12
  91. package/dist/modules/staff/commands/timesheets-task-comments.js.map +2 -2
  92. package/dist/modules/staff/commands/timesheets-tasks.js +91 -9
  93. package/dist/modules/staff/commands/timesheets-tasks.js.map +3 -3
  94. package/dist/modules/staff/data/enrichers.js +141 -0
  95. package/dist/modules/staff/data/enrichers.js.map +2 -2
  96. package/dist/modules/staff/data/entities.js +143 -2
  97. package/dist/modules/staff/data/entities.js.map +2 -2
  98. package/dist/modules/staff/data/extensions.js +8 -0
  99. package/dist/modules/staff/data/extensions.js.map +2 -2
  100. package/dist/modules/staff/data/validators.js +34 -5
  101. package/dist/modules/staff/data/validators.js.map +2 -2
  102. package/dist/modules/staff/encryption.js +6 -0
  103. package/dist/modules/staff/encryption.js.map +2 -2
  104. package/dist/modules/staff/events.js +25 -0
  105. package/dist/modules/staff/events.js.map +2 -2
  106. package/dist/modules/staff/events.payloads.js +54 -0
  107. package/dist/modules/staff/events.payloads.js.map +2 -2
  108. package/dist/modules/staff/extension-points.js +1 -0
  109. package/dist/modules/staff/extension-points.js.map +2 -2
  110. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.js +468 -0
  111. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.js.map +7 -0
  112. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.meta.js +12 -0
  113. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.meta.js.map +7 -0
  114. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.js +316 -0
  115. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.js.map +7 -0
  116. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.meta.js +12 -0
  117. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.meta.js.map +7 -0
  118. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.js +190 -0
  119. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.js.map +7 -0
  120. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.meta.js +19 -0
  121. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.meta.js.map +7 -0
  122. package/dist/modules/staff/index.js +1 -1
  123. package/dist/modules/staff/index.js.map +2 -2
  124. package/dist/modules/staff/lib/crud.js +2 -0
  125. package/dist/modules/staff/lib/crud.js.map +2 -2
  126. package/dist/modules/staff/lib/support/attachments.js +36 -0
  127. package/dist/modules/staff/lib/support/attachments.js.map +7 -0
  128. package/dist/modules/staff/lib/support/dictionaries.js +87 -0
  129. package/dist/modules/staff/lib/support/dictionaries.js.map +7 -0
  130. package/dist/modules/staff/lib/support/notifications.js +111 -0
  131. package/dist/modules/staff/lib/support/notifications.js.map +7 -0
  132. package/dist/modules/staff/lib/support/portalAttachments.js +100 -0
  133. package/dist/modules/staff/lib/support/portalAttachments.js.map +7 -0
  134. package/dist/modules/staff/lib/support/portalBroadcast.js +117 -0
  135. package/dist/modules/staff/lib/support/portalBroadcast.js.map +7 -0
  136. package/dist/modules/staff/lib/support/portalRoute.js +99 -0
  137. package/dist/modules/staff/lib/support/portalRoute.js.map +7 -0
  138. package/dist/modules/staff/lib/support/portalStatus.js +12 -0
  139. package/dist/modules/staff/lib/support/portalStatus.js.map +7 -0
  140. package/dist/modules/staff/lib/support/portalTickets.js +148 -0
  141. package/dist/modules/staff/lib/support/portalTickets.js.map +7 -0
  142. package/dist/modules/staff/lib/support/routing.js +81 -0
  143. package/dist/modules/staff/lib/support/routing.js.map +7 -0
  144. package/dist/modules/staff/lib/support/routingRuleDraft.js +25 -0
  145. package/dist/modules/staff/lib/support/routingRuleDraft.js.map +7 -0
  146. package/dist/modules/staff/lib/support/seedDefaults.js +114 -0
  147. package/dist/modules/staff/lib/support/seedDefaults.js.map +7 -0
  148. package/dist/modules/staff/lib/support/supportActivity.js +26 -0
  149. package/dist/modules/staff/lib/support/supportActivity.js.map +7 -0
  150. package/dist/modules/staff/lib/support-ui/PortalSupportNotLinked.js +23 -0
  151. package/dist/modules/staff/lib/support-ui/PortalSupportNotLinked.js.map +7 -0
  152. package/dist/modules/staff/lib/support-ui/portalAttachmentValidation.js +112 -0
  153. package/dist/modules/staff/lib/support-ui/portalAttachmentValidation.js.map +7 -0
  154. package/dist/modules/staff/lib/support-ui/portalPendingUploads.js +45 -0
  155. package/dist/modules/staff/lib/support-ui/portalPendingUploads.js.map +7 -0
  156. package/dist/modules/staff/lib/support-ui/portalSupport.js +51 -0
  157. package/dist/modules/staff/lib/support-ui/portalSupport.js.map +7 -0
  158. package/dist/modules/staff/lib/time-tracking/access.js +3 -39
  159. package/dist/modules/staff/lib/time-tracking/access.js.map +2 -2
  160. package/dist/modules/staff/lib/time-tracking/listProjectAccess.js +54 -0
  161. package/dist/modules/staff/lib/time-tracking/listProjectAccess.js.map +7 -0
  162. package/dist/modules/staff/lib/time-tracking/portalRecipients.js +92 -2
  163. package/dist/modules/staff/lib/time-tracking/portalRecipients.js.map +2 -2
  164. package/dist/modules/staff/lib/time-tracking/projectAssignment.js +112 -0
  165. package/dist/modules/staff/lib/time-tracking/projectAssignment.js.map +7 -0
  166. package/dist/modules/staff/lib/time-tracking/settingKeys.js +14 -0
  167. package/dist/modules/staff/lib/time-tracking/settingKeys.js.map +2 -2
  168. package/dist/modules/staff/lib/time-tracking/settings.js +28 -1
  169. package/dist/modules/staff/lib/time-tracking/settings.js.map +2 -2
  170. package/dist/modules/staff/lib/time-tracking/taskAssignmentRoute.js +143 -0
  171. package/dist/modules/staff/lib/time-tracking/taskAssignmentRoute.js.map +7 -0
  172. package/dist/modules/staff/lib/time-tracking/workRecipients.js +92 -0
  173. package/dist/modules/staff/lib/time-tracking/workRecipients.js.map +7 -0
  174. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js +32 -3
  175. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js.map +2 -2
  176. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js +29 -0
  177. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js.map +2 -2
  178. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js +4 -0
  179. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js.map +2 -2
  180. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js +141 -1
  181. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js.map +2 -2
  182. package/dist/modules/staff/lib/time-tracking-ui/SupportAttachmentsSection.js +153 -0
  183. package/dist/modules/staff/lib/time-tracking-ui/SupportAttachmentsSection.js.map +7 -0
  184. package/dist/modules/staff/lib/time-tracking-ui/SupportRequestPanel.js +67 -0
  185. package/dist/modules/staff/lib/time-tracking-ui/SupportRequestPanel.js.map +7 -0
  186. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js +3 -1
  187. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js.map +2 -2
  188. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js +80 -17
  189. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js.map +2 -2
  190. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js +230 -41
  191. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js.map +2 -2
  192. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js +21 -1
  193. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js.map +2 -2
  194. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js +16 -4
  195. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js.map +2 -2
  196. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js +3 -1
  197. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js.map +2 -2
  198. package/dist/modules/staff/lib/time-tracking-ui/projectDefaultAssignee.js +68 -0
  199. package/dist/modules/staff/lib/time-tracking-ui/projectDefaultAssignee.js.map +7 -0
  200. package/dist/modules/staff/lib/time-tracking-ui/settingsTabs.js +7 -0
  201. package/dist/modules/staff/lib/time-tracking-ui/settingsTabs.js.map +7 -0
  202. package/dist/modules/staff/lib/time-tracking-ui/supportTicketData.js +50 -0
  203. package/dist/modules/staff/lib/time-tracking-ui/supportTicketData.js.map +7 -0
  204. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js +13 -1
  205. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js.map +2 -2
  206. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js +36 -2
  207. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js.map +2 -2
  208. package/dist/modules/staff/migrations/Migration20261009180543_staff.js +42 -0
  209. package/dist/modules/staff/migrations/Migration20261009180543_staff.js.map +7 -0
  210. package/dist/modules/staff/notifications.js +92 -0
  211. package/dist/modules/staff/notifications.js.map +2 -2
  212. package/dist/modules/staff/setup.js +6 -2
  213. package/dist/modules/staff/setup.js.map +2 -2
  214. package/dist/modules/staff/subscribers/support-portal-comment-created.js +26 -0
  215. package/dist/modules/staff/subscribers/support-portal-comment-created.js.map +7 -0
  216. package/dist/modules/staff/subscribers/support-portal-comment-deleted.js +26 -0
  217. package/dist/modules/staff/subscribers/support-portal-comment-deleted.js.map +7 -0
  218. package/dist/modules/staff/subscribers/support-portal-comment-updated.js +26 -0
  219. package/dist/modules/staff/subscribers/support-portal-comment-updated.js.map +7 -0
  220. package/dist/modules/staff/subscribers/support-portal-status-column-updated.js +24 -0
  221. package/dist/modules/staff/subscribers/support-portal-status-column-updated.js.map +7 -0
  222. package/dist/modules/staff/subscribers/support-portal-task-status-changed.js +25 -0
  223. package/dist/modules/staff/subscribers/support-portal-task-status-changed.js.map +7 -0
  224. package/dist/modules/staff/subscribers/support-portal-task-updated.js +25 -0
  225. package/dist/modules/staff/subscribers/support-portal-task-updated.js.map +7 -0
  226. package/dist/modules/staff/subscribers/support-ticket-created-notification.js +25 -0
  227. package/dist/modules/staff/subscribers/support-ticket-created-notification.js.map +7 -0
  228. package/dist/modules/staff/subscribers/support-ticket-customer-replied-notification.js +25 -0
  229. package/dist/modules/staff/subscribers/support-ticket-customer-replied-notification.js.map +7 -0
  230. package/dist/modules/staff/subscribers/support-ticket-unnotified-clear.js +26 -0
  231. package/dist/modules/staff/subscribers/support-ticket-unnotified-clear.js.map +7 -0
  232. package/dist/modules/staff/subscribers/time-task-assignee-notification.js +83 -0
  233. package/dist/modules/staff/subscribers/time-task-assignee-notification.js.map +7 -0
  234. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.client.js +112 -0
  235. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.client.js.map +7 -0
  236. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.js +17 -0
  237. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.js.map +7 -0
  238. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.client.js +870 -0
  239. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.client.js.map +7 -0
  240. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.js +17 -0
  241. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.js.map +7 -0
  242. package/dist/modules/staff/widgets/injection-table.js +16 -1
  243. package/dist/modules/staff/widgets/injection-table.js.map +2 -2
  244. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +4 -18
  245. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  246. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +4 -18
  247. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  248. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +4 -18
  249. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  250. package/dist/modules/wms/lib/inventoryCsvExport.js +19 -0
  251. package/dist/modules/wms/lib/inventoryCsvExport.js.map +7 -0
  252. package/generated/entities/staff_support_routing_rule/index.ts +9 -0
  253. package/generated/entities/staff_support_ticket/index.ts +17 -0
  254. package/generated/entities/staff_time_project/index.ts +1 -0
  255. package/generated/entities/staff_time_project_member/index.ts +1 -0
  256. package/generated/entities/staff_time_task/index.ts +2 -0
  257. package/generated/entities/staff_time_task_comment/index.ts +4 -0
  258. package/generated/entities.ids.generated.ts +2 -0
  259. package/generated/entity-fields-registry.ts +38 -0
  260. package/package.json +8 -8
  261. package/src/helpers/integration/auth.ts +1 -1
  262. package/src/helpers/integration/communicationChannelsFixtures.ts +60 -2
  263. package/src/modules/catalog/api/bulk-delete/route.ts +12 -2
  264. package/src/modules/communication_channels/api/post/test-seed/route.ts +29 -12
  265. package/src/modules/communication_channels/lib/test-seed.ts +49 -10
  266. package/src/modules/messages/commands/messages.ts +8 -10
  267. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +2 -2
  268. package/src/modules/staff/AGENTS.md +22 -6
  269. package/src/modules/staff/api/portal/support-tickets/[id]/attachments/route.ts +327 -0
  270. package/src/modules/staff/api/portal/support-tickets/[id]/messages/route.ts +94 -0
  271. package/src/modules/staff/api/portal/support-tickets/[id]/route.ts +160 -0
  272. package/src/modules/staff/api/portal/support-tickets/options/route.ts +60 -0
  273. package/src/modules/staff/api/portal/support-tickets/route.ts +253 -0
  274. package/src/modules/staff/api/timesheets/settings/route.ts +7 -1
  275. package/src/modules/staff/api/timesheets/support-routing-rules/fallback-project/route.ts +131 -0
  276. package/src/modules/staff/api/timesheets/support-routing-rules/preview/route.ts +248 -0
  277. package/src/modules/staff/api/timesheets/support-routing-rules/route.ts +150 -0
  278. package/src/modules/staff/api/timesheets/support-tickets/options/route.ts +181 -0
  279. package/src/modules/staff/api/timesheets/tasks/[id]/claim/route.ts +31 -0
  280. package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +25 -7
  281. package/src/modules/staff/api/timesheets/tasks/[id]/release/route.ts +30 -0
  282. package/src/modules/staff/api/timesheets/tasks/route.ts +119 -67
  283. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +3 -0
  284. package/src/modules/staff/api/timesheets/time-projects/route.ts +3 -0
  285. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.tsx +1 -0
  286. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.tsx +67 -2
  287. package/src/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.ts +22 -3
  288. package/src/modules/staff/backend/staff/time-tracking/settings/page.tsx +405 -308
  289. package/src/modules/staff/backend/staff/time-tracking/support/page.meta.ts +14 -0
  290. package/src/modules/staff/backend/staff/time-tracking/support/page.tsx +428 -0
  291. package/src/modules/staff/cli.ts +28 -0
  292. package/src/modules/staff/commands/index.ts +3 -0
  293. package/src/modules/staff/commands/shared.ts +22 -1
  294. package/src/modules/staff/commands/support-routing-rules.ts +595 -0
  295. package/src/modules/staff/commands/support-tickets.ts +580 -0
  296. package/src/modules/staff/commands/timesheets-projects.ts +84 -13
  297. package/src/modules/staff/commands/timesheets-task-assignment.ts +319 -0
  298. package/src/modules/staff/commands/timesheets-task-comments.ts +70 -15
  299. package/src/modules/staff/commands/timesheets-tasks.ts +106 -15
  300. package/src/modules/staff/data/enrichers.ts +203 -0
  301. package/src/modules/staff/data/entities.ts +133 -2
  302. package/src/modules/staff/data/extensions.ts +9 -1
  303. package/src/modules/staff/data/validators.ts +36 -0
  304. package/src/modules/staff/encryption.ts +6 -0
  305. package/src/modules/staff/events.payloads.ts +87 -1
  306. package/src/modules/staff/events.ts +26 -0
  307. package/src/modules/staff/extension-points.ts +1 -0
  308. package/src/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.meta.ts +10 -0
  309. package/src/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.tsx +553 -0
  310. package/src/modules/staff/frontend/[orgSlug]/portal/support/new/page.meta.ts +10 -0
  311. package/src/modules/staff/frontend/[orgSlug]/portal/support/new/page.tsx +346 -0
  312. package/src/modules/staff/frontend/[orgSlug]/portal/support/page.meta.ts +17 -0
  313. package/src/modules/staff/frontend/[orgSlug]/portal/support/page.tsx +253 -0
  314. package/src/modules/staff/i18n/de.json +291 -0
  315. package/src/modules/staff/i18n/en.json +291 -0
  316. package/src/modules/staff/i18n/es.json +291 -0
  317. package/src/modules/staff/i18n/ko.json +291 -0
  318. package/src/modules/staff/i18n/pl.json +291 -0
  319. package/src/modules/staff/index.ts +1 -1
  320. package/src/modules/staff/lib/crud.ts +2 -1
  321. package/src/modules/staff/lib/support/attachments.ts +43 -0
  322. package/src/modules/staff/lib/support/dictionaries.ts +120 -0
  323. package/src/modules/staff/lib/support/notifications.ts +138 -0
  324. package/src/modules/staff/lib/support/portalAttachments.ts +140 -0
  325. package/src/modules/staff/lib/support/portalBroadcast.ts +161 -0
  326. package/src/modules/staff/lib/support/portalRoute.ts +108 -0
  327. package/src/modules/staff/lib/support/portalStatus.ts +15 -0
  328. package/src/modules/staff/lib/support/portalTickets.ts +233 -0
  329. package/src/modules/staff/lib/support/routing.ts +117 -0
  330. package/src/modules/staff/lib/support/routingRuleDraft.ts +45 -0
  331. package/src/modules/staff/lib/support/seedDefaults.ts +151 -0
  332. package/src/modules/staff/lib/support/supportActivity.ts +39 -0
  333. package/src/modules/staff/lib/support-ui/PortalSupportNotLinked.tsx +20 -0
  334. package/src/modules/staff/lib/support-ui/portalAttachmentValidation.ts +125 -0
  335. package/src/modules/staff/lib/support-ui/portalPendingUploads.ts +49 -0
  336. package/src/modules/staff/lib/support-ui/portalSupport.ts +116 -0
  337. package/src/modules/staff/lib/time-tracking/access.ts +2 -62
  338. package/src/modules/staff/lib/time-tracking/listProjectAccess.ts +78 -0
  339. package/src/modules/staff/lib/time-tracking/portalRecipients.ts +173 -5
  340. package/src/modules/staff/lib/time-tracking/projectAssignment.ts +172 -0
  341. package/src/modules/staff/lib/time-tracking/settingKeys.ts +11 -0
  342. package/src/modules/staff/lib/time-tracking/settings.ts +46 -1
  343. package/src/modules/staff/lib/time-tracking/taskAssignmentRoute.ts +165 -0
  344. package/src/modules/staff/lib/time-tracking/workRecipients.ts +183 -0
  345. package/src/modules/staff/lib/time-tracking-ui/BoardFilterChips.tsx +36 -1
  346. package/src/modules/staff/lib/time-tracking-ui/KanbanBoard.tsx +30 -0
  347. package/src/modules/staff/lib/time-tracking-ui/KanbanCard.tsx +9 -0
  348. package/src/modules/staff/lib/time-tracking-ui/ProjectFormSections.tsx +185 -6
  349. package/src/modules/staff/lib/time-tracking-ui/SupportAttachmentsSection.tsx +188 -0
  350. package/src/modules/staff/lib/time-tracking-ui/SupportRequestPanel.tsx +102 -0
  351. package/src/modules/staff/lib/time-tracking-ui/TaskBoardScreen.tsx +2 -0
  352. package/src/modules/staff/lib/time-tracking-ui/TaskCommentThread.tsx +105 -22
  353. package/src/modules/staff/lib/time-tracking-ui/TaskDrawer.tsx +278 -43
  354. package/src/modules/staff/lib/time-tracking-ui/boardDirectory.ts +21 -0
  355. package/src/modules/staff/lib/time-tracking-ui/boardFilters.ts +16 -2
  356. package/src/modules/staff/lib/time-tracking-ui/kanbanBoardData.ts +4 -0
  357. package/src/modules/staff/lib/time-tracking-ui/projectDefaultAssignee.ts +117 -0
  358. package/src/modules/staff/lib/time-tracking-ui/settingsTabs.ts +17 -0
  359. package/src/modules/staff/lib/time-tracking-ui/supportTicketData.ts +71 -0
  360. package/src/modules/staff/lib/time-tracking-ui/taskDrawerData.ts +15 -0
  361. package/src/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.ts +48 -1
  362. package/src/modules/staff/migrations/.snapshot-open-mercato.json +714 -0
  363. package/src/modules/staff/migrations/Migration20261009180543_staff.ts +50 -0
  364. package/src/modules/staff/notifications.ts +92 -0
  365. package/src/modules/staff/setup.ts +6 -2
  366. package/src/modules/staff/subscribers/support-portal-comment-created.ts +35 -0
  367. package/src/modules/staff/subscribers/support-portal-comment-deleted.ts +35 -0
  368. package/src/modules/staff/subscribers/support-portal-comment-updated.ts +35 -0
  369. package/src/modules/staff/subscribers/support-portal-status-column-updated.ts +36 -0
  370. package/src/modules/staff/subscribers/support-portal-task-status-changed.ts +34 -0
  371. package/src/modules/staff/subscribers/support-portal-task-updated.ts +34 -0
  372. package/src/modules/staff/subscribers/support-ticket-created-notification.ts +27 -0
  373. package/src/modules/staff/subscribers/support-ticket-customer-replied-notification.ts +27 -0
  374. package/src/modules/staff/subscribers/support-ticket-unnotified-clear.ts +29 -0
  375. package/src/modules/staff/subscribers/time-task-assignee-notification.ts +102 -0
  376. package/src/modules/staff/widgets/injection/portal-support-tickets/widget.client.tsx +151 -0
  377. package/src/modules/staff/widgets/injection/portal-support-tickets/widget.ts +16 -0
  378. package/src/modules/staff/widgets/injection/time-tracking-settings-support/widget.client.tsx +1058 -0
  379. package/src/modules/staff/widgets/injection/time-tracking-settings-support/widget.ts +17 -0
  380. package/src/modules/staff/widgets/injection-table.ts +15 -0
  381. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +4 -20
  382. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +4 -20
  383. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +4 -19
  384. package/src/modules/wms/lib/inventoryCsvExport.ts +18 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/staff/subscribers/support-ticket-customer-replied-notification.ts"],
4
+ "sourcesContent": ["import { createLogger } from '@open-mercato/shared/lib/logger'\nimport { notifySupportTicket } from '../lib/support/notifications'\n\nconst logger = createLogger('staff').child({ component: 'subscribers/support-ticket-customer-replied-notification' })\n\nexport const metadata = {\n event: 'staff.support_ticket.customer_replied',\n persistent: true,\n id: 'staff:support-ticket-customer-replied-notification',\n}\n\ntype ResolverContext = { resolve: <T = unknown>(name: string) => T }\n\ntype Payload = Record<string, unknown>\n\nexport default async function handle(payload: Payload, ctx: ResolverContext): Promise<void> {\n try {\n const taskId = typeof payload.taskId === 'string' ? payload.taskId : null\n const tenantId = typeof payload.tenantId === 'string' ? payload.tenantId : null\n const organizationId = typeof payload.organizationId === 'string' ? payload.organizationId : null\n if (!taskId || !tenantId || !organizationId) return\n await notifySupportTicket(ctx, { taskId, tenantId, organizationId, kind: 'customer_replied' })\n } catch (err) {\n logger.error('staff:support-ticket-customer-replied-notification failed', { err, id: payload?.id ?? null })\n throw err\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAEpC,MAAM,SAAS,aAAa,OAAO,EAAE,MAAM,EAAE,WAAW,2DAA2D,CAAC;AAE7G,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAMA,eAAO,OAA8B,SAAkB,KAAqC;AAC1F,MAAI;AACF,UAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AACrE,UAAM,WAAW,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAC3E,UAAM,iBAAiB,OAAO,QAAQ,mBAAmB,WAAW,QAAQ,iBAAiB;AAC7F,QAAI,CAAC,UAAU,CAAC,YAAY,CAAC,eAAgB;AAC7C,UAAM,oBAAoB,KAAK,EAAE,QAAQ,UAAU,gBAAgB,MAAM,mBAAmB,CAAC;AAAA,EAC/F,SAAS,KAAK;AACZ,WAAO,MAAM,6DAA6D,EAAE,KAAK,IAAI,SAAS,MAAM,KAAK,CAAC;AAC1G,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ import { clearSupportTicketUnnotified } from "../lib/support/notifications.js";
3
+ const logger = createLogger("staff").child({ component: "subscribers/support-ticket-unnotified-clear" });
4
+ const metadata = {
5
+ event: "staff.timesheets.time_task.assignee_changed",
6
+ persistent: true,
7
+ id: "staff:support-ticket-unnotified-clear"
8
+ };
9
+ async function handle(payload, ctx) {
10
+ try {
11
+ const taskId = typeof payload.id === "string" ? payload.id : null;
12
+ const tenantId = typeof payload.tenantId === "string" ? payload.tenantId : null;
13
+ const organizationId = typeof payload.organizationId === "string" ? payload.organizationId : null;
14
+ if (!taskId || !tenantId || !organizationId || !payload.assigneeStaffMemberId) return;
15
+ const em = ctx.resolve("em").fork();
16
+ await clearSupportTicketUnnotified(em, { taskId, tenantId, organizationId });
17
+ } catch (err) {
18
+ logger.error("staff:support-ticket-unnotified-clear failed", { err, id: payload?.id ?? null });
19
+ throw err;
20
+ }
21
+ }
22
+ export {
23
+ handle as default,
24
+ metadata
25
+ };
26
+ //# sourceMappingURL=support-ticket-unnotified-clear.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/staff/subscribers/support-ticket-unnotified-clear.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { clearSupportTicketUnnotified } from '../lib/support/notifications'\n\nconst logger = createLogger('staff').child({ component: 'subscribers/support-ticket-unnotified-clear' })\n\nexport const metadata = {\n event: 'staff.timesheets.time_task.assignee_changed',\n persistent: true,\n id: 'staff:support-ticket-unnotified-clear',\n}\n\ntype ResolverContext = { resolve: <T = unknown>(name: string) => T }\n\ntype Payload = Record<string, unknown>\n\nexport default async function handle(payload: Payload, ctx: ResolverContext): Promise<void> {\n try {\n const taskId = typeof payload.id === 'string' ? payload.id : null\n const tenantId = typeof payload.tenantId === 'string' ? payload.tenantId : null\n const organizationId = typeof payload.organizationId === 'string' ? payload.organizationId : null\n if (!taskId || !tenantId || !organizationId || !payload.assigneeStaffMemberId) return\n const em = (ctx.resolve('em') as EntityManager).fork()\n await clearSupportTicketUnnotified(em, { taskId, tenantId, organizationId })\n } catch (err) {\n logger.error('staff:support-ticket-unnotified-clear failed', { err, id: payload?.id ?? null })\n throw err\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,oCAAoC;AAE7C,MAAM,SAAS,aAAa,OAAO,EAAE,MAAM,EAAE,WAAW,8CAA8C,CAAC;AAEhG,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAMA,eAAO,OAA8B,SAAkB,KAAqC;AAC1F,MAAI;AACF,UAAM,SAAS,OAAO,QAAQ,OAAO,WAAW,QAAQ,KAAK;AAC7D,UAAM,WAAW,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAC3E,UAAM,iBAAiB,OAAO,QAAQ,mBAAmB,WAAW,QAAQ,iBAAiB;AAC7F,QAAI,CAAC,UAAU,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,sBAAuB;AAC/E,UAAM,KAAM,IAAI,QAAQ,IAAI,EAAoB,KAAK;AACrD,UAAM,6BAA6B,IAAI,EAAE,QAAQ,UAAU,eAAe,CAAC;AAAA,EAC7E,SAAS,KAAK;AACZ,WAAO,MAAM,gDAAgD,EAAE,KAAK,IAAI,SAAS,MAAM,KAAK,CAAC;AAC7F,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,83 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
3
+ import { notificationTypes } from "../notifications.js";
4
+ import { StaffTeamMember, StaffTimeTask } from "../data/entities.js";
5
+ import { resolveAssignmentGraceDaysFromContainer } from "../lib/time-tracking/projectAssignment.js";
6
+ import { notifyProjectWork, resolveProjectWorkRecipients } from "../lib/time-tracking/workRecipients.js";
7
+ const logger = createLogger("staff").child({ component: "subscribers/time-task-assignee-notification" });
8
+ const RELEASED_TYPE = "staff.timesheets.time_task.released";
9
+ const ASSIGNED_TYPE = "staff.timesheets.time_task.assigned";
10
+ const metadata = {
11
+ event: "staff.timesheets.time_task.assignee_changed",
12
+ persistent: true,
13
+ id: "staff:time-task-assignee-notification"
14
+ };
15
+ function planAssigneeNotification(payload) {
16
+ const kind = payload.changeKind ?? null;
17
+ const next = payload.assigneeStaffMemberId ?? null;
18
+ if (kind === "release") return "released";
19
+ if (kind === "manual") return next ? "assigned" : "released";
20
+ return null;
21
+ }
22
+ async function handle(payload, ctx) {
23
+ try {
24
+ const plan = planAssigneeNotification(payload);
25
+ const taskId = payload.id ?? null;
26
+ const tenantId = payload.tenantId ?? null;
27
+ const organizationId = payload.organizationId ?? null;
28
+ if (!plan || !taskId || !tenantId || !organizationId) return;
29
+ const scope = { tenantId, organizationId };
30
+ const em = ctx.resolve("em").fork();
31
+ const task = await em.findOne(StaffTimeTask, { id: taskId, tenantId, organizationId, deletedAt: null });
32
+ if (!task) return;
33
+ const build = {
34
+ bodyVariables: { reference: task.reference, title: task.title },
35
+ sourceEntityType: "staff:staff_time_task",
36
+ sourceEntityId: task.id,
37
+ linkHref: `/backend/staff/time-tracking/board?projectId=${encodeURIComponent(task.timeProjectId)}&task=${encodeURIComponent(task.id)}`,
38
+ groupKey: `staff:time-task-${plan}:${task.id}`
39
+ };
40
+ if (plan === "assigned") {
41
+ const typeDef2 = notificationTypes.find((type) => type.type === ASSIGNED_TYPE);
42
+ if (!typeDef2 || !task.assigneeStaffMemberId) return;
43
+ const assignee = await findOneWithDecryption(
44
+ em,
45
+ StaffTeamMember,
46
+ { id: task.assigneeStaffMemberId, tenantId, organizationId, deletedAt: null },
47
+ void 0,
48
+ scope
49
+ );
50
+ const assigneeUserId = assignee?.userId ?? null;
51
+ if (!assigneeUserId || assigneeUserId === (payload.actorUserId ?? null)) return;
52
+ await notifyProjectWork(ctx, scope, { typeDef: typeDef2, recipients: { step: 1, userIds: [assigneeUserId] }, build });
53
+ return;
54
+ }
55
+ const typeDef = notificationTypes.find((type) => type.type === RELEASED_TYPE);
56
+ if (!typeDef) return;
57
+ const graceDays = await resolveAssignmentGraceDaysFromContainer(ctx, tenantId);
58
+ const recipients = await resolveProjectWorkRecipients(em, scope, {
59
+ timeProjectId: task.timeProjectId,
60
+ actorUserId: payload.actorUserId ?? null,
61
+ graceDays
62
+ });
63
+ const result = await notifyProjectWork(ctx, scope, { typeDef, recipients, build });
64
+ if (result.notifiedCount === 0) {
65
+ logger.warn("staff released-task notification reached nobody", {
66
+ tenantId,
67
+ organizationId,
68
+ timeProjectId: task.timeProjectId,
69
+ taskId: task.id,
70
+ step: result.step
71
+ });
72
+ }
73
+ } catch (err) {
74
+ logger.error("staff task assignee notification failed", { err, taskId: payload.id ?? null });
75
+ throw err;
76
+ }
77
+ }
78
+ export {
79
+ handle as default,
80
+ metadata,
81
+ planAssigneeNotification
82
+ };
83
+ //# sourceMappingURL=time-task-assignee-notification.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/staff/subscribers/time-task-assignee-notification.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { notificationTypes } from '../notifications'\nimport { StaffTeamMember, StaffTimeTask } from '../data/entities'\nimport { resolveAssignmentGraceDaysFromContainer } from '../lib/time-tracking/projectAssignment'\nimport { notifyProjectWork, resolveProjectWorkRecipients } from '../lib/time-tracking/workRecipients'\n\nconst logger = createLogger('staff').child({ component: 'subscribers/time-task-assignee-notification' })\n\nconst RELEASED_TYPE = 'staff.timesheets.time_task.released'\nconst ASSIGNED_TYPE = 'staff.timesheets.time_task.assigned'\n\nexport const metadata = {\n event: 'staff.timesheets.time_task.assignee_changed',\n persistent: true,\n id: 'staff:time-task-assignee-notification',\n}\n\nexport type TaskAssigneeChangedPayload = {\n id?: string | null\n tenantId?: string | null\n organizationId?: string | null\n timeProjectId?: string | null\n previousAssigneeStaffMemberId?: string | null\n assigneeStaffMemberId?: string | null\n changeKind?: 'default' | 'claim' | 'release' | 'manual' | null\n actorUserId?: string | null\n}\n\ntype ResolverContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\nexport type AssigneeNotificationPlan = 'released' | 'assigned' | null\n\nexport function planAssigneeNotification(payload: TaskAssigneeChangedPayload): AssigneeNotificationPlan {\n const kind = payload.changeKind ?? null\n const next = payload.assigneeStaffMemberId ?? null\n if (kind === 'release') return 'released'\n if (kind === 'manual') return next ? 'assigned' : 'released'\n return null\n}\n\nexport default async function handle(payload: TaskAssigneeChangedPayload, ctx: ResolverContext): Promise<void> {\n try {\n const plan = planAssigneeNotification(payload)\n const taskId = payload.id ?? null\n const tenantId = payload.tenantId ?? null\n const organizationId = payload.organizationId ?? null\n if (!plan || !taskId || !tenantId || !organizationId) return\n const scope = { tenantId, organizationId }\n const em = (ctx.resolve('em') as EntityManager).fork()\n const task = await em.findOne(StaffTimeTask, { id: taskId, tenantId, organizationId, deletedAt: null })\n if (!task) return\n const build = {\n bodyVariables: { reference: task.reference, title: task.title },\n sourceEntityType: 'staff:staff_time_task',\n sourceEntityId: task.id,\n linkHref: `/backend/staff/time-tracking/board?projectId=${encodeURIComponent(task.timeProjectId)}&task=${encodeURIComponent(task.id)}`,\n groupKey: `staff:time-task-${plan}:${task.id}`,\n }\n\n if (plan === 'assigned') {\n const typeDef = notificationTypes.find((type) => type.type === ASSIGNED_TYPE)\n if (!typeDef || !task.assigneeStaffMemberId) return\n const assignee = await findOneWithDecryption(\n em,\n StaffTeamMember,\n { id: task.assigneeStaffMemberId, tenantId, organizationId, deletedAt: null },\n undefined,\n scope,\n )\n const assigneeUserId = assignee?.userId ?? null\n if (!assigneeUserId || assigneeUserId === (payload.actorUserId ?? null)) return\n await notifyProjectWork(ctx, scope, { typeDef, recipients: { step: 1, userIds: [assigneeUserId] }, build })\n return\n }\n\n const typeDef = notificationTypes.find((type) => type.type === RELEASED_TYPE)\n if (!typeDef) return\n const graceDays = await resolveAssignmentGraceDaysFromContainer(ctx, tenantId)\n const recipients = await resolveProjectWorkRecipients(em, scope, {\n timeProjectId: task.timeProjectId,\n actorUserId: payload.actorUserId ?? null,\n graceDays,\n })\n const result = await notifyProjectWork(ctx, scope, { typeDef, recipients, build })\n if (result.notifiedCount === 0) {\n logger.warn('staff released-task notification reached nobody', {\n tenantId,\n organizationId,\n timeProjectId: task.timeProjectId,\n taskId: task.id,\n step: result.step,\n })\n }\n } catch (err) {\n logger.error('staff task assignee notification failed', { err, taskId: payload.id ?? null })\n throw err\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["typeDef"]
7
+ }
@@ -0,0 +1,112 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import Link from "next/link";
5
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
6
+ import { Button } from "@open-mercato/ui/primitives/button";
7
+ import { StatusBadge } from "@open-mercato/ui/primitives/status-badge";
8
+ import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
9
+ import { ErrorMessage, LoadingMessage } from "@open-mercato/ui/backend/detail";
10
+ import { usePortalAppEvent } from "@open-mercato/ui/portal/hooks/usePortalAppEvent";
11
+ import {
12
+ PORTAL_SUPPORT_STATUS_VARIANTS,
13
+ PORTAL_SUPPORT_UPDATED_EVENT,
14
+ isPortalSupportAccountNotLinked,
15
+ portalSupportStatusLabel
16
+ } from "@open-mercato/core/modules/staff/lib/support-ui/portalSupport";
17
+ import { PortalSupportNotLinked } from "@open-mercato/core/modules/staff/lib/support-ui/PortalSupportNotLinked";
18
+ function readOrgSlug(context) {
19
+ if (!context || typeof context !== "object") return "";
20
+ const value = context.orgSlug;
21
+ return typeof value === "string" ? value : "";
22
+ }
23
+ const MAX_ITEMS = 5;
24
+ function activityTime(item) {
25
+ const value = item.lastActivityAt ?? item.updatedAt ?? item.createdAt;
26
+ return value ? new Date(value).getTime() || 0 : 0;
27
+ }
28
+ function PortalSupportTicketsWidget({ context }) {
29
+ const t = useT();
30
+ const orgSlug = readOrgSlug(context);
31
+ const [items, setItems] = React.useState([]);
32
+ const [openCount, setOpenCount] = React.useState(0);
33
+ const [canCreate, setCanCreate] = React.useState(false);
34
+ const [loading, setLoading] = React.useState(true);
35
+ const [loadFailed, setLoadFailed] = React.useState(false);
36
+ const [notLinked, setNotLinked] = React.useState(false);
37
+ const loadSeqRef = React.useRef(0);
38
+ const load = React.useCallback(async () => {
39
+ const requestSeq = loadSeqRef.current + 1;
40
+ loadSeqRef.current = requestSeq;
41
+ const isStale = () => requestSeq !== loadSeqRef.current;
42
+ try {
43
+ const [received, inProgress, options] = await Promise.all([
44
+ apiCall(`/api/staff/portal/support-tickets?status=received&pageSize=${MAX_ITEMS}`, { credentials: "include" }),
45
+ apiCall(`/api/staff/portal/support-tickets?status=in_progress&pageSize=${MAX_ITEMS}`, { credentials: "include" }),
46
+ apiCall("/api/staff/portal/support-tickets/options", { credentials: "include" })
47
+ ]);
48
+ if (isStale()) return;
49
+ const accountNotLinked = isPortalSupportAccountNotLinked(received);
50
+ setNotLinked(accountNotLinked);
51
+ if (accountNotLinked) {
52
+ setLoadFailed(false);
53
+ return;
54
+ }
55
+ if (!received.ok || !inProgress.ok) {
56
+ setLoadFailed(true);
57
+ return;
58
+ }
59
+ setLoadFailed(false);
60
+ const merged = [...received.result?.items ?? [], ...inProgress.result?.items ?? []].sort((left, right) => activityTime(right) - activityTime(left)).slice(0, MAX_ITEMS);
61
+ setItems(merged);
62
+ setOpenCount((received.result?.total ?? 0) + (inProgress.result?.total ?? 0));
63
+ setCanCreate(options.ok && options.result?.canCreate === true);
64
+ } catch {
65
+ if (!isStale()) setLoadFailed(true);
66
+ } finally {
67
+ if (!isStale()) setLoading(false);
68
+ }
69
+ }, []);
70
+ React.useEffect(() => {
71
+ void load();
72
+ }, [load]);
73
+ usePortalAppEvent(PORTAL_SUPPORT_UPDATED_EVENT, () => {
74
+ void load();
75
+ }, [load]);
76
+ if (loading) {
77
+ return /* @__PURE__ */ jsx(LoadingMessage, { label: t("staff.portal.support.widget.loading", "Loading your tickets\u2026") });
78
+ }
79
+ if (notLinked) {
80
+ return /* @__PURE__ */ jsx("div", { "data-testid": "portal-support-widget", children: /* @__PURE__ */ jsx(PortalSupportNotLinked, { size: "sm" }) });
81
+ }
82
+ if (loadFailed) {
83
+ return /* @__PURE__ */ jsx("div", { "data-testid": "portal-support-widget", children: /* @__PURE__ */ jsx(
84
+ ErrorMessage,
85
+ {
86
+ label: t("staff.portal.support.loadFailed", "Could not load your support tickets."),
87
+ action: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "outline", onClick: () => {
88
+ void load();
89
+ }, children: t("staff.portal.support.widget.retry", "Try again") })
90
+ }
91
+ ) });
92
+ }
93
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3", "data-testid": "portal-support-widget", children: [
94
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("staff.portal.support.widget.openCount", "Open tickets: {count}", { count: String(openCount) }) }),
95
+ items.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("staff.portal.support.widget.empty", "No open tickets.") }) : /* @__PURE__ */ jsx("ul", { className: "space-y-2", children: items.map((item) => /* @__PURE__ */ jsxs("li", { className: "flex items-center justify-between gap-2", children: [
96
+ /* @__PURE__ */ jsxs(Link, { href: `/${orgSlug}/portal/support/${item.id}`, className: "min-w-0 truncate text-sm text-foreground hover:underline", children: [
97
+ item.supportReference,
98
+ " \xB7 ",
99
+ item.subject
100
+ ] }),
101
+ /* @__PURE__ */ jsx(StatusBadge, { variant: PORTAL_SUPPORT_STATUS_VARIANTS[item.portalStatus] ?? "neutral", children: portalSupportStatusLabel(t, item.portalStatus) })
102
+ ] }, item.id)) }),
103
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
104
+ canCreate ? /* @__PURE__ */ jsx(Button, { size: "sm", asChild: true, children: /* @__PURE__ */ jsx(Link, { href: `/${orgSlug}/portal/support/new`, children: t("staff.portal.support.newTicket", "New ticket") }) }) : null,
105
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "outline", asChild: true, children: /* @__PURE__ */ jsx(Link, { href: `/${orgSlug}/portal/support`, children: t("staff.portal.support.widget.viewAll", "View all") }) })
106
+ ] })
107
+ ] });
108
+ }
109
+ export {
110
+ PortalSupportTicketsWidget as default
111
+ };
112
+ //# sourceMappingURL=widget.client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/staff/widgets/injection/portal-support-tickets/widget.client.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { InjectionWidgetComponentProps } from '@open-mercato/shared/modules/widgets/injection'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { ErrorMessage, LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport { usePortalAppEvent } from '@open-mercato/ui/portal/hooks/usePortalAppEvent'\nimport {\n PORTAL_SUPPORT_STATUS_VARIANTS,\n PORTAL_SUPPORT_UPDATED_EVENT,\n isPortalSupportAccountNotLinked,\n portalSupportStatusLabel,\n type PortalSupportOptions,\n type PortalSupportTicketList,\n type PortalSupportTicketListItem,\n} from '@open-mercato/core/modules/staff/lib/support-ui/portalSupport'\nimport { PortalSupportNotLinked } from '@open-mercato/core/modules/staff/lib/support-ui/PortalSupportNotLinked'\n\nfunction readOrgSlug(context: unknown): string {\n if (!context || typeof context !== 'object') return ''\n const value = (context as Record<string, unknown>).orgSlug\n return typeof value === 'string' ? value : ''\n}\n\nconst MAX_ITEMS = 5\n\nfunction activityTime(item: PortalSupportTicketListItem): number {\n const value = item.lastActivityAt ?? item.updatedAt ?? item.createdAt\n return value ? new Date(value).getTime() || 0 : 0\n}\n\nexport default function PortalSupportTicketsWidget({ context }: InjectionWidgetComponentProps) {\n const t = useT()\n const orgSlug = readOrgSlug(context)\n const [items, setItems] = React.useState<PortalSupportTicketListItem[]>([])\n const [openCount, setOpenCount] = React.useState(0)\n const [canCreate, setCanCreate] = React.useState(false)\n const [loading, setLoading] = React.useState(true)\n const [loadFailed, setLoadFailed] = React.useState(false)\n const [notLinked, setNotLinked] = React.useState(false)\n\n const loadSeqRef = React.useRef(0)\n\n const load = React.useCallback(async () => {\n const requestSeq = loadSeqRef.current + 1\n loadSeqRef.current = requestSeq\n const isStale = () => requestSeq !== loadSeqRef.current\n try {\n const [received, inProgress, options] = await Promise.all([\n apiCall<PortalSupportTicketList>(`/api/staff/portal/support-tickets?status=received&pageSize=${MAX_ITEMS}`, { credentials: 'include' }),\n apiCall<PortalSupportTicketList>(`/api/staff/portal/support-tickets?status=in_progress&pageSize=${MAX_ITEMS}`, { credentials: 'include' }),\n apiCall<PortalSupportOptions>('/api/staff/portal/support-tickets/options', { credentials: 'include' }),\n ])\n if (isStale()) return\n const accountNotLinked = isPortalSupportAccountNotLinked(received)\n setNotLinked(accountNotLinked)\n if (accountNotLinked) {\n setLoadFailed(false)\n return\n }\n if (!received.ok || !inProgress.ok) {\n setLoadFailed(true)\n return\n }\n setLoadFailed(false)\n const merged = [...(received.result?.items ?? []), ...(inProgress.result?.items ?? [])]\n .sort((left, right) => activityTime(right) - activityTime(left))\n .slice(0, MAX_ITEMS)\n setItems(merged)\n setOpenCount((received.result?.total ?? 0) + (inProgress.result?.total ?? 0))\n setCanCreate(options.ok && options.result?.canCreate === true)\n } catch {\n if (!isStale()) setLoadFailed(true)\n } finally {\n if (!isStale()) setLoading(false)\n }\n }, [])\n\n React.useEffect(() => {\n void load()\n }, [load])\n\n usePortalAppEvent(PORTAL_SUPPORT_UPDATED_EVENT, () => {\n void load()\n }, [load])\n\n if (loading) {\n return <LoadingMessage label={t('staff.portal.support.widget.loading', 'Loading your tickets\u2026')} />\n }\n\n if (notLinked) {\n return (\n <div data-testid=\"portal-support-widget\">\n <PortalSupportNotLinked size=\"sm\" />\n </div>\n )\n }\n\n if (loadFailed) {\n return (\n <div data-testid=\"portal-support-widget\">\n <ErrorMessage\n label={t('staff.portal.support.loadFailed', 'Could not load your support tickets.')}\n action={(\n <Button size=\"sm\" variant=\"outline\" onClick={() => { void load() }}>\n {t('staff.portal.support.widget.retry', 'Try again')}\n </Button>\n )}\n />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\" data-testid=\"portal-support-widget\">\n <p className=\"text-sm text-muted-foreground\">\n {t('staff.portal.support.widget.openCount', 'Open tickets: {count}', { count: String(openCount) })}\n </p>\n {items.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{t('staff.portal.support.widget.empty', 'No open tickets.')}</p>\n ) : (\n <ul className=\"space-y-2\">\n {items.map((item) => (\n <li key={item.id} className=\"flex items-center justify-between gap-2\">\n <Link href={`/${orgSlug}/portal/support/${item.id}`} className=\"min-w-0 truncate text-sm text-foreground hover:underline\">\n {item.supportReference} \u00B7 {item.subject}\n </Link>\n <StatusBadge variant={PORTAL_SUPPORT_STATUS_VARIANTS[item.portalStatus] ?? 'neutral'}>\n {portalSupportStatusLabel(t, item.portalStatus)}\n </StatusBadge>\n </li>\n ))}\n </ul>\n )}\n <div className=\"flex flex-wrap gap-2\">\n {canCreate ? (\n <Button size=\"sm\" asChild>\n <Link href={`/${orgSlug}/portal/support/new`}>{t('staff.portal.support.newTicket', 'New ticket')}</Link>\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"outline\" asChild>\n <Link href={`/${orgSlug}/portal/support`}>{t('staff.portal.support.widget.viewAll', 'View all')}</Link>\n </Button>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import PortalSupportTicketsWidget from "./widget.client.js";
2
+ const widget = {
3
+ metadata: {
4
+ id: "staff.injection.portal-support-tickets",
5
+ title: "staff.portal.support.widget.title",
6
+ description: "Your open support tickets at a glance.",
7
+ features: ["portal.support_tickets.view"],
8
+ priority: 20,
9
+ enabled: true
10
+ },
11
+ Widget: PortalSupportTicketsWidget
12
+ };
13
+ var widget_default = widget;
14
+ export {
15
+ widget_default as default
16
+ };
17
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/staff/widgets/injection/portal-support-tickets/widget.ts"],
4
+ "sourcesContent": ["import type { InjectionWidgetModule } from '@open-mercato/shared/modules/widgets/injection'\nimport PortalSupportTicketsWidget from './widget.client'\n\nconst widget: InjectionWidgetModule = {\n metadata: {\n id: 'staff.injection.portal-support-tickets',\n title: 'staff.portal.support.widget.title',\n description: 'Your open support tickets at a glance.',\n features: ['portal.support_tickets.view'],\n priority: 20,\n enabled: true,\n },\n Widget: PortalSupportTicketsWidget,\n}\n\nexport default widget\n"],
5
+ "mappings": "AACA,OAAO,gCAAgC;AAEvC,MAAM,SAAgC;AAAA,EACpC,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU,CAAC,6BAA6B;AAAA,IACxC,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AACV;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }