@open-mercato/core 0.4.5-develop-754ef4d2f0 → 0.4.5-develop-9f9549ebc8

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 (434) hide show
  1. package/dist/generated/entities/message/index.js +65 -0
  2. package/dist/generated/entities/message/index.js.map +7 -0
  3. package/dist/generated/entities/message_access_token/index.js +19 -0
  4. package/dist/generated/entities/message_access_token/index.js.map +7 -0
  5. package/dist/generated/entities/message_confirmation/index.js +21 -0
  6. package/dist/generated/entities/message_confirmation/index.js.map +7 -0
  7. package/dist/generated/entities/message_object/index.js +23 -0
  8. package/dist/generated/entities/message_object/index.js.map +7 -0
  9. package/dist/generated/entities/message_recipient/index.js +31 -0
  10. package/dist/generated/entities/message_recipient/index.js.map +7 -0
  11. package/dist/generated/entities.ids.generated.js +8 -0
  12. package/dist/generated/entities.ids.generated.js.map +2 -2
  13. package/dist/generated/entity-fields-registry.js +10 -0
  14. package/dist/generated/entity-fields-registry.js.map +2 -2
  15. package/dist/modules/auth/components/AclEditor.js +4 -2
  16. package/dist/modules/auth/components/AclEditor.js.map +2 -2
  17. package/dist/modules/auth/frontend/reset.js +3 -3
  18. package/dist/modules/auth/frontend/reset.js.map +2 -2
  19. package/dist/modules/customers/backend/customers/deals/[id]/page.js +27 -8
  20. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  21. package/dist/modules/customers/lib/messageObjectPreviews.js +131 -0
  22. package/dist/modules/customers/lib/messageObjectPreviews.js.map +7 -0
  23. package/dist/modules/customers/message-objects.js +71 -0
  24. package/dist/modules/customers/message-objects.js.map +7 -0
  25. package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js +51 -0
  26. package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js.map +7 -0
  27. package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js +35 -0
  28. package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js.map +7 -0
  29. package/dist/modules/customers/widgets/messages/index.js +7 -0
  30. package/dist/modules/customers/widgets/messages/index.js.map +7 -0
  31. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +35 -6
  32. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
  33. package/dist/modules/messages/acl.js +15 -0
  34. package/dist/modules/messages/acl.js.map +7 -0
  35. package/dist/modules/messages/api/[id]/actions/[actionId]/route.js +92 -0
  36. package/dist/modules/messages/api/[id]/actions/[actionId]/route.js.map +7 -0
  37. package/dist/modules/messages/api/[id]/archive/route.js +120 -0
  38. package/dist/modules/messages/api/[id]/archive/route.js.map +7 -0
  39. package/dist/modules/messages/api/[id]/attachments/route.js +195 -0
  40. package/dist/modules/messages/api/[id]/attachments/route.js.map +7 -0
  41. package/dist/modules/messages/api/[id]/confirmation/route.js +67 -0
  42. package/dist/modules/messages/api/[id]/confirmation/route.js.map +7 -0
  43. package/dist/modules/messages/api/[id]/conversation/archive/route.js +68 -0
  44. package/dist/modules/messages/api/[id]/conversation/archive/route.js.map +7 -0
  45. package/dist/modules/messages/api/[id]/conversation/read/route.js +68 -0
  46. package/dist/modules/messages/api/[id]/conversation/read/route.js.map +7 -0
  47. package/dist/modules/messages/api/[id]/conversation/route.js +68 -0
  48. package/dist/modules/messages/api/[id]/conversation/route.js.map +7 -0
  49. package/dist/modules/messages/api/[id]/forward/route.js +85 -0
  50. package/dist/modules/messages/api/[id]/forward/route.js.map +7 -0
  51. package/dist/modules/messages/api/[id]/forward-preview/route.js +70 -0
  52. package/dist/modules/messages/api/[id]/forward-preview/route.js.map +7 -0
  53. package/dist/modules/messages/api/[id]/read/route.js +120 -0
  54. package/dist/modules/messages/api/[id]/read/route.js.map +7 -0
  55. package/dist/modules/messages/api/[id]/reply/route.js +87 -0
  56. package/dist/modules/messages/api/[id]/reply/route.js.map +7 -0
  57. package/dist/modules/messages/api/[id]/route.js +350 -0
  58. package/dist/modules/messages/api/[id]/route.js.map +7 -0
  59. package/dist/modules/messages/api/object-types/route.js +54 -0
  60. package/dist/modules/messages/api/object-types/route.js.map +7 -0
  61. package/dist/modules/messages/api/openapi.js +261 -0
  62. package/dist/modules/messages/api/openapi.js.map +7 -0
  63. package/dist/modules/messages/api/route.js +262 -0
  64. package/dist/modules/messages/api/route.js.map +7 -0
  65. package/dist/modules/messages/api/token/[token]/route.js +99 -0
  66. package/dist/modules/messages/api/token/[token]/route.js.map +7 -0
  67. package/dist/modules/messages/api/types/route.js +40 -0
  68. package/dist/modules/messages/api/types/route.js.map +7 -0
  69. package/dist/modules/messages/api/unread-count/route.js +43 -0
  70. package/dist/modules/messages/api/unread-count/route.js.map +7 -0
  71. package/dist/modules/messages/backend/messages/[id]/page.js +10 -0
  72. package/dist/modules/messages/backend/messages/[id]/page.js.map +7 -0
  73. package/dist/modules/messages/backend/messages/[id]/page.meta.js +16 -0
  74. package/dist/modules/messages/backend/messages/[id]/page.meta.js.map +7 -0
  75. package/dist/modules/messages/backend/messages/compose/page.js +10 -0
  76. package/dist/modules/messages/backend/messages/compose/page.js.map +7 -0
  77. package/dist/modules/messages/backend/messages/compose/page.meta.js +17 -0
  78. package/dist/modules/messages/backend/messages/compose/page.meta.js.map +7 -0
  79. package/dist/modules/messages/backend/page.js +10 -0
  80. package/dist/modules/messages/backend/page.js.map +7 -0
  81. package/dist/modules/messages/backend/page.meta.js +33 -0
  82. package/dist/modules/messages/backend/page.meta.js.map +7 -0
  83. package/dist/modules/messages/commands/actions.js +265 -0
  84. package/dist/modules/messages/commands/actions.js.map +7 -0
  85. package/dist/modules/messages/commands/attachments.js +217 -0
  86. package/dist/modules/messages/commands/attachments.js.map +7 -0
  87. package/dist/modules/messages/commands/confirmations.js +151 -0
  88. package/dist/modules/messages/commands/confirmations.js.map +7 -0
  89. package/dist/modules/messages/commands/conversation.js +240 -0
  90. package/dist/modules/messages/commands/conversation.js.map +7 -0
  91. package/dist/modules/messages/commands/messages.js +748 -0
  92. package/dist/modules/messages/commands/messages.js.map +7 -0
  93. package/dist/modules/messages/commands/recipients.js +259 -0
  94. package/dist/modules/messages/commands/recipients.js.map +7 -0
  95. package/dist/modules/messages/commands/shared.js +258 -0
  96. package/dist/modules/messages/commands/shared.js.map +7 -0
  97. package/dist/modules/messages/commands/tokens.js +69 -0
  98. package/dist/modules/messages/commands/tokens.js.map +7 -0
  99. package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -0
  100. package/dist/modules/messages/components/ComposeMessagePageClient.js.map +7 -0
  101. package/dist/modules/messages/components/MessageDetailPageClient.js +261 -0
  102. package/dist/modules/messages/components/MessageDetailPageClient.js.map +7 -0
  103. package/dist/modules/messages/components/MessagesInboxPageClient.js +390 -0
  104. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +7 -0
  105. package/dist/modules/messages/components/confirmation/MessageConfirmationActions.js +31 -0
  106. package/dist/modules/messages/components/confirmation/MessageConfirmationActions.js.map +7 -0
  107. package/dist/modules/messages/components/confirmation/MessageConfirmationContent.js +69 -0
  108. package/dist/modules/messages/components/confirmation/MessageConfirmationContent.js.map +7 -0
  109. package/dist/modules/messages/components/defaults/DefaultMessageActions.js +31 -0
  110. package/dist/modules/messages/components/defaults/DefaultMessageActions.js.map +7 -0
  111. package/dist/modules/messages/components/defaults/DefaultMessageContent.js +19 -0
  112. package/dist/modules/messages/components/defaults/DefaultMessageContent.js.map +7 -0
  113. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js +90 -0
  114. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js.map +7 -0
  115. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js +86 -0
  116. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js.map +7 -0
  117. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js +61 -0
  118. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js.map +7 -0
  119. package/dist/modules/messages/components/message-detail/detail-panels.js +27 -0
  120. package/dist/modules/messages/components/message-detail/detail-panels.js.map +7 -0
  121. package/dist/modules/messages/components/message-detail/hooks/useMessageDetails.js +52 -0
  122. package/dist/modules/messages/components/message-detail/hooks/useMessageDetails.js.map +7 -0
  123. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js +289 -0
  124. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js.map +7 -0
  125. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +103 -0
  126. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +7 -0
  127. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.js +78 -0
  128. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.js.map +7 -0
  129. package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js +94 -0
  130. package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js.map +7 -0
  131. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +110 -0
  132. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +7 -0
  133. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js +58 -0
  134. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js.map +7 -0
  135. package/dist/modules/messages/components/message-detail/panels/actions-panel.js +51 -0
  136. package/dist/modules/messages/components/message-detail/panels/actions-panel.js.map +7 -0
  137. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js +66 -0
  138. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js.map +7 -0
  139. package/dist/modules/messages/components/message-detail/panels/body-panel.js +20 -0
  140. package/dist/modules/messages/components/message-detail/panels/body-panel.js.map +7 -0
  141. package/dist/modules/messages/components/message-detail/panels/composer-dialogs.js +36 -0
  142. package/dist/modules/messages/components/message-detail/panels/composer-dialogs.js.map +7 -0
  143. package/dist/modules/messages/components/message-detail/panels/dialogs.js +96 -0
  144. package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +7 -0
  145. package/dist/modules/messages/components/message-detail/panels/index.js +25 -0
  146. package/dist/modules/messages/components/message-detail/panels/index.js.map +7 -0
  147. package/dist/modules/messages/components/message-detail/panels/meta-panel.js +14 -0
  148. package/dist/modules/messages/components/message-detail/panels/meta-panel.js.map +7 -0
  149. package/dist/modules/messages/components/message-detail/panels/objects-panel.js +51 -0
  150. package/dist/modules/messages/components/message-detail/panels/objects-panel.js.map +7 -0
  151. package/dist/modules/messages/components/message-detail/panels/thread-panel.js +54 -0
  152. package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +7 -0
  153. package/dist/modules/messages/components/message-detail/types.js +1 -0
  154. package/dist/modules/messages/components/message-detail/types.js.map +7 -0
  155. package/dist/modules/messages/components/message-detail/utils.js +54 -0
  156. package/dist/modules/messages/components/message-detail/utils.js.map +7 -0
  157. package/dist/modules/messages/components/utils/PriorityBadge.js +52 -0
  158. package/dist/modules/messages/components/utils/PriorityBadge.js.map +7 -0
  159. package/dist/modules/messages/components/utils/typeUiRegistry.js +77 -0
  160. package/dist/modules/messages/components/utils/typeUiRegistry.js.map +7 -0
  161. package/dist/modules/messages/data/entities.js +309 -0
  162. package/dist/modules/messages/data/entities.js.map +7 -0
  163. package/dist/modules/messages/data/validators.js +272 -0
  164. package/dist/modules/messages/data/validators.js.map +7 -0
  165. package/dist/modules/messages/emails/MessageEmail.js +108 -0
  166. package/dist/modules/messages/emails/MessageEmail.js.map +7 -0
  167. package/dist/modules/messages/events.js +24 -0
  168. package/dist/modules/messages/events.js.map +7 -0
  169. package/dist/modules/messages/frontend/messages/view/[token]/page.js +247 -0
  170. package/dist/modules/messages/frontend/messages/view/[token]/page.js.map +7 -0
  171. package/dist/modules/messages/frontend/messages/view/[token]/page.meta.js +9 -0
  172. package/dist/modules/messages/frontend/messages/view/[token]/page.meta.js.map +7 -0
  173. package/dist/modules/messages/index.js +21 -0
  174. package/dist/modules/messages/index.js.map +7 -0
  175. package/dist/modules/messages/lib/actions.js +141 -0
  176. package/dist/modules/messages/lib/actions.js.map +7 -0
  177. package/dist/modules/messages/lib/attachments.js +131 -0
  178. package/dist/modules/messages/lib/attachments.js.map +7 -0
  179. package/dist/modules/messages/lib/constants.js +7 -0
  180. package/dist/modules/messages/lib/constants.js.map +7 -0
  181. package/dist/modules/messages/lib/email-sender.js +201 -0
  182. package/dist/modules/messages/lib/email-sender.js.map +7 -0
  183. package/dist/modules/messages/lib/forwarding.js +179 -0
  184. package/dist/modules/messages/lib/forwarding.js.map +7 -0
  185. package/dist/modules/messages/lib/message-objects-registry.js +49 -0
  186. package/dist/modules/messages/lib/message-objects-registry.js.map +7 -0
  187. package/dist/modules/messages/lib/message-types-registry.js +41 -0
  188. package/dist/modules/messages/lib/message-types-registry.js.map +7 -0
  189. package/dist/modules/messages/lib/object-validation.js +20 -0
  190. package/dist/modules/messages/lib/object-validation.js.map +7 -0
  191. package/dist/modules/messages/lib/operationMetadata.js +21 -0
  192. package/dist/modules/messages/lib/operationMetadata.js.map +7 -0
  193. package/dist/modules/messages/lib/priorityUtils.js +61 -0
  194. package/dist/modules/messages/lib/priorityUtils.js.map +7 -0
  195. package/dist/modules/messages/lib/routeHelpers.js +44 -0
  196. package/dist/modules/messages/lib/routeHelpers.js.map +7 -0
  197. package/dist/modules/messages/message-objects.js +7 -0
  198. package/dist/modules/messages/message-objects.js.map +7 -0
  199. package/dist/modules/messages/message-types.js +67 -0
  200. package/dist/modules/messages/message-types.js.map +7 -0
  201. package/dist/modules/messages/migrations/Migration20260213181243.js +31 -0
  202. package/dist/modules/messages/migrations/Migration20260213181243.js.map +7 -0
  203. package/dist/modules/messages/migrations/Migration20260215165126.js +16 -0
  204. package/dist/modules/messages/migrations/Migration20260215165126.js.map +7 -0
  205. package/dist/modules/messages/notifications.js +27 -0
  206. package/dist/modules/messages/notifications.js.map +7 -0
  207. package/dist/modules/messages/setup.js +21 -0
  208. package/dist/modules/messages/setup.js.map +7 -0
  209. package/dist/modules/messages/subscribers/message-notification.js +108 -0
  210. package/dist/modules/messages/subscribers/message-notification.js.map +7 -0
  211. package/dist/modules/messages/workers/send-email.worker.js +253 -0
  212. package/dist/modules/messages/workers/send-email.worker.js.map +7 -0
  213. package/dist/modules/sales/backend/sales/documents/[id]/page.js +30 -11
  214. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  215. package/dist/modules/sales/commands/payments.js +12 -6
  216. package/dist/modules/sales/commands/payments.js.map +2 -2
  217. package/dist/modules/sales/lib/messageObjectPreviews.js +114 -0
  218. package/dist/modules/sales/lib/messageObjectPreviews.js.map +7 -0
  219. package/dist/modules/sales/message-objects.js +57 -0
  220. package/dist/modules/sales/message-objects.js.map +7 -0
  221. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +51 -0
  222. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +7 -0
  223. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +36 -0
  224. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +7 -0
  225. package/dist/modules/sales/widgets/messages/index.js +7 -0
  226. package/dist/modules/sales/widgets/messages/index.js.map +7 -0
  227. package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +55 -1
  228. package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
  229. package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +60 -1
  230. package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
  231. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +2 -19
  232. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
  233. package/dist/modules/staff/components/LeaveRequestDetail.js +112 -0
  234. package/dist/modules/staff/components/LeaveRequestDetail.js.map +7 -0
  235. package/dist/modules/staff/components/LeaveRequestForm.js +3 -1
  236. package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
  237. package/dist/modules/staff/components/LeaveRequestPreview.js +43 -0
  238. package/dist/modules/staff/components/LeaveRequestPreview.js.map +7 -0
  239. package/dist/modules/staff/lib/messageObjectPreviews.js +148 -0
  240. package/dist/modules/staff/lib/messageObjectPreviews.js.map +7 -0
  241. package/dist/modules/staff/message-objects.js +104 -0
  242. package/dist/modules/staff/message-objects.js.map +7 -0
  243. package/dist/modules/staff/message-types.js +23 -0
  244. package/dist/modules/staff/message-types.js.map +7 -0
  245. package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js +51 -0
  246. package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js.map +7 -0
  247. package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js +34 -0
  248. package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js.map +7 -0
  249. package/dist/modules/staff/widgets/messages/index.js +7 -0
  250. package/dist/modules/staff/widgets/messages/index.js.map +7 -0
  251. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +6 -6
  252. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  253. package/generated/entities/message/index.ts +31 -0
  254. package/generated/entities/message_access_token/index.ts +8 -0
  255. package/generated/entities/message_confirmation/index.ts +9 -0
  256. package/generated/entities/message_object/index.ts +10 -0
  257. package/generated/entities/message_recipient/index.ts +14 -0
  258. package/generated/entities.ids.generated.ts +8 -0
  259. package/generated/entity-fields-registry.ts +10 -0
  260. package/jest.setup.ts +5 -0
  261. package/package.json +2 -2
  262. package/src/modules/attachments/i18n/de.json +4 -0
  263. package/src/modules/attachments/i18n/en.json +4 -0
  264. package/src/modules/attachments/i18n/es.json +4 -0
  265. package/src/modules/attachments/i18n/pl.json +4 -0
  266. package/src/modules/auth/components/AclEditor.tsx +4 -2
  267. package/src/modules/auth/frontend/reset.tsx +3 -3
  268. package/src/modules/auth/i18n/de.json +5 -0
  269. package/src/modules/auth/i18n/en.json +5 -0
  270. package/src/modules/auth/i18n/es.json +5 -0
  271. package/src/modules/auth/i18n/pl.json +5 -0
  272. package/src/modules/catalog/i18n/de.json +21 -0
  273. package/src/modules/catalog/i18n/en.json +21 -0
  274. package/src/modules/catalog/i18n/es.json +21 -0
  275. package/src/modules/catalog/i18n/pl.json +21 -0
  276. package/src/modules/currencies/i18n/de.json +6 -0
  277. package/src/modules/currencies/i18n/en.json +6 -0
  278. package/src/modules/currencies/i18n/es.json +6 -0
  279. package/src/modules/currencies/i18n/pl.json +6 -0
  280. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +20 -4
  281. package/src/modules/customers/i18n/de.json +26 -1
  282. package/src/modules/customers/i18n/en.json +25 -0
  283. package/src/modules/customers/i18n/es.json +25 -0
  284. package/src/modules/customers/i18n/pl.json +25 -0
  285. package/src/modules/customers/lib/messageObjectPreviews.ts +154 -0
  286. package/src/modules/customers/message-objects.ts +70 -0
  287. package/src/modules/customers/widgets/messages/CustomerMessageObjectDetail.tsx +57 -0
  288. package/src/modules/customers/widgets/messages/CustomerMessageObjectPreview.tsx +49 -0
  289. package/src/modules/customers/widgets/messages/index.ts +2 -0
  290. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +41 -5
  291. package/src/modules/dashboards/i18n/de.json +5 -1
  292. package/src/modules/dashboards/i18n/en.json +5 -1
  293. package/src/modules/dashboards/i18n/es.json +5 -1
  294. package/src/modules/dashboards/i18n/pl.json +5 -1
  295. package/src/modules/dictionaries/i18n/de.json +14 -1
  296. package/src/modules/dictionaries/i18n/en.json +14 -1
  297. package/src/modules/dictionaries/i18n/es.json +14 -1
  298. package/src/modules/dictionaries/i18n/pl.json +14 -1
  299. package/src/modules/feature_toggles/i18n/de.json +3 -0
  300. package/src/modules/feature_toggles/i18n/en.json +3 -0
  301. package/src/modules/feature_toggles/i18n/es.json +3 -0
  302. package/src/modules/feature_toggles/i18n/pl.json +3 -0
  303. package/src/modules/messages/acl.ts +11 -0
  304. package/src/modules/messages/api/[id]/actions/[actionId]/route.ts +103 -0
  305. package/src/modules/messages/api/[id]/archive/route.ts +138 -0
  306. package/src/modules/messages/api/[id]/attachments/route.ts +217 -0
  307. package/src/modules/messages/api/[id]/confirmation/route.ts +73 -0
  308. package/src/modules/messages/api/[id]/conversation/archive/route.ts +69 -0
  309. package/src/modules/messages/api/[id]/conversation/read/route.ts +69 -0
  310. package/src/modules/messages/api/[id]/conversation/route.ts +69 -0
  311. package/src/modules/messages/api/[id]/forward/route.ts +87 -0
  312. package/src/modules/messages/api/[id]/forward-preview/route.ts +75 -0
  313. package/src/modules/messages/api/[id]/read/route.ts +138 -0
  314. package/src/modules/messages/api/[id]/reply/route.ts +89 -0
  315. package/src/modules/messages/api/[id]/route.ts +401 -0
  316. package/src/modules/messages/api/object-types/route.ts +54 -0
  317. package/src/modules/messages/api/openapi.ts +261 -0
  318. package/src/modules/messages/api/route.ts +374 -0
  319. package/src/modules/messages/api/token/[token]/route.ts +103 -0
  320. package/src/modules/messages/api/types/route.ts +39 -0
  321. package/src/modules/messages/api/unread-count/route.ts +55 -0
  322. package/src/modules/messages/backend/messages/[id]/page.meta.ts +12 -0
  323. package/src/modules/messages/backend/messages/[id]/page.tsx +12 -0
  324. package/src/modules/messages/backend/messages/compose/page.meta.ts +13 -0
  325. package/src/modules/messages/backend/messages/compose/page.tsx +12 -0
  326. package/src/modules/messages/backend/page.meta.ts +31 -0
  327. package/src/modules/messages/backend/page.tsx +12 -0
  328. package/src/modules/messages/commands/actions.ts +307 -0
  329. package/src/modules/messages/commands/attachments.ts +227 -0
  330. package/src/modules/messages/commands/confirmations.ts +183 -0
  331. package/src/modules/messages/commands/conversation.ts +292 -0
  332. package/src/modules/messages/commands/messages.ts +845 -0
  333. package/src/modules/messages/commands/recipients.ts +281 -0
  334. package/src/modules/messages/commands/shared.ts +350 -0
  335. package/src/modules/messages/commands/tokens.ts +80 -0
  336. package/src/modules/messages/components/ComposeMessagePageClient.tsx +23 -0
  337. package/src/modules/messages/components/MessageDetailPageClient.tsx +287 -0
  338. package/src/modules/messages/components/MessagesInboxPageClient.tsx +469 -0
  339. package/src/modules/messages/components/confirmation/MessageConfirmationActions.tsx +35 -0
  340. package/src/modules/messages/components/confirmation/MessageConfirmationContent.tsx +88 -0
  341. package/src/modules/messages/components/defaults/DefaultMessageActions.tsx +37 -0
  342. package/src/modules/messages/components/defaults/DefaultMessageContent.tsx +21 -0
  343. package/src/modules/messages/components/defaults/DefaultMessageListItem.tsx +102 -0
  344. package/src/modules/messages/components/defaults/MessageRecordObjectDetail.tsx +114 -0
  345. package/src/modules/messages/components/defaults/MessageRecordObjectPreview.tsx +74 -0
  346. package/src/modules/messages/components/message-detail/detail-panels.ts +13 -0
  347. package/src/modules/messages/components/message-detail/hooks/useMessageDetails.ts +56 -0
  348. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsActions.ts +367 -0
  349. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +134 -0
  350. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.ts +102 -0
  351. package/src/modules/messages/components/message-detail/panels/MainMessageHeader.tsx +108 -0
  352. package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +144 -0
  353. package/src/modules/messages/components/message-detail/panels/MessageListComponent.tsx +63 -0
  354. package/src/modules/messages/components/message-detail/panels/actions-panel.tsx +66 -0
  355. package/src/modules/messages/components/message-detail/panels/attachments-panel.tsx +86 -0
  356. package/src/modules/messages/components/message-detail/panels/body-panel.tsx +32 -0
  357. package/src/modules/messages/components/message-detail/panels/composer-dialogs.tsx +42 -0
  358. package/src/modules/messages/components/message-detail/panels/dialogs.tsx +107 -0
  359. package/src/modules/messages/components/message-detail/panels/index.ts +11 -0
  360. package/src/modules/messages/components/message-detail/panels/meta-panel.tsx +19 -0
  361. package/src/modules/messages/components/message-detail/panels/objects-panel.tsx +65 -0
  362. package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +65 -0
  363. package/src/modules/messages/components/message-detail/types.ts +114 -0
  364. package/src/modules/messages/components/message-detail/utils.ts +62 -0
  365. package/src/modules/messages/components/utils/PriorityBadge.tsx +63 -0
  366. package/src/modules/messages/components/utils/typeUiRegistry.ts +106 -0
  367. package/src/modules/messages/data/entities.ts +284 -0
  368. package/src/modules/messages/data/validators.ts +297 -0
  369. package/src/modules/messages/emails/MessageEmail.tsx +143 -0
  370. package/src/modules/messages/events.ts +24 -0
  371. package/src/modules/messages/frontend/messages/view/[token]/page.meta.ts +5 -0
  372. package/src/modules/messages/frontend/messages/view/[token]/page.tsx +389 -0
  373. package/src/modules/messages/i18n/de.json +240 -0
  374. package/src/modules/messages/i18n/en.json +240 -0
  375. package/src/modules/messages/i18n/es.json +240 -0
  376. package/src/modules/messages/i18n/pl.json +240 -0
  377. package/src/modules/messages/index.ts +19 -0
  378. package/src/modules/messages/lib/actions.ts +204 -0
  379. package/src/modules/messages/lib/attachments.ts +197 -0
  380. package/src/modules/messages/lib/constants.ts +2 -0
  381. package/src/modules/messages/lib/email-sender.ts +255 -0
  382. package/src/modules/messages/lib/forwarding.ts +240 -0
  383. package/src/modules/messages/lib/message-objects-registry.ts +60 -0
  384. package/src/modules/messages/lib/message-types-registry.ts +48 -0
  385. package/src/modules/messages/lib/object-validation.ts +26 -0
  386. package/src/modules/messages/lib/operationMetadata.ts +43 -0
  387. package/src/modules/messages/lib/priorityUtils.ts +76 -0
  388. package/src/modules/messages/lib/routeHelpers.ts +65 -0
  389. package/src/modules/messages/message-objects.ts +5 -0
  390. package/src/modules/messages/message-types.ts +65 -0
  391. package/src/modules/messages/migrations/.snapshot-open-mercato.json +957 -0
  392. package/src/modules/messages/migrations/Migration20260213181243.ts +34 -0
  393. package/src/modules/messages/migrations/Migration20260215165126.ts +16 -0
  394. package/src/modules/messages/notifications.ts +25 -0
  395. package/src/modules/messages/setup.ts +19 -0
  396. package/src/modules/messages/subscribers/message-notification.ts +138 -0
  397. package/src/modules/messages/workers/send-email.worker.ts +321 -0
  398. package/src/modules/query_index/i18n/es.json +2 -2
  399. package/src/modules/resources/i18n/de.json +57 -0
  400. package/src/modules/resources/i18n/en.json +57 -0
  401. package/src/modules/resources/i18n/es.json +57 -0
  402. package/src/modules/resources/i18n/pl.json +57 -0
  403. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +23 -7
  404. package/src/modules/sales/commands/payments.ts +12 -6
  405. package/src/modules/sales/i18n/de.json +26 -0
  406. package/src/modules/sales/i18n/en.json +26 -0
  407. package/src/modules/sales/i18n/es.json +26 -0
  408. package/src/modules/sales/i18n/pl.json +26 -0
  409. package/src/modules/sales/lib/messageObjectPreviews.ts +150 -0
  410. package/src/modules/sales/message-objects.ts +56 -0
  411. package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +57 -0
  412. package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +46 -0
  413. package/src/modules/sales/widgets/messages/index.ts +2 -0
  414. package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +54 -0
  415. package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +58 -0
  416. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +2 -32
  417. package/src/modules/staff/components/LeaveRequestDetail.tsx +135 -0
  418. package/src/modules/staff/components/LeaveRequestForm.tsx +3 -0
  419. package/src/modules/staff/components/LeaveRequestPreview.tsx +74 -0
  420. package/src/modules/staff/i18n/de.json +22 -0
  421. package/src/modules/staff/i18n/en.json +22 -0
  422. package/src/modules/staff/i18n/es.json +22 -0
  423. package/src/modules/staff/i18n/pl.json +22 -0
  424. package/src/modules/staff/lib/messageObjectPreviews.ts +182 -0
  425. package/src/modules/staff/message-objects.ts +102 -0
  426. package/src/modules/staff/message-types.ts +21 -0
  427. package/src/modules/staff/widgets/messages/StaffMessageObjectDetail.tsx +57 -0
  428. package/src/modules/staff/widgets/messages/StaffMessageObjectPreview.tsx +44 -0
  429. package/src/modules/staff/widgets/messages/index.ts +2 -0
  430. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +6 -6
  431. package/src/modules/workflows/i18n/de.json +41 -0
  432. package/src/modules/workflows/i18n/en.json +41 -0
  433. package/src/modules/workflows/i18n/es.json +41 -0
  434. package/src/modules/workflows/i18n/pl.json +41 -0
@@ -0,0 +1,135 @@
1
+ "use client"
2
+
3
+ import * as React from 'react'
4
+ import type { ObjectDetailProps } from '@open-mercato/shared/modules/messages/types'
5
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
6
+ import { Button } from '@open-mercato/ui/primitives/button'
7
+ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
8
+ import { LeaveRequestPreview } from './LeaveRequestPreview'
9
+
10
+ export function LeaveRequestDetail(props: ObjectDetailProps) {
11
+ const t = useT()
12
+ const [executingActionId, setExecutingActionId] = React.useState<string | null>(null)
13
+ const [actionTakenByName, setActionTakenByName] = React.useState<string | null>(null)
14
+ const actionTakenAtLabel = formatDateTime(props.actionTakenAt)
15
+ const hasActionTaken = Boolean(props.actionTaken)
16
+ const actionTakenId = extractActionId(props.actionTaken)
17
+ const actionTakenLabel = resolveActionLabel(actionTakenId, props.actions, t)
18
+ const actionTakenByLabel = formatUserLabel(props.actionTakenByUserId, actionTakenByName, t)
19
+
20
+ React.useEffect(() => {
21
+ const userId = props.actionTakenByUserId
22
+ if (typeof userId !== 'string' || userId.trim().length === 0) {
23
+ setActionTakenByName(null)
24
+ return
25
+ }
26
+
27
+ let cancelled = false
28
+ const safeUserId = userId.trim()
29
+ async function loadActionTakenByUserName() {
30
+ const call = await apiCall<{ items?: Array<{ id?: string; name?: string | null; email?: string | null }> }>(
31
+ `/api/auth/users?id=${encodeURIComponent(safeUserId)}`,
32
+ )
33
+ const entry = Array.isArray(call.result?.items) ? call.result.items[0] : null
34
+ const resolvedName = typeof entry?.name === 'string' && entry.name.trim().length > 0
35
+ ? entry.name.trim()
36
+ : typeof entry?.email === 'string' && entry.email.trim().length > 0
37
+ ? entry.email.trim()
38
+ : null
39
+ if (!cancelled) {
40
+ setActionTakenByName(resolvedName)
41
+ }
42
+ }
43
+
44
+ void loadActionTakenByUserName()
45
+ return () => { cancelled = true }
46
+ }, [props.actionTakenByUserId])
47
+
48
+ return (
49
+ <div className="space-y-3 rounded border p-3">
50
+ <LeaveRequestPreview
51
+ entityId={props.entityId}
52
+ entityModule={props.entityModule}
53
+ entityType={props.entityType}
54
+ snapshot={props.snapshot}
55
+ previewData={props.previewData}
56
+ actionRequired={props.actionRequired}
57
+ actionType={props.actionType}
58
+ actionLabel={props.actionLabel}
59
+ />
60
+
61
+ {props.actions.length ? (
62
+ <div className="flex flex-wrap gap-2">
63
+ {props.actions.map((action) => (
64
+ <Button
65
+ key={action.id}
66
+ type="button"
67
+ size="sm"
68
+ variant={action.variant ?? 'default'}
69
+ disabled={executingActionId !== null || hasActionTaken}
70
+ onClick={async () => {
71
+ if (executingActionId !== null || hasActionTaken) return
72
+ setExecutingActionId(action.id)
73
+ try {
74
+ await props.onAction(action.id, { id: props.entityId })
75
+ } finally {
76
+ setExecutingActionId(null)
77
+ }
78
+ }}
79
+ >
80
+ {executingActionId === action.id
81
+ ? t('messages.actions.executing', 'Executing...')
82
+ : t(action.labelKey ?? action.id, action.id)}
83
+ </Button>
84
+ ))}
85
+ </div>
86
+ ) : null}
87
+
88
+ {hasActionTaken ? (
89
+ <p className="text-xs text-muted-foreground">
90
+ {t('messages.actions.taken', 'Action taken')}: {actionTakenLabel}
91
+ {actionTakenAtLabel ? ` (${actionTakenAtLabel})` : ''}
92
+ {actionTakenByLabel ? ` ${t('messages.actions.by', 'by')} ${actionTakenByLabel}` : ''}
93
+ </p>
94
+ ) : null}
95
+ </div>
96
+ )
97
+ }
98
+
99
+ function formatDateTime(value?: Date | string | null): string {
100
+ if (!value) return ''
101
+ const date = value instanceof Date ? value : new Date(value)
102
+ if (Number.isNaN(date.getTime())) return ''
103
+ return date.toLocaleString()
104
+ }
105
+
106
+ function extractActionId(actionTaken?: string | null): string | null {
107
+ if (!actionTaken) return null
108
+ const value = actionTaken.trim()
109
+ if (value.length === 0) return null
110
+ const parts = value.split(':')
111
+ return parts[parts.length - 1] ?? value
112
+ }
113
+
114
+ function resolveActionLabel(
115
+ actionId: string | null,
116
+ actions: ObjectDetailProps['actions'],
117
+ t: ReturnType<typeof useT>,
118
+ ): string {
119
+ if (!actionId) return '-'
120
+ const action = actions.find((item) => item.id === actionId)
121
+ if (!action) return actionId
122
+ return t(action.labelKey ?? action.id, action.id)
123
+ }
124
+
125
+ function formatUserLabel(
126
+ userId: string | null | undefined,
127
+ userName: string | null,
128
+ t: ReturnType<typeof useT>,
129
+ ): string {
130
+ if (!userId) return ''
131
+ if (userName) return userName
132
+ return t('common.user', 'user')
133
+ }
134
+
135
+ export default LeaveRequestDetail
@@ -46,6 +46,7 @@ export type LeaveRequestFormProps = {
46
46
  loadingMessage?: string
47
47
  allowMemberSelect?: boolean
48
48
  memberLabel?: string | null
49
+ extraActions?: React.ReactNode
49
50
  }
50
51
 
51
52
  const DEFAULT_TIMEZONE = 'UTC'
@@ -97,6 +98,7 @@ export function LeaveRequestForm(props: LeaveRequestFormProps) {
97
98
  loadingMessage,
98
99
  allowMemberSelect = true,
99
100
  memberLabel,
101
+ extraActions,
100
102
  } = props
101
103
  const t = useT()
102
104
  const scopeVersion = useOrganizationScopeVersion()
@@ -334,6 +336,7 @@ export function LeaveRequestForm(props: LeaveRequestFormProps) {
334
336
  cancelHref={cancelHref}
335
337
  onSubmit={onSubmit}
336
338
  onDelete={onDelete}
339
+ extraActions={extraActions}
337
340
  isLoading={isLoading}
338
341
  loadingMessage={loadingMessage}
339
342
  />
@@ -0,0 +1,74 @@
1
+ "use client"
2
+
3
+ import type { ObjectPreviewProps } from '@open-mercato/shared/modules/messages/types'
4
+ import { CalendarClock } from 'lucide-react'
5
+ import { Badge } from '@open-mercato/ui/primitives/badge'
6
+
7
+ export function LeaveRequestPreview({
8
+ snapshot,
9
+ previewData,
10
+ actionRequired,
11
+ actionLabel
12
+ }: ObjectPreviewProps) {
13
+ // Use previewData if available, otherwise fall back to snapshot
14
+ const data = snapshot as {
15
+ employeeName?: string
16
+ startDate?: string
17
+ endDate?: string
18
+ status?: string
19
+ type?: string
20
+ } | undefined
21
+
22
+ const title = previewData?.title || 'Leave Request'
23
+ const subtitle = previewData?.subtitle || (data ?
24
+ `${data.employeeName} - ${data.startDate} to ${data.endDate}` :
25
+ 'Leave Request Details'
26
+ )
27
+ const status = previewData?.status || data?.status
28
+ const statusColor = previewData?.statusColor || 'amber'
29
+
30
+ return (
31
+ <div className="flex items-start gap-3 rounded-md border p-3 bg-muted/30">
32
+ <CalendarClock className="h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0" />
33
+ <div className="flex-1 min-w-0">
34
+ <div className="flex items-center gap-2 flex-wrap">
35
+ <span className="font-medium text-sm">{title}</span>
36
+ {actionRequired && (
37
+ <Badge variant="secondary" className="text-xs">
38
+ {actionLabel || 'Action Required'}
39
+ </Badge>
40
+ )}
41
+ </div>
42
+ {subtitle && (
43
+ <p className="text-sm text-muted-foreground mt-1">
44
+ {subtitle}
45
+ </p>
46
+ )}
47
+ <div className="flex items-center gap-2 mt-2">
48
+ {status && (
49
+ <Badge variant="outline" className="text-xs">
50
+ {status}
51
+ </Badge>
52
+ )}
53
+ {data?.type && (
54
+ <Badge variant="secondary" className="text-xs">
55
+ {data.type}
56
+ </Badge>
57
+ )}
58
+ </div>
59
+ {previewData?.metadata && Object.keys(previewData.metadata).length > 0 && (
60
+ <div className="mt-2 space-y-1">
61
+ {Object.entries(previewData.metadata).slice(0, 3).map(([key, value]) => (
62
+ <div key={key} className="flex items-center gap-1 text-xs text-muted-foreground">
63
+ <span className="font-medium">{key}:</span>
64
+ <span className="truncate">{value}</span>
65
+ </div>
66
+ ))}
67
+ </div>
68
+ )}
69
+ </div>
70
+ </div>
71
+ )
72
+ }
73
+
74
+ export default LeaveRequestPreview
@@ -79,6 +79,11 @@
79
79
  "staff.audit.availabilityRuleSets.create": "Verfügbarkeitszeitplan erstellen",
80
80
  "staff.audit.availabilityRuleSets.delete": "Verfügbarkeitszeitplan löschen",
81
81
  "staff.audit.availabilityRuleSets.update": "Verfügbarkeitszeitplan aktualisieren",
82
+ "staff.audit.leaveRequests.accept": "Urlaubsantrag genehmigen",
83
+ "staff.audit.leaveRequests.create": "Urlaubsantrag erstellen",
84
+ "staff.audit.leaveRequests.delete": "Urlaubsantrag löschen",
85
+ "staff.audit.leaveRequests.reject": "Urlaubsantrag ablehnen",
86
+ "staff.audit.leaveRequests.update": "Urlaubsantrag aktualisieren",
82
87
  "staff.audit.resourceTags.assign": "Ressourcen-Tag zuweisen",
83
88
  "staff.audit.resourceTags.create": "Ressourcen-Tag erstellen",
84
89
  "staff.audit.resourceTags.delete": "Ressourcen-Tag löschen",
@@ -90,6 +95,15 @@
90
95
  "staff.audit.resources.create": "Ressource erstellen",
91
96
  "staff.audit.resources.delete": "Ressource löschen",
92
97
  "staff.audit.resources.update": "Ressource aktualisieren",
98
+ "staff.audit.teamMemberActivities.create": "Teammitglied-Aktivität erstellen",
99
+ "staff.audit.teamMemberActivities.delete": "Teammitglied-Aktivität löschen",
100
+ "staff.audit.teamMemberActivities.update": "Teammitglied-Aktivität aktualisieren",
101
+ "staff.audit.teamMemberAddresses.create": "Teammitglied-Adresse erstellen",
102
+ "staff.audit.teamMemberAddresses.delete": "Teammitglied-Adresse löschen",
103
+ "staff.audit.teamMemberAddresses.update": "Teammitglied-Adresse aktualisieren",
104
+ "staff.audit.teamMemberComments.create": "Teammitglied-Kommentar erstellen",
105
+ "staff.audit.teamMemberComments.delete": "Teammitglied-Kommentar löschen",
106
+ "staff.audit.teamMemberComments.update": "Teammitglied-Kommentar aktualisieren",
93
107
  "staff.audit.teamMemberJobHistories.create": "Eintrag im Beschäftigungsverlauf erstellen",
94
108
  "staff.audit.teamMemberJobHistories.delete": "Eintrag im Beschäftigungsverlauf löschen",
95
109
  "staff.audit.teamMemberJobHistories.update": "Eintrag im Beschäftigungsverlauf aktualisieren",
@@ -243,6 +257,10 @@
243
257
  "staff.leaveRequests.form.reason.valueLabel": "Grund",
244
258
  "staff.leaveRequests.form.reason.valuePlaceholder": "Grundname",
245
259
  "staff.leaveRequests.messages.accepted": "Urlaubsantrag genehmigt.",
260
+ "staff.leaveRequests.messages.compose.action": "Zur Prüfung senden",
261
+ "staff.leaveRequests.messages.compose.body": "Bitte prüfe diesen Urlaubsantrag und führe die passende Aktion aus.",
262
+ "staff.leaveRequests.messages.compose.subject": "Urlaubsantrag wartet auf Genehmigung",
263
+ "staff.leaveRequests.messages.contextTitle": "Verknüpfter Urlaubsantrag",
246
264
  "staff.leaveRequests.messages.rejected": "Urlaubsantrag abgelehnt.",
247
265
  "staff.leaveRequests.my.description": "Verfolge deine Urlaubsanträge.",
248
266
  "staff.leaveRequests.my.title": "Meine Urlaubsanträge",
@@ -258,6 +276,10 @@
258
276
  "staff.leaveRequests.table.search": "Urlaubsanträge suchen...",
259
277
  "staff.leaveRequests.table.status": "Status",
260
278
  "staff.leaveRequests.table.updatedAt": "Aktualisiert",
279
+ "staff.messageObjects.leaveRequest.title": "Urlaubsantrag",
280
+ "staff.messageObjects.notFound": "Nicht gefunden",
281
+ "staff.messageObjects.team.title": "Team",
282
+ "staff.messageObjects.teamMember.title": "Teammitglied",
261
283
  "staff.myAvailability.empty.profileRequired": "Erstelle dein Teamprofil, um Verfügbarkeit zu verwalten.",
262
284
  "staff.myAvailability.errors.load": "Verfügbarkeit konnte nicht geladen werden.",
263
285
  "staff.myAvailability.loading": "Verfügbarkeit wird geladen...",
@@ -79,6 +79,11 @@
79
79
  "staff.audit.availabilityRuleSets.create": "Create availability schedule",
80
80
  "staff.audit.availabilityRuleSets.delete": "Delete availability schedule",
81
81
  "staff.audit.availabilityRuleSets.update": "Update availability schedule",
82
+ "staff.audit.leaveRequests.accept": "Approve leave request",
83
+ "staff.audit.leaveRequests.create": "Create leave request",
84
+ "staff.audit.leaveRequests.delete": "Delete leave request",
85
+ "staff.audit.leaveRequests.reject": "Reject leave request",
86
+ "staff.audit.leaveRequests.update": "Update leave request",
82
87
  "staff.audit.resourceTags.assign": "Assign resource tag",
83
88
  "staff.audit.resourceTags.create": "Create resource tag",
84
89
  "staff.audit.resourceTags.delete": "Delete resource tag",
@@ -90,6 +95,15 @@
90
95
  "staff.audit.resources.create": "Create resource",
91
96
  "staff.audit.resources.delete": "Delete resource",
92
97
  "staff.audit.resources.update": "Update resource",
98
+ "staff.audit.teamMemberActivities.create": "Create team member activity",
99
+ "staff.audit.teamMemberActivities.delete": "Delete team member activity",
100
+ "staff.audit.teamMemberActivities.update": "Update team member activity",
101
+ "staff.audit.teamMemberAddresses.create": "Create team member address",
102
+ "staff.audit.teamMemberAddresses.delete": "Delete team member address",
103
+ "staff.audit.teamMemberAddresses.update": "Update team member address",
104
+ "staff.audit.teamMemberComments.create": "Create team member comment",
105
+ "staff.audit.teamMemberComments.delete": "Delete team member comment",
106
+ "staff.audit.teamMemberComments.update": "Update team member comment",
93
107
  "staff.audit.teamMemberJobHistories.create": "Create job history entry",
94
108
  "staff.audit.teamMemberJobHistories.delete": "Delete job history entry",
95
109
  "staff.audit.teamMemberJobHistories.update": "Update job history entry",
@@ -243,6 +257,10 @@
243
257
  "staff.leaveRequests.form.reason.valueLabel": "Reason",
244
258
  "staff.leaveRequests.form.reason.valuePlaceholder": "Reason name",
245
259
  "staff.leaveRequests.messages.accepted": "Leave request approved.",
260
+ "staff.leaveRequests.messages.compose.action": "Send for review",
261
+ "staff.leaveRequests.messages.compose.body": "Please review this leave request and take action.",
262
+ "staff.leaveRequests.messages.compose.subject": "Leave request approval needed",
263
+ "staff.leaveRequests.messages.contextTitle": "Linked leave request",
246
264
  "staff.leaveRequests.messages.rejected": "Leave request rejected.",
247
265
  "staff.leaveRequests.my.description": "Track your submitted leave requests.",
248
266
  "staff.leaveRequests.my.title": "My leave requests",
@@ -258,6 +276,10 @@
258
276
  "staff.leaveRequests.table.search": "Search leave requests...",
259
277
  "staff.leaveRequests.table.status": "Status",
260
278
  "staff.leaveRequests.table.updatedAt": "Updated",
279
+ "staff.messageObjects.leaveRequest.title": "Leave request",
280
+ "staff.messageObjects.notFound": "Not found",
281
+ "staff.messageObjects.team.title": "Team",
282
+ "staff.messageObjects.teamMember.title": "Team member",
261
283
  "staff.myAvailability.empty.profileRequired": "Create your team member profile to manage availability.",
262
284
  "staff.myAvailability.errors.load": "Failed to load availability.",
263
285
  "staff.myAvailability.loading": "Loading availability...",
@@ -79,6 +79,11 @@
79
79
  "staff.audit.availabilityRuleSets.create": "Crear horario de disponibilidad",
80
80
  "staff.audit.availabilityRuleSets.delete": "Eliminar horario de disponibilidad",
81
81
  "staff.audit.availabilityRuleSets.update": "Actualizar horario de disponibilidad",
82
+ "staff.audit.leaveRequests.accept": "Aprobar solicitud de ausencia",
83
+ "staff.audit.leaveRequests.create": "Crear solicitud de ausencia",
84
+ "staff.audit.leaveRequests.delete": "Eliminar solicitud de ausencia",
85
+ "staff.audit.leaveRequests.reject": "Rechazar solicitud de ausencia",
86
+ "staff.audit.leaveRequests.update": "Actualizar solicitud de ausencia",
82
87
  "staff.audit.resourceTags.assign": "Asignar etiqueta de recurso",
83
88
  "staff.audit.resourceTags.create": "Crear etiqueta de recurso",
84
89
  "staff.audit.resourceTags.delete": "Eliminar etiqueta de recurso",
@@ -90,6 +95,15 @@
90
95
  "staff.audit.resources.create": "Crear recurso",
91
96
  "staff.audit.resources.delete": "Eliminar recurso",
92
97
  "staff.audit.resources.update": "Actualizar recurso",
98
+ "staff.audit.teamMemberActivities.create": "Crear actividad de miembro del equipo",
99
+ "staff.audit.teamMemberActivities.delete": "Eliminar actividad de miembro del equipo",
100
+ "staff.audit.teamMemberActivities.update": "Actualizar actividad de miembro del equipo",
101
+ "staff.audit.teamMemberAddresses.create": "Crear dirección de miembro del equipo",
102
+ "staff.audit.teamMemberAddresses.delete": "Eliminar dirección de miembro del equipo",
103
+ "staff.audit.teamMemberAddresses.update": "Actualizar dirección de miembro del equipo",
104
+ "staff.audit.teamMemberComments.create": "Crear comentario de miembro del equipo",
105
+ "staff.audit.teamMemberComments.delete": "Eliminar comentario de miembro del equipo",
106
+ "staff.audit.teamMemberComments.update": "Actualizar comentario de miembro del equipo",
93
107
  "staff.audit.teamMemberJobHistories.create": "Crear entrada de historial laboral",
94
108
  "staff.audit.teamMemberJobHistories.delete": "Eliminar entrada de historial laboral",
95
109
  "staff.audit.teamMemberJobHistories.update": "Actualizar entrada de historial laboral",
@@ -243,6 +257,10 @@
243
257
  "staff.leaveRequests.form.reason.valueLabel": "Motivo",
244
258
  "staff.leaveRequests.form.reason.valuePlaceholder": "Nombre del motivo",
245
259
  "staff.leaveRequests.messages.accepted": "Solicitud de ausencia aprobada.",
260
+ "staff.leaveRequests.messages.compose.action": "Send for review",
261
+ "staff.leaveRequests.messages.compose.body": "Please review this leave request and take action.",
262
+ "staff.leaveRequests.messages.compose.subject": "Leave request approval needed",
263
+ "staff.leaveRequests.messages.contextTitle": "Linked leave request",
246
264
  "staff.leaveRequests.messages.rejected": "Solicitud de ausencia rechazada.",
247
265
  "staff.leaveRequests.my.description": "Sigue tus solicitudes de ausencia enviadas.",
248
266
  "staff.leaveRequests.my.title": "Mis solicitudes de ausencia",
@@ -258,6 +276,10 @@
258
276
  "staff.leaveRequests.table.search": "Buscar solicitudes de ausencia...",
259
277
  "staff.leaveRequests.table.status": "Estado",
260
278
  "staff.leaveRequests.table.updatedAt": "Actualizado",
279
+ "staff.messageObjects.leaveRequest.title": "Solicitud de permiso",
280
+ "staff.messageObjects.notFound": "No encontrado",
281
+ "staff.messageObjects.team.title": "Equipo",
282
+ "staff.messageObjects.teamMember.title": "Miembro del equipo",
261
283
  "staff.myAvailability.empty.profileRequired": "Crea tu perfil de miembro para gestionar la disponibilidad.",
262
284
  "staff.myAvailability.errors.load": "No se pudo cargar la disponibilidad.",
263
285
  "staff.myAvailability.loading": "Cargando disponibilidad...",
@@ -79,6 +79,11 @@
79
79
  "staff.audit.availabilityRuleSets.create": "Utwórz harmonogram dostępności",
80
80
  "staff.audit.availabilityRuleSets.delete": "Usuń harmonogram dostępności",
81
81
  "staff.audit.availabilityRuleSets.update": "Zaktualizuj harmonogram dostępności",
82
+ "staff.audit.leaveRequests.accept": "Zatwierdź wniosek urlopowy",
83
+ "staff.audit.leaveRequests.create": "Utwórz wniosek urlopowy",
84
+ "staff.audit.leaveRequests.delete": "Usuń wniosek urlopowy",
85
+ "staff.audit.leaveRequests.reject": "Odrzuć wniosek urlopowy",
86
+ "staff.audit.leaveRequests.update": "Zaktualizuj wniosek urlopowy",
82
87
  "staff.audit.resourceTags.assign": "Przypisz tag zasobu",
83
88
  "staff.audit.resourceTags.create": "Utwórz tag zasobu",
84
89
  "staff.audit.resourceTags.delete": "Usuń tag zasobu",
@@ -90,6 +95,15 @@
90
95
  "staff.audit.resources.create": "Utwórz zasób",
91
96
  "staff.audit.resources.delete": "Usuń zasób",
92
97
  "staff.audit.resources.update": "Zaktualizuj zasób",
98
+ "staff.audit.teamMemberActivities.create": "Utwórz aktywność członka zespołu",
99
+ "staff.audit.teamMemberActivities.delete": "Usuń aktywność członka zespołu",
100
+ "staff.audit.teamMemberActivities.update": "Zaktualizuj aktywność członka zespołu",
101
+ "staff.audit.teamMemberAddresses.create": "Utwórz adres członka zespołu",
102
+ "staff.audit.teamMemberAddresses.delete": "Usuń adres członka zespołu",
103
+ "staff.audit.teamMemberAddresses.update": "Zaktualizuj adres członka zespołu",
104
+ "staff.audit.teamMemberComments.create": "Utwórz komentarz członka zespołu",
105
+ "staff.audit.teamMemberComments.delete": "Usuń komentarz członka zespołu",
106
+ "staff.audit.teamMemberComments.update": "Zaktualizuj komentarz członka zespołu",
93
107
  "staff.audit.teamMemberJobHistories.create": "Utwórz wpis historii zatrudnienia",
94
108
  "staff.audit.teamMemberJobHistories.delete": "Usuń wpis historii zatrudnienia",
95
109
  "staff.audit.teamMemberJobHistories.update": "Zaktualizuj wpis historii zatrudnienia",
@@ -243,6 +257,10 @@
243
257
  "staff.leaveRequests.form.reason.valueLabel": "Powód",
244
258
  "staff.leaveRequests.form.reason.valuePlaceholder": "Nazwa powodu",
245
259
  "staff.leaveRequests.messages.accepted": "Wniosek urlopowy zatwierdzony.",
260
+ "staff.leaveRequests.messages.compose.action": "Wyślij do akceptacji",
261
+ "staff.leaveRequests.messages.compose.body": "Proszę sprawdzić ten wniosek urlopowy i wykonać odpowiednią akcję.",
262
+ "staff.leaveRequests.messages.compose.subject": "Wniosek urlopowy wymaga akceptacji",
263
+ "staff.leaveRequests.messages.contextTitle": "Powiązany wniosek urlopowy",
246
264
  "staff.leaveRequests.messages.rejected": "Wniosek urlopowy odrzucony.",
247
265
  "staff.leaveRequests.my.description": "Śledź swoje wnioski urlopowe.",
248
266
  "staff.leaveRequests.my.title": "Moje wnioski urlopowe",
@@ -258,6 +276,10 @@
258
276
  "staff.leaveRequests.table.search": "Szukaj wniosków urlopowych...",
259
277
  "staff.leaveRequests.table.status": "Status",
260
278
  "staff.leaveRequests.table.updatedAt": "Zaktualizowano",
279
+ "staff.messageObjects.leaveRequest.title": "Wniosek urlopowy",
280
+ "staff.messageObjects.notFound": "Nie znaleziono",
281
+ "staff.messageObjects.team.title": "Zespół",
282
+ "staff.messageObjects.teamMember.title": "Członek zespołu",
261
283
  "staff.myAvailability.empty.profileRequired": "Utwórz profil pracownika, aby zarządzać dostępnością.",
262
284
  "staff.myAvailability.errors.load": "Nie udało się załadować dostępności.",
263
285
  "staff.myAvailability.loading": "Ładowanie dostępności...",
@@ -0,0 +1,182 @@
1
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
2
+ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
3
+ import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
4
+ import type { ObjectPreviewData } from '@open-mercato/shared/modules/messages/types'
5
+ import type { EntityManager } from '@mikro-orm/postgresql'
6
+ import { StaffLeaveRequest, StaffTeam, StaffTeamMember } from '../data/entities'
7
+
8
+ type PreviewContext = {
9
+ tenantId: string
10
+ organizationId?: string | null
11
+ }
12
+
13
+ function mapStatus(status: string): { label: string; color: string } {
14
+ if (status === 'approved') {
15
+ return { label: 'Approved', color: 'green' }
16
+ }
17
+ if (status === 'rejected') {
18
+ return { label: 'Rejected', color: 'red' }
19
+ }
20
+ return { label: 'Pending', color: 'amber' }
21
+ }
22
+
23
+ function formatDate(value: Date): string {
24
+ return value.toISOString().slice(0, 10)
25
+ }
26
+
27
+ export async function loadLeaveRequestPreview(
28
+ entityId: string,
29
+ ctx: PreviewContext,
30
+ ): Promise<ObjectPreviewData> {
31
+ const { t } = await resolveTranslations()
32
+ const defaultTitle = t('staff.messageObjects.leaveRequest.title')
33
+
34
+ if (!ctx.organizationId) {
35
+ return {
36
+ title: defaultTitle,
37
+ subtitle: entityId,
38
+ }
39
+ }
40
+
41
+ const { resolve } = await createRequestContainer()
42
+ const em = resolve('em') as EntityManager
43
+
44
+ const request = await findOneWithDecryption(
45
+ em,
46
+ StaffLeaveRequest,
47
+ {
48
+ id: entityId,
49
+ tenantId: ctx.tenantId,
50
+ organizationId: ctx.organizationId,
51
+ deletedAt: null,
52
+ },
53
+ undefined,
54
+ { tenantId: ctx.tenantId, organizationId: ctx.organizationId },
55
+ )
56
+
57
+ if (!request) {
58
+ return {
59
+ title: defaultTitle,
60
+ subtitle: entityId,
61
+ status: t('staff.messageObjects.notFound'),
62
+ statusColor: 'gray',
63
+ }
64
+ }
65
+
66
+ const status = mapStatus(request.status)
67
+ const memberName = typeof request.member?.displayName === 'string' ? request.member.displayName : null
68
+ const subtitle = memberName
69
+ ? `${memberName} - ${formatDate(request.startDate)} to ${formatDate(request.endDate)}`
70
+ : `${formatDate(request.startDate)} to ${formatDate(request.endDate)}`
71
+
72
+ return {
73
+ title: 'Leave request',
74
+ subtitle,
75
+ status: status.label,
76
+ statusColor: status.color,
77
+ metadata: {
78
+ 'Start date': formatDate(request.startDate),
79
+ 'End date': formatDate(request.endDate),
80
+ Timezone: request.timezone,
81
+ },
82
+ }
83
+ }
84
+
85
+ export async function loadTeamPreview(
86
+ entityId: string,
87
+ ctx: PreviewContext,
88
+ ): Promise<ObjectPreviewData> {
89
+ const { t } = await resolveTranslations()
90
+ const defaultTitle = t('staff.messageObjects.team.title')
91
+
92
+ if (!ctx.organizationId) {
93
+ return {
94
+ title: defaultTitle,
95
+ subtitle: entityId,
96
+ }
97
+ }
98
+
99
+ const { resolve } = await createRequestContainer()
100
+ const em = resolve('em') as EntityManager
101
+
102
+ const team = await findOneWithDecryption(
103
+ em,
104
+ StaffTeam,
105
+ {
106
+ id: entityId,
107
+ tenantId: ctx.tenantId,
108
+ organizationId: ctx.organizationId,
109
+ deletedAt: null,
110
+ },
111
+ undefined,
112
+ { tenantId: ctx.tenantId, organizationId: ctx.organizationId },
113
+ )
114
+
115
+ if (!team) {
116
+ return {
117
+ title: defaultTitle,
118
+ subtitle: entityId,
119
+ status: t('staff.messageObjects.notFound'),
120
+ statusColor: 'gray',
121
+ }
122
+ }
123
+
124
+ return {
125
+ title: team.name,
126
+ subtitle: team.description ?? entityId,
127
+ status: team.isActive ? 'Active' : 'Inactive',
128
+ statusColor: team.isActive ? 'green' : 'gray',
129
+ }
130
+ }
131
+
132
+ export async function loadTeamMemberPreview(
133
+ entityId: string,
134
+ ctx: PreviewContext,
135
+ ): Promise<ObjectPreviewData> {
136
+ const { t } = await resolveTranslations()
137
+ const defaultTitle = t('staff.messageObjects.teamMember.title')
138
+
139
+ if (!ctx.organizationId) {
140
+ return {
141
+ title: defaultTitle,
142
+ subtitle: entityId,
143
+ }
144
+ }
145
+
146
+ const { resolve } = await createRequestContainer()
147
+ const em = resolve('em') as EntityManager
148
+
149
+ const member = await findOneWithDecryption(
150
+ em,
151
+ StaffTeamMember,
152
+ {
153
+ id: entityId,
154
+ tenantId: ctx.tenantId,
155
+ organizationId: ctx.organizationId,
156
+ deletedAt: null,
157
+ },
158
+ undefined,
159
+ { tenantId: ctx.tenantId, organizationId: ctx.organizationId },
160
+ )
161
+
162
+ if (!member) {
163
+ return {
164
+ title: defaultTitle,
165
+ subtitle: entityId,
166
+ status: t('staff.messageObjects.notFound'),
167
+ statusColor: 'gray',
168
+ }
169
+ }
170
+
171
+ const tags = Array.isArray(member.tags) ? member.tags : []
172
+ const metadata: Record<string, string> = {}
173
+ if (tags.length > 0) metadata.Tags = tags.slice(0, 5).join(', ')
174
+
175
+ return {
176
+ title: member.displayName,
177
+ subtitle: member.description ?? entityId,
178
+ status: member.isActive ? 'Active' : 'Inactive',
179
+ statusColor: member.isActive ? 'green' : 'gray',
180
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
181
+ }
182
+ }