@open-mercato/core 0.5.1-develop.2856.35de414092 → 0.5.1-develop.2874.77704bccbd

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 (349) hide show
  1. package/dist/modules/api_docs/frontend/docs/api/Explorer.js +18 -18
  2. package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
  3. package/dist/modules/api_keys/backend/api-keys/create/page.js +1 -1
  4. package/dist/modules/api_keys/backend/api-keys/create/page.js.map +1 -1
  5. package/dist/modules/attachments/components/AttachmentLibrary.js +2 -2
  6. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  7. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +1 -1
  8. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +1 -1
  9. package/dist/modules/attachments/fields/attachment.js +1 -1
  10. package/dist/modules/attachments/fields/attachment.js.map +1 -1
  11. package/dist/modules/audit_logs/components/ActionLogDetailsDialog.js +1 -1
  12. package/dist/modules/audit_logs/components/ActionLogDetailsDialog.js.map +2 -2
  13. package/dist/modules/audit_logs/lib/display-helpers.js +1 -1
  14. package/dist/modules/audit_logs/lib/display-helpers.js.map +1 -1
  15. package/dist/modules/auth/backend/users/create/page.js +1 -1
  16. package/dist/modules/auth/backend/users/create/page.js.map +1 -1
  17. package/dist/modules/business_rules/backend/rules/page.js +6 -6
  18. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  19. package/dist/modules/business_rules/backend/sets/page.js +2 -2
  20. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  21. package/dist/modules/business_rules/components/ActionBuilder.js +5 -5
  22. package/dist/modules/business_rules/components/ActionBuilder.js.map +2 -2
  23. package/dist/modules/business_rules/components/ActionRow.js +8 -8
  24. package/dist/modules/business_rules/components/ActionRow.js.map +1 -1
  25. package/dist/modules/business_rules/components/ConditionBuilder.js +5 -5
  26. package/dist/modules/business_rules/components/ConditionBuilder.js.map +2 -2
  27. package/dist/modules/business_rules/components/ConditionGroup.js +2 -2
  28. package/dist/modules/business_rules/components/ConditionGroup.js.map +1 -1
  29. package/dist/modules/business_rules/components/ConditionRow.js +3 -3
  30. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  31. package/dist/modules/business_rules/components/RuleSetMembers.js +8 -8
  32. package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
  33. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +2 -2
  34. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +1 -1
  35. package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -5
  36. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +1 -1
  37. package/dist/modules/catalog/components/products/MetadataEditor.js +1 -1
  38. package/dist/modules/catalog/components/products/MetadataEditor.js.map +1 -1
  39. package/dist/modules/catalog/components/products/ProductImageCell.js +1 -1
  40. package/dist/modules/catalog/components/products/ProductImageCell.js.map +1 -1
  41. package/dist/modules/catalog/components/products/VariantBuilder.js +1 -1
  42. package/dist/modules/catalog/components/products/VariantBuilder.js.map +1 -1
  43. package/dist/modules/catalog/widgets/injection/product-seo/widget.client.js +1 -1
  44. package/dist/modules/catalog/widgets/injection/product-seo/widget.client.js.map +2 -2
  45. package/dist/modules/currencies/components/CurrencyFetchingConfig.js +1 -1
  46. package/dist/modules/currencies/components/CurrencyFetchingConfig.js.map +1 -1
  47. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +2 -2
  48. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  49. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +9 -9
  50. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  51. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -7
  52. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  53. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -2
  54. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +1 -1
  55. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +3 -3
  56. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +1 -1
  57. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +2 -2
  58. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +1 -1
  59. package/dist/modules/customers/components/AddressTiles.js +1 -1
  60. package/dist/modules/customers/components/AddressTiles.js.map +1 -1
  61. package/dist/modules/customers/components/detail/ActivityForm.js +3 -3
  62. package/dist/modules/customers/components/detail/ActivityForm.js.map +1 -1
  63. package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
  64. package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +1 -1
  65. package/dist/modules/customers/components/detail/CustomFieldValuesList.js +1 -1
  66. package/dist/modules/customers/components/detail/CustomFieldValuesList.js.map +1 -1
  67. package/dist/modules/customers/components/detail/DealForm.js +1 -1
  68. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  69. package/dist/modules/customers/components/detail/DealsSection.js +1 -1
  70. package/dist/modules/customers/components/detail/DealsSection.js.map +1 -1
  71. package/dist/modules/customers/components/detail/DetailFieldsSection.js +1 -1
  72. package/dist/modules/customers/components/detail/DetailFieldsSection.js.map +1 -1
  73. package/dist/modules/customers/components/detail/InlineEditors.js +5 -5
  74. package/dist/modules/customers/components/detail/InlineEditors.js.map +2 -2
  75. package/dist/modules/customers/components/detail/TasksSection.js +1 -1
  76. package/dist/modules/customers/components/detail/TasksSection.js.map +1 -1
  77. package/dist/modules/customers/components/detail/TimelineItemHeader.js +1 -1
  78. package/dist/modules/customers/components/detail/TimelineItemHeader.js.map +1 -1
  79. package/dist/modules/customers/components/formConfig.js +2 -2
  80. package/dist/modules/customers/components/formConfig.js.map +1 -1
  81. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +1 -1
  82. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +1 -1
  83. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +2 -2
  84. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +1 -1
  85. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +1 -1
  86. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +1 -1
  87. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +1 -1
  88. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +1 -1
  89. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +1 -1
  90. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +1 -1
  91. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +1 -1
  92. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +1 -1
  93. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js +1 -1
  94. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js.map +1 -1
  95. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +1 -1
  96. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +1 -1
  97. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js +1 -1
  98. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js.map +1 -1
  99. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +1 -1
  100. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +1 -1
  101. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +2 -2
  102. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +1 -1
  103. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +1 -1
  104. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +1 -1
  105. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +1 -1
  106. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +1 -1
  107. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +2 -2
  108. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +1 -1
  109. package/dist/modules/data_sync/backend/data-sync/page.js +4 -4
  110. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  111. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +2 -2
  112. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +1 -1
  113. package/dist/modules/dictionaries/components/AppearanceSelector.js +3 -3
  114. package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
  115. package/dist/modules/dictionaries/components/DictionariesManager.js +4 -4
  116. package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
  117. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +2 -2
  118. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  119. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +3 -3
  120. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +1 -1
  121. package/dist/modules/dictionaries/fields/dictionary.js +4 -4
  122. package/dist/modules/dictionaries/fields/dictionary.js.map +1 -1
  123. package/dist/modules/entities/components/EncryptionManager.js +3 -3
  124. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  125. package/dist/modules/entities/components/UserEntitiesTable.js +1 -1
  126. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  127. package/dist/modules/feature_toggles/components/formConfig.js +1 -1
  128. package/dist/modules/feature_toggles/components/formConfig.js.map +1 -1
  129. package/dist/modules/feature_toggles/components/overrideFormConfig.js +2 -2
  130. package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +1 -1
  131. package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js +12 -12
  132. package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js.map +2 -2
  133. package/dist/modules/inbox_ops/components/messages/InboxEmailPreview.js +1 -1
  134. package/dist/modules/inbox_ops/components/messages/InboxEmailPreview.js.map +1 -1
  135. package/dist/modules/inbox_ops/components/proposals/ActionCard.js +12 -12
  136. package/dist/modules/inbox_ops/components/proposals/ActionCard.js.map +2 -2
  137. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +3 -3
  138. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
  139. package/dist/modules/integrations/backend/integrations/[id]/page.js +6 -6
  140. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  141. package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -1
  142. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +1 -1
  143. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js +1 -1
  144. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js.map +1 -1
  145. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js +1 -1
  146. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js.map +1 -1
  147. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js +1 -1
  148. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js.map +1 -1
  149. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js +1 -1
  150. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js.map +1 -1
  151. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js +1 -1
  152. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js.map +1 -1
  153. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +11 -11
  154. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  155. package/dist/modules/planner/components/AvailabilityRulesEditor.js +2 -2
  156. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  157. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +2 -2
  158. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  159. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +3 -3
  160. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
  161. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +3 -3
  162. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
  163. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js +4 -4
  164. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js.map +2 -2
  165. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +4 -4
  166. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
  167. package/dist/modules/resources/backend/resources/resources/[id]/page.js +1 -1
  168. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +1 -1
  169. package/dist/modules/sales/backend/sales/documents/[id]/page.js +4 -4
  170. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +1 -1
  171. package/dist/modules/sales/components/DocumentNumberSettings.js +1 -1
  172. package/dist/modules/sales/components/DocumentNumberSettings.js.map +1 -1
  173. package/dist/modules/sales/components/channels/ChannelOfferForm.js +1 -1
  174. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +1 -1
  175. package/dist/modules/sales/components/documents/AdjustmentDialog.js +1 -1
  176. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +1 -1
  177. package/dist/modules/sales/components/documents/DocumentTotals.js +3 -3
  178. package/dist/modules/sales/components/documents/DocumentTotals.js.map +1 -1
  179. package/dist/modules/sales/components/documents/PaymentDialog.js +1 -1
  180. package/dist/modules/sales/components/documents/PaymentDialog.js.map +1 -1
  181. package/dist/modules/sales/components/documents/SalesDocumentForm.js +2 -2
  182. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  183. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +4 -4
  184. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +1 -1
  185. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +4 -4
  186. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +1 -1
  187. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +2 -2
  188. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +1 -1
  189. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +1 -1
  190. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +1 -1
  191. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +1 -1
  192. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +1 -1
  193. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  194. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  195. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +1 -1
  196. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +1 -1
  197. package/dist/modules/translations/components/TranslationDrawerAction.js +2 -2
  198. package/dist/modules/translations/components/TranslationDrawerAction.js.map +1 -1
  199. package/dist/modules/translations/components/TranslationManager.js +3 -3
  200. package/dist/modules/translations/components/TranslationManager.js.map +1 -1
  201. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js +2 -2
  202. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js.map +1 -1
  203. package/dist/modules/workflows/backend/definitions/[id]/page.js +5 -5
  204. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
  205. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2 -2
  206. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  207. package/dist/modules/workflows/backend/events/[id]/page.js +4 -4
  208. package/dist/modules/workflows/backend/events/[id]/page.js.map +1 -1
  209. package/dist/modules/workflows/backend/instances/[id]/page.js +2 -2
  210. package/dist/modules/workflows/backend/instances/[id]/page.js.map +1 -1
  211. package/dist/modules/workflows/backend/tasks/[id]/page.js +20 -20
  212. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  213. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
  214. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +1 -1
  215. package/dist/modules/workflows/components/EdgeEditDialog.js +12 -12
  216. package/dist/modules/workflows/components/EdgeEditDialog.js.map +1 -1
  217. package/dist/modules/workflows/components/NodeEditDialog.js +26 -26
  218. package/dist/modules/workflows/components/NodeEditDialog.js.map +1 -1
  219. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
  220. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +1 -1
  221. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js +2 -2
  222. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
  223. package/dist/modules/workflows/components/mobile/MobileInstanceOverview.js +7 -7
  224. package/dist/modules/workflows/components/mobile/MobileInstanceOverview.js.map +2 -2
  225. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +11 -11
  226. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  227. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +1 -1
  228. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +1 -1
  229. package/dist/modules/workflows/components/mobile/MobileWorkflowTimeline.js +23 -23
  230. package/dist/modules/workflows/components/mobile/MobileWorkflowTimeline.js.map +2 -2
  231. package/dist/modules/workflows/frontend/checkout-demo/page.js +6 -6
  232. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +1 -1
  233. package/package.json +3 -3
  234. package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +18 -18
  235. package/src/modules/api_keys/backend/api-keys/create/page.tsx +1 -1
  236. package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -3
  237. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +1 -1
  238. package/src/modules/attachments/fields/attachment.tsx +1 -1
  239. package/src/modules/audit_logs/components/ActionLogDetailsDialog.tsx +1 -1
  240. package/src/modules/audit_logs/lib/display-helpers.tsx +1 -1
  241. package/src/modules/auth/backend/users/create/page.tsx +1 -1
  242. package/src/modules/business_rules/backend/rules/page.tsx +7 -7
  243. package/src/modules/business_rules/backend/sets/page.tsx +3 -3
  244. package/src/modules/business_rules/components/ActionBuilder.tsx +6 -6
  245. package/src/modules/business_rules/components/ActionRow.tsx +8 -8
  246. package/src/modules/business_rules/components/ConditionBuilder.tsx +6 -6
  247. package/src/modules/business_rules/components/ConditionGroup.tsx +2 -2
  248. package/src/modules/business_rules/components/ConditionRow.tsx +3 -3
  249. package/src/modules/business_rules/components/RuleSetMembers.tsx +9 -9
  250. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +2 -2
  251. package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -5
  252. package/src/modules/catalog/components/products/MetadataEditor.tsx +1 -1
  253. package/src/modules/catalog/components/products/ProductImageCell.tsx +1 -1
  254. package/src/modules/catalog/components/products/VariantBuilder.tsx +1 -1
  255. package/src/modules/catalog/widgets/injection/product-seo/widget.client.tsx +1 -1
  256. package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +1 -1
  257. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +2 -2
  258. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +10 -10
  259. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +9 -9
  260. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +2 -2
  261. package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +3 -3
  262. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +2 -2
  263. package/src/modules/customers/components/AddressTiles.tsx +1 -1
  264. package/src/modules/customers/components/detail/ActivityForm.tsx +3 -3
  265. package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
  266. package/src/modules/customers/components/detail/CustomFieldValuesList.tsx +1 -1
  267. package/src/modules/customers/components/detail/DealForm.tsx +1 -1
  268. package/src/modules/customers/components/detail/DealsSection.tsx +1 -1
  269. package/src/modules/customers/components/detail/DetailFieldsSection.tsx +1 -1
  270. package/src/modules/customers/components/detail/InlineEditors.tsx +5 -5
  271. package/src/modules/customers/components/detail/TasksSection.tsx +1 -1
  272. package/src/modules/customers/components/detail/TimelineItemHeader.tsx +1 -1
  273. package/src/modules/customers/components/formConfig.tsx +2 -2
  274. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +1 -1
  275. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +2 -2
  276. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +1 -1
  277. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +1 -1
  278. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +1 -1
  279. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +1 -1
  280. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.tsx +1 -1
  281. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +1 -1
  282. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.tsx +1 -1
  283. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +1 -1
  284. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +2 -2
  285. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +1 -1
  286. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +1 -1
  287. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +2 -2
  288. package/src/modules/data_sync/backend/data-sync/page.tsx +4 -4
  289. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +2 -2
  290. package/src/modules/dictionaries/components/AppearanceSelector.tsx +3 -3
  291. package/src/modules/dictionaries/components/DictionariesManager.tsx +4 -4
  292. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +2 -2
  293. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +3 -3
  294. package/src/modules/dictionaries/fields/dictionary.tsx +4 -4
  295. package/src/modules/entities/components/EncryptionManager.tsx +3 -3
  296. package/src/modules/entities/components/UserEntitiesTable.tsx +1 -1
  297. package/src/modules/feature_toggles/components/formConfig.tsx +1 -1
  298. package/src/modules/feature_toggles/components/overrideFormConfig.tsx +2 -2
  299. package/src/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.tsx +12 -12
  300. package/src/modules/inbox_ops/components/messages/InboxEmailPreview.tsx +1 -1
  301. package/src/modules/inbox_ops/components/proposals/ActionCard.tsx +12 -12
  302. package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +4 -4
  303. package/src/modules/integrations/backend/integrations/[id]/page.tsx +6 -6
  304. package/src/modules/messages/components/MessagesInboxPageClient.tsx +1 -1
  305. package/src/modules/messages/components/defaults/DefaultMessageListItem.tsx +1 -1
  306. package/src/modules/messages/components/defaults/MessageRecordObjectDetail.tsx +1 -1
  307. package/src/modules/messages/components/defaults/MessageRecordObjectPreview.tsx +1 -1
  308. package/src/modules/messages/components/message-detail/panels/MessageListComponent.tsx +1 -1
  309. package/src/modules/messages/components/message-detail/panels/attachments-panel.tsx +1 -1
  310. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +11 -11
  311. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +2 -2
  312. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +2 -2
  313. package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +3 -3
  314. package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +3 -3
  315. package/src/modules/portal/frontend/[orgSlug]/portal/profile/page.tsx +4 -4
  316. package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +4 -4
  317. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +1 -1
  318. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +4 -4
  319. package/src/modules/sales/components/DocumentNumberSettings.tsx +1 -1
  320. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +1 -1
  321. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +1 -1
  322. package/src/modules/sales/components/documents/DocumentTotals.tsx +3 -3
  323. package/src/modules/sales/components/documents/PaymentDialog.tsx +1 -1
  324. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +2 -2
  325. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +4 -4
  326. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +4 -4
  327. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +2 -2
  328. package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +1 -1
  329. package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +1 -1
  330. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  331. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +1 -1
  332. package/src/modules/translations/components/TranslationDrawerAction.tsx +2 -2
  333. package/src/modules/translations/components/TranslationManager.tsx +3 -3
  334. package/src/modules/translations/widgets/injection/translation-manager/widget.client.tsx +2 -2
  335. package/src/modules/workflows/backend/definitions/[id]/page.tsx +5 -5
  336. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +2 -2
  337. package/src/modules/workflows/backend/events/[id]/page.tsx +4 -4
  338. package/src/modules/workflows/backend/instances/[id]/page.tsx +2 -2
  339. package/src/modules/workflows/backend/tasks/[id]/page.tsx +23 -23
  340. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
  341. package/src/modules/workflows/components/EdgeEditDialog.tsx +12 -12
  342. package/src/modules/workflows/components/NodeEditDialog.tsx +26 -26
  343. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
  344. package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +2 -2
  345. package/src/modules/workflows/components/mobile/MobileInstanceOverview.tsx +7 -7
  346. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +14 -14
  347. package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +1 -1
  348. package/src/modules/workflows/components/mobile/MobileWorkflowTimeline.tsx +23 -23
  349. package/src/modules/workflows/frontend/checkout-demo/page.tsx +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/audit_logs/components/ActionLogDetailsDialog.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { ActionLogItem } from './AuditLogsActions'\nimport {\n ChangedFieldsTable,\n CollapsibleJsonSection,\n extractChangeRows,\n formatDate,\n formatResource,\n} from '../lib/display-helpers'\n\nexport function ActionLogDetailsDialog({ item, onClose }: { item: ActionLogItem; onClose: () => void }) {\n const t = useT()\n const noneLabel = t('audit_logs.common.none')\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n const prevOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => {\n document.body.style.overflow = prevOverflow\n document.removeEventListener('keydown', handleKey)\n }\n }, [onClose])\n\n const changeRows = React.useMemo(\n () => extractChangeRows(item.changes, item.snapshotBefore),\n [item.changes, item.snapshotBefore],\n )\n\n const hasContext = !!item.context && typeof item.context === 'object' && Object.keys(item.context).length > 0\n const snapshots = React.useMemo(() => {\n const entries: { label: string; value: unknown }[] = []\n if (item.snapshotBefore != null) {\n entries.push({ label: t('audit_logs.actions.details.snapshot_before'), value: item.snapshotBefore })\n }\n if (item.snapshotAfter != null) {\n entries.push({ label: t('audit_logs.actions.details.snapshot_after'), value: item.snapshotAfter })\n }\n return entries\n }, [item.snapshotAfter, item.snapshotBefore, t])\n\n if (!mounted) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex w-full items-end justify-center bg-black/30 p-0 backdrop-blur-sm sm:items-center sm:p-6\">\n <button\n type=\"button\"\n aria-label={t('audit_logs.actions.details.close')}\n className=\"absolute inset-0 -z-10 h-full w-full cursor-default\"\n onClick={onClose}\n />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"action-log-details-heading\"\n className=\"relative z-20 flex max-h-[90vh] w-full max-w-3xl flex-col overflow-hidden rounded-t-2xl bg-card shadow-xl sm:rounded-xl\"\n >\n <header className=\"flex items-start justify-between gap-4 border-b px-4 py-3 sm:px-6\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.details.title')}\n </p>\n <h2 id=\"action-log-details-heading\" className=\"truncate text-lg font-semibold\">\n {item.actionLabel || item.commandId}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {formatDate(item.createdAt)}\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={t('audit_logs.actions.details.close')}\n onClick={onClose}\n >\n <X className=\"size-5\" aria-hidden=\"true\" />\n </Button>\n </header>\n <div className=\"flex flex-1 flex-col gap-6 overflow-y-auto px-4 py-4 sm:px-6\">\n <section className=\"space-y-3 text-sm\">\n <dl className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.action')}\n </dt>\n <dd className=\"text-sm\">{item.actionLabel || item.commandId}</dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.resource')}\n </dt>\n <dd className=\"text-sm break-words\">\n {formatResource(item, noneLabel)}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.user')}\n </dt>\n <dd className=\"text-sm\">{item.actorUserName || item.actorUserId || noneLabel}</dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.status')}\n </dt>\n <dd className=\"text-sm capitalize\">{item.executionState}</dd>\n </div>\n </dl>\n </section>\n\n <ChangedFieldsTable changeRows={changeRows} noneLabel={noneLabel} t={t} />\n\n {hasContext ? (\n <section>\n <CollapsibleJsonSection label={t('audit_logs.actions.details.context')} value={item.context} />\n </section>\n ) : null}\n\n {snapshots.length ? (\n <section className=\"space-y-4\">\n {snapshots.map((entry) => (\n <CollapsibleJsonSection key={entry.label} label={entry.label} value={entry.value} />\n ))}\n </section>\n ) : null}\n </div>\n </div>\n </div>,\n document.body\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { ActionLogItem } from './AuditLogsActions'\nimport {\n ChangedFieldsTable,\n CollapsibleJsonSection,\n extractChangeRows,\n formatDate,\n formatResource,\n} from '../lib/display-helpers'\n\nexport function ActionLogDetailsDialog({ item, onClose }: { item: ActionLogItem; onClose: () => void }) {\n const t = useT()\n const noneLabel = t('audit_logs.common.none')\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n const prevOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => {\n document.body.style.overflow = prevOverflow\n document.removeEventListener('keydown', handleKey)\n }\n }, [onClose])\n\n const changeRows = React.useMemo(\n () => extractChangeRows(item.changes, item.snapshotBefore),\n [item.changes, item.snapshotBefore],\n )\n\n const hasContext = !!item.context && typeof item.context === 'object' && Object.keys(item.context).length > 0\n const snapshots = React.useMemo(() => {\n const entries: { label: string; value: unknown }[] = []\n if (item.snapshotBefore != null) {\n entries.push({ label: t('audit_logs.actions.details.snapshot_before'), value: item.snapshotBefore })\n }\n if (item.snapshotAfter != null) {\n entries.push({ label: t('audit_logs.actions.details.snapshot_after'), value: item.snapshotAfter })\n }\n return entries\n }, [item.snapshotAfter, item.snapshotBefore, t])\n\n if (!mounted) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-modal flex w-full items-end justify-center bg-black/50 p-0 backdrop-blur-sm sm:items-center sm:p-6\">\n <button\n type=\"button\"\n aria-label={t('audit_logs.actions.details.close')}\n className=\"absolute inset-0 -z-10 h-full w-full cursor-default\"\n onClick={onClose}\n />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"action-log-details-heading\"\n className=\"relative z-20 flex max-h-[90vh] w-full max-w-3xl flex-col overflow-hidden rounded-t-2xl bg-card shadow-xl sm:rounded-xl\"\n >\n <header className=\"flex items-start justify-between gap-4 border-b px-4 py-3 sm:px-6\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.details.title')}\n </p>\n <h2 id=\"action-log-details-heading\" className=\"truncate text-lg font-semibold\">\n {item.actionLabel || item.commandId}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {formatDate(item.createdAt)}\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={t('audit_logs.actions.details.close')}\n onClick={onClose}\n >\n <X className=\"size-5\" aria-hidden=\"true\" />\n </Button>\n </header>\n <div className=\"flex flex-1 flex-col gap-6 overflow-y-auto px-4 py-4 sm:px-6\">\n <section className=\"space-y-3 text-sm\">\n <dl className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.action')}\n </dt>\n <dd className=\"text-sm\">{item.actionLabel || item.commandId}</dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.resource')}\n </dt>\n <dd className=\"text-sm break-words\">\n {formatResource(item, noneLabel)}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.user')}\n </dt>\n <dd className=\"text-sm\">{item.actorUserName || item.actorUserId || noneLabel}</dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {t('audit_logs.actions.columns.status')}\n </dt>\n <dd className=\"text-sm capitalize\">{item.executionState}</dd>\n </div>\n </dl>\n </section>\n\n <ChangedFieldsTable changeRows={changeRows} noneLabel={noneLabel} t={t} />\n\n {hasContext ? (\n <section>\n <CollapsibleJsonSection label={t('audit_logs.actions.details.context')} value={item.context} />\n </section>\n ) : null}\n\n {snapshots.length ? (\n <section className=\"space-y-4\">\n {snapshots.map((entry) => (\n <CollapsibleJsonSection key={entry.label} label={entry.label} value={entry.value} />\n ))}\n </section>\n ) : null}\n </div>\n </div>\n </div>,\n document.body\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -19,7 +19,7 @@ function renderValue(value, fallback) {
19
19
  if (typeof value === "number" || typeof value === "bigint") return /* @__PURE__ */ jsx("span", { children: String(value) });
20
20
  if (value instanceof Date) return /* @__PURE__ */ jsx("span", { children: value.toISOString() });
21
21
  if (typeof value === "string") return /* @__PURE__ */ jsx("span", { className: "break-words", children: value });
22
- return /* @__PURE__ */ jsx("pre", { className: "max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded-md bg-muted/40 px-2 py-1 text-xs leading-5 text-muted-foreground", children: safeStringify(value) });
22
+ return /* @__PURE__ */ jsx("pre", { className: "max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded-md bg-muted/50 px-2 py-1 text-xs leading-5 text-muted-foreground", children: safeStringify(value) });
23
23
  }
24
24
  function safeStringify(value) {
25
25
  if (typeof value === "string") return value;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/audit_logs/lib/display-helpers.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport type { ChangeRow } from './changeRows'\nimport { isRecord } from './changeRows'\nexport { extractChangeRows, isRecord } from './changeRows'\nexport type { ChangeRow } from './changeRows'\n\nexport function humanizeField(field: string) {\n return field\n .replace(/[_-]+/g, ' ')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (s) => s.toUpperCase())\n}\n\nexport function normalizeChangeField(field: string) {\n const parts = field.split('.')\n const base = parts.length === 2 ? parts[1] : field\n if (base.startsWith('cf_')) return base.slice(3)\n if (base.startsWith('cf:')) return base.slice(3)\n return base\n}\n\nexport function renderValue(value: unknown, fallback: string) {\n if (value === undefined || value === null || value === '') {\n return <span className=\"text-muted-foreground\">{fallback}</span>\n }\n if (typeof value === 'boolean') return <span>{value ? 'true' : 'false'}</span>\n if (typeof value === 'number' || typeof value === 'bigint') return <span>{String(value)}</span>\n if (value instanceof Date) return <span>{value.toISOString()}</span>\n if (typeof value === 'string') return <span className=\"break-words\">{value}</span>\n return (\n <pre className=\"max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded-md bg-muted/40 px-2 py-1 text-xs leading-5 text-muted-foreground\">\n {safeStringify(value)}\n </pre>\n )\n}\n\nexport function safeStringify(value: unknown) {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nexport function formatResource(\n item: { resourceKind: string | null; resourceId: string | null },\n fallback: string,\n) {\n if (!item.resourceKind && !item.resourceId) return fallback\n return [item.resourceKind, item.resourceId].filter(Boolean).join(' \u00B7 ')\n}\n\nexport function formatDate(value: string) {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return value\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date)\n}\n\nexport type ChangedFieldsTableProps = {\n changeRows: ChangeRow[]\n noneLabel: string\n t: TranslateFn\n beforeLabel?: string\n afterLabel?: string\n}\n\nexport function ChangedFieldsTable({ changeRows, noneLabel, t, beforeLabel, afterLabel }: ChangedFieldsTableProps) {\n return (\n <section>\n <h3 className=\"text-sm font-semibold\">\n {t('audit_logs.actions.details.changed_fields')}\n </h3>\n {changeRows.length ? (\n <div className=\"mt-2 overflow-x-auto rounded-lg border\">\n <table className=\"min-w-full divide-y text-sm\">\n <thead className=\"bg-muted/50\">\n <tr>\n <th scope=\"col\" className=\"px-4 py-2 text-left font-medium text-muted-foreground\">\n {t('audit_logs.actions.details.field')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2 text-left font-medium text-muted-foreground\">\n {beforeLabel ?? t('audit_logs.actions.details.before')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2 text-left font-medium text-muted-foreground\">\n {afterLabel ?? t('audit_logs.actions.details.after')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {changeRows.map((row) => (\n <tr key={row.field} className=\"align-top\">\n <td className=\"px-4 py-2 align-top font-medium\">\n {humanizeField(normalizeChangeField(row.field))}\n </td>\n <td className=\"px-4 py-2\">\n {renderValue(row.from, noneLabel)}\n </td>\n <td className=\"px-4 py-2\">\n {renderValue(row.to, noneLabel)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {t('audit_logs.actions.details.no_changes')}\n </p>\n )}\n </section>\n )\n}\n\nexport type CollapsibleJsonSectionProps = {\n label: string\n value: unknown\n truncateAt?: number\n}\n\nconst DEFAULT_TRUNCATE_AT = 5000\n\nexport function CollapsibleJsonSection({ label, value, truncateAt = DEFAULT_TRUNCATE_AT }: CollapsibleJsonSectionProps) {\n const [isOpen, setIsOpen] = React.useState(false)\n const [showFull, setShowFull] = React.useState(false)\n\n const stringified = React.useMemo(() => (isOpen ? safeStringify(value) : ''), [isOpen, value])\n const isTruncated = stringified.length > truncateAt\n const displayText = !showFull && isTruncated ? stringified.slice(0, truncateAt) : stringified\n\n return (\n <details\n className=\"group rounded-lg border px-4 py-3\"\n onToggle={(event) => setIsOpen((event.target as HTMLDetailsElement).open)}\n >\n <summary className=\"cursor-pointer text-sm font-semibold text-foreground transition-colors group-open:text-primary\">\n {label}\n </summary>\n {isOpen ? (\n <>\n <pre className=\"mt-2 max-h-96 overflow-auto whitespace-pre-wrap break-words text-xs leading-5 text-muted-foreground\">\n {displayText}\n {!showFull && isTruncated ? '\\n\u2026' : null}\n </pre>\n {isTruncated ? (\n <button\n type=\"button\"\n className=\"mt-1 text-xs text-primary hover:underline\"\n onClick={() => setShowFull((prev) => !prev)}\n >\n {showFull ? 'Show less' : `Show all (${Math.ceil(stringified.length / 1024)} KB)`}\n </button>\n ) : null}\n </>\n ) : null}\n </details>\n )\n}\n"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport type { ChangeRow } from './changeRows'\nimport { isRecord } from './changeRows'\nexport { extractChangeRows, isRecord } from './changeRows'\nexport type { ChangeRow } from './changeRows'\n\nexport function humanizeField(field: string) {\n return field\n .replace(/[_-]+/g, ' ')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (s) => s.toUpperCase())\n}\n\nexport function normalizeChangeField(field: string) {\n const parts = field.split('.')\n const base = parts.length === 2 ? parts[1] : field\n if (base.startsWith('cf_')) return base.slice(3)\n if (base.startsWith('cf:')) return base.slice(3)\n return base\n}\n\nexport function renderValue(value: unknown, fallback: string) {\n if (value === undefined || value === null || value === '') {\n return <span className=\"text-muted-foreground\">{fallback}</span>\n }\n if (typeof value === 'boolean') return <span>{value ? 'true' : 'false'}</span>\n if (typeof value === 'number' || typeof value === 'bigint') return <span>{String(value)}</span>\n if (value instanceof Date) return <span>{value.toISOString()}</span>\n if (typeof value === 'string') return <span className=\"break-words\">{value}</span>\n return (\n <pre className=\"max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded-md bg-muted/50 px-2 py-1 text-xs leading-5 text-muted-foreground\">\n {safeStringify(value)}\n </pre>\n )\n}\n\nexport function safeStringify(value: unknown) {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nexport function formatResource(\n item: { resourceKind: string | null; resourceId: string | null },\n fallback: string,\n) {\n if (!item.resourceKind && !item.resourceId) return fallback\n return [item.resourceKind, item.resourceId].filter(Boolean).join(' \u00B7 ')\n}\n\nexport function formatDate(value: string) {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return value\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date)\n}\n\nexport type ChangedFieldsTableProps = {\n changeRows: ChangeRow[]\n noneLabel: string\n t: TranslateFn\n beforeLabel?: string\n afterLabel?: string\n}\n\nexport function ChangedFieldsTable({ changeRows, noneLabel, t, beforeLabel, afterLabel }: ChangedFieldsTableProps) {\n return (\n <section>\n <h3 className=\"text-sm font-semibold\">\n {t('audit_logs.actions.details.changed_fields')}\n </h3>\n {changeRows.length ? (\n <div className=\"mt-2 overflow-x-auto rounded-lg border\">\n <table className=\"min-w-full divide-y text-sm\">\n <thead className=\"bg-muted/50\">\n <tr>\n <th scope=\"col\" className=\"px-4 py-2 text-left font-medium text-muted-foreground\">\n {t('audit_logs.actions.details.field')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2 text-left font-medium text-muted-foreground\">\n {beforeLabel ?? t('audit_logs.actions.details.before')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2 text-left font-medium text-muted-foreground\">\n {afterLabel ?? t('audit_logs.actions.details.after')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {changeRows.map((row) => (\n <tr key={row.field} className=\"align-top\">\n <td className=\"px-4 py-2 align-top font-medium\">\n {humanizeField(normalizeChangeField(row.field))}\n </td>\n <td className=\"px-4 py-2\">\n {renderValue(row.from, noneLabel)}\n </td>\n <td className=\"px-4 py-2\">\n {renderValue(row.to, noneLabel)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {t('audit_logs.actions.details.no_changes')}\n </p>\n )}\n </section>\n )\n}\n\nexport type CollapsibleJsonSectionProps = {\n label: string\n value: unknown\n truncateAt?: number\n}\n\nconst DEFAULT_TRUNCATE_AT = 5000\n\nexport function CollapsibleJsonSection({ label, value, truncateAt = DEFAULT_TRUNCATE_AT }: CollapsibleJsonSectionProps) {\n const [isOpen, setIsOpen] = React.useState(false)\n const [showFull, setShowFull] = React.useState(false)\n\n const stringified = React.useMemo(() => (isOpen ? safeStringify(value) : ''), [isOpen, value])\n const isTruncated = stringified.length > truncateAt\n const displayText = !showFull && isTruncated ? stringified.slice(0, truncateAt) : stringified\n\n return (\n <details\n className=\"group rounded-lg border px-4 py-3\"\n onToggle={(event) => setIsOpen((event.target as HTMLDetailsElement).open)}\n >\n <summary className=\"cursor-pointer text-sm font-semibold text-foreground transition-colors group-open:text-primary\">\n {label}\n </summary>\n {isOpen ? (\n <>\n <pre className=\"mt-2 max-h-96 overflow-auto whitespace-pre-wrap break-words text-xs leading-5 text-muted-foreground\">\n {displayText}\n {!showFull && isTruncated ? '\\n\u2026' : null}\n </pre>\n {isTruncated ? (\n <button\n type=\"button\"\n className=\"mt-1 text-xs text-primary hover:underline\"\n onClick={() => setShowFull((prev) => !prev)}\n >\n {showFull ? 'Show less' : `Show all (${Math.ceil(stringified.length / 1024)} KB)`}\n </button>\n ) : null}\n </>\n ) : null}\n </details>\n )\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["isRecord"]
7
7
  }
@@ -370,7 +370,7 @@ function DashboardWidgetSelector({
370
370
  widget.description ? /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: widget.description }) : null
371
371
  ] })
372
372
  ] }, widget.id)) }),
373
- mode === "inherit" && /* @__PURE__ */ jsx("div", { className: "rounded-md border bg-muted/20 px-3 py-2 text-xs text-muted-foreground", children: t("auth.users.widgets.mode.hint", "New users inherit widgets from their assigned roles. Override to pick a custom set.") })
373
+ mode === "inherit" && /* @__PURE__ */ jsx("div", { className: "rounded-md border bg-muted/30 px-3 py-2 text-xs text-muted-foreground", children: t("auth.users.widgets.mode.hint", "New users inherit widgets from their assigned roles. Override to pick a custom set.") })
374
374
  ] })
375
375
  ] });
376
376
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/auth/backend/users/create/page.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { E } from '#generated/entities.ids.generated'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm, type CrudField, type CrudFormGroup, type CrudFieldOption } from '@open-mercato/ui/backend/CrudForm'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { OrganizationSelect } from '@open-mercato/core/modules/directory/components/OrganizationSelect'\nimport { TenantSelect } from '@open-mercato/core/modules/directory/components/TenantSelect'\nimport { fetchRoleOptions } from '@open-mercato/core/modules/auth/backend/users/roleOptions'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'\n\ntype CreateUserFormValues = {\n email: string\n password: string\n tenantId: string | null\n organizationId: string | null\n roles: string[]\n} & Record<string, unknown>\n\ntype UserListResponse = {\n isSuperAdmin?: boolean\n}\n\ntype WidgetCatalogResponse = {\n items?: Array<{ id?: string | null; title?: string | null; description?: string | null }>\n}\n\ntype TenantAwareOrganizationSelectProps = {\n fieldId: string\n value: string | null\n setValue: (value: string | null) => void\n tenantId: string | null\n includeInactiveIds?: Iterable<string | null | undefined>\n}\n\nfunction TenantAwareOrganizationSelectInput({\n fieldId,\n value,\n setValue,\n tenantId,\n includeInactiveIds,\n}: TenantAwareOrganizationSelectProps) {\n const prevTenantRef = React.useRef<string | null>(tenantId)\n const hydratedRef = React.useRef(false)\n const handleChange = React.useCallback((next: string | null) => {\n setValue(next ?? null)\n }, [setValue])\n\n React.useEffect(() => {\n if (!hydratedRef.current) {\n hydratedRef.current = true\n prevTenantRef.current = tenantId\n return\n }\n if (prevTenantRef.current !== tenantId) {\n prevTenantRef.current = tenantId\n setValue(null)\n }\n }, [tenantId, setValue])\n\n return (\n <OrganizationSelect\n id={fieldId}\n value={value}\n onChange={handleChange}\n required\n includeEmptyOption\n className=\"w-full h-9 rounded border px-2 text-sm\"\n tenantId={tenantId}\n includeInactiveIds={includeInactiveIds}\n />\n )\n}\n\nexport default function CreateUserPage() {\n const t = useT()\n const [widgetCatalog, setWidgetCatalog] = React.useState<Array<{ id: string; title: string; description: string | null }>>([])\n const [widgetLoading, setWidgetLoading] = React.useState(true)\n const [widgetError, setWidgetError] = React.useState<string | null>(null)\n const [widgetMode, setWidgetMode] = React.useState<'inherit' | 'override'>('inherit')\n const [selectedWidgets, setSelectedWidgets] = React.useState<string[]>([])\n const [selectedTenantId, setSelectedTenantId] = React.useState<string | null>(null)\n const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)\n const [actorResolved, setActorResolved] = React.useState(false)\n const [sendInviteEmail, setSendInviteEmail] = React.useState(false)\n const passwordPolicy = React.useMemo(() => getPasswordPolicy(), [])\n const passwordRequirements = React.useMemo(\n () => formatPasswordRequirements(passwordPolicy, t),\n [passwordPolicy, t],\n )\n const passwordDescription = React.useMemo(() => (\n passwordRequirements\n ? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })\n : undefined\n ), [passwordRequirements, t])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadCatalog() {\n setWidgetLoading(true)\n setWidgetError(null)\n try {\n const { ok, result } = await apiCall<WidgetCatalogResponse>('/api/dashboards/widgets/catalog')\n if (!ok) throw new Error('request_failed')\n if (!cancelled) {\n const rawItems: unknown[] = Array.isArray(result?.items) ? result?.items ?? [] : []\n const normalized = rawItems\n .map((item: unknown) => {\n if (!item || typeof item !== 'object') return null\n const entry = item as Record<string, unknown>\n const idValue = entry.id\n const titleValue = entry.title\n const descriptionValue = entry.description\n const id = typeof idValue === 'string' ? idValue : null\n if (!id || !id.length) return null\n const title = typeof titleValue === 'string' && titleValue.length > 0 ? titleValue : id\n const description = typeof descriptionValue === 'string' && descriptionValue.length > 0 ? descriptionValue : null\n return { id, title, description }\n })\n .filter((item): item is { id: string; title: string; description: string | null } => item !== null)\n setWidgetCatalog(normalized)\n }\n } catch (err) {\n console.error('Failed to load dashboard widget catalog', err)\n if (!cancelled) {\n setWidgetError(t(\n 'auth.users.widgets.errors.load',\n 'Unable to load dashboard widgets. You can configure them later from the user page.',\n ))\n }\n } finally {\n if (!cancelled) setWidgetLoading(false)\n }\n }\n loadCatalog()\n return () => { cancelled = true }\n }, [t])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadActor() {\n try {\n const { ok, result } = await apiCall<UserListResponse>('/api/auth/users?page=1&pageSize=1')\n if (!cancelled && ok) setActorIsSuperAdmin(Boolean(result?.isSuperAdmin))\n } catch (err) {\n console.error('Failed to resolve actor super admin flag', err)\n } finally {\n if (!cancelled) setActorResolved(true)\n }\n }\n loadActor()\n return () => { cancelled = true }\n }, [])\n\n const toggleWidget = React.useCallback((id: string) => {\n setSelectedWidgets((prev) => (prev.includes(id) ? prev.filter((value) => value !== id) : [...prev, id]))\n }, [])\n\n // Block role loading until we know whether the actor is a super admin. Without this guard the\n // initial (non-super-admin) branch fires before the flag resolves and the server returns roles\n // from other tenants because the real caller is a super admin without tenantId scoping.\n const loadRoleOptions = React.useCallback(async (query?: string): Promise<CrudFieldOption[]> => {\n if (!actorResolved) return []\n if (actorIsSuperAdmin) {\n if (!selectedTenantId) return []\n return fetchRoleOptions(query, { tenantId: selectedTenantId })\n }\n return fetchRoleOptions(query)\n }, [actorIsSuperAdmin, actorResolved, selectedTenantId])\n\n const fields: CrudField[] = React.useMemo(() => {\n const items: CrudField[] = [\n { id: 'email', label: t('auth.users.form.field.email', 'Email'), type: 'text', required: true },\n {\n id: 'sendInviteEmail',\n label: t('auth.users.form.field.sendInviteEmail', 'Send password setup link via email'),\n type: 'custom',\n component: () => (\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n className=\"size-4\"\n checked={sendInviteEmail}\n onChange={(e) => setSendInviteEmail(e.target.checked)}\n />\n {t('auth.users.form.field.sendInviteEmailHint', 'Invite user to set their own password via a secure email link')}\n </label>\n ),\n },\n ...(!sendInviteEmail ? [{\n id: 'password',\n label: t('auth.users.form.field.password', 'Password'),\n type: 'password' as const,\n required: true,\n description: passwordDescription,\n }] : []),\n ]\n if (actorIsSuperAdmin) {\n items.push({\n id: 'tenantId',\n label: t('auth.users.form.field.tenant', 'Tenant'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const normalizedValue = typeof value === 'string'\n ? value\n : (typeof selectedTenantId === 'string' ? selectedTenantId : null)\n return (\n <TenantSelect\n id=\"tenantId\"\n value={normalizedValue}\n onChange={(next) => {\n const resolved = next ?? null\n setValue(resolved)\n setSelectedTenantId(resolved)\n }}\n includeEmptyOption\n className=\"w-full h-9 rounded border px-2 text-sm\"\n required\n />\n )\n },\n })\n }\n items.push({\n id: 'organizationId',\n label: t('auth.users.form.field.organization', 'Organization'),\n type: 'custom',\n required: true,\n component: ({ id, value, setValue }) => {\n const normalizedValue = typeof value === 'string' ? value : null\n return (\n <TenantAwareOrganizationSelectInput\n fieldId={id}\n value={normalizedValue}\n setValue={(next) => setValue(next ?? null)}\n tenantId={selectedTenantId}\n />\n )\n },\n })\n items.push({ id: 'roles', label: t('auth.users.form.field.roles', 'Roles'), type: 'tags', loadOptions: loadRoleOptions })\n return items\n }, [actorIsSuperAdmin, loadRoleOptions, passwordDescription, selectedTenantId, sendInviteEmail, t])\n\n const detailFieldIds = React.useMemo(() => {\n const base: string[] = sendInviteEmail\n ? ['email', 'sendInviteEmail', 'organizationId', 'roles']\n : ['email', 'sendInviteEmail', 'password', 'organizationId', 'roles']\n if (actorIsSuperAdmin) {\n const orgIdx = base.indexOf('organizationId')\n base.splice(orgIdx, 0, 'tenantId')\n }\n return base\n }, [actorIsSuperAdmin, sendInviteEmail])\n\n const groups: CrudFormGroup[] = React.useMemo(() => [\n { id: 'details', title: t('auth.users.form.group.details', 'Details'), column: 1, fields: detailFieldIds },\n {\n id: 'acl',\n title: t('auth.users.form.group.access', 'Access'),\n column: 1,\n component: () => (\n <div className=\"text-sm text-muted-foreground\">\n {t('auth.users.form.aclHint', 'ACL can be edited after creating the user.')}\n </div>\n ),\n },\n { id: 'custom', title: t('auth.users.form.group.customFields', 'Custom Data'), column: 2, kind: 'customFields' },\n {\n id: 'dashboardWidgets',\n title: t('auth.users.form.group.widgets', 'Dashboard Widgets'),\n column: 2,\n component: () => (\n <DashboardWidgetSelector\n catalog={widgetCatalog}\n loading={widgetLoading}\n error={widgetError}\n mode={widgetMode}\n onModeChange={setWidgetMode}\n selected={selectedWidgets}\n onToggle={toggleWidget}\n />\n ),\n },\n ], [detailFieldIds, t, widgetCatalog, widgetError, widgetLoading, widgetMode, selectedWidgets, toggleWidget])\n\n const initialValues = React.useMemo<Partial<CreateUserFormValues>>(\n () => ({\n email: '',\n password: '',\n tenantId: null,\n organizationId: null,\n roles: [],\n }),\n [],\n )\n\n return (\n <Page>\n <PageBody>\n <CrudForm<CreateUserFormValues>\n title={t('auth.users.form.title.create', 'Create User')}\n backHref=\"/backend/users\"\n fields={fields}\n groups={groups}\n entityId={E.auth.user}\n initialValues={initialValues}\n submitLabel={t('auth.users.form.action.create', 'Create')}\n cancelHref=\"/backend/users\"\n successRedirect={`/backend/users?flash=${encodeURIComponent(\n sendInviteEmail\n ? t('auth.users.flash.createdWithInvite', 'User created and invitation sent')\n : t('auth.users.flash.created', 'User created')\n )}&type=success`}\n onSubmit={async (values) => {\n const customFields = collectCustomFieldValues(values)\n const payload: Record<string, unknown> = {\n email: values.email,\n organizationId: values.organizationId ? values.organizationId : null,\n roles: Array.isArray(values.roles) ? values.roles : [],\n ...(Object.keys(customFields).length ? { customFields } : {}),\n }\n if (sendInviteEmail) {\n payload.sendInviteEmail = true\n } else {\n payload.password = values.password\n }\n if (actorIsSuperAdmin) {\n const rawTenant = typeof values.tenantId === 'string' ? values.tenantId.trim() : null\n payload.tenantId = rawTenant && rawTenant.length ? rawTenant : null\n }\n const { result: created } = await createCrud<{ id?: string; _warning?: string }>('auth/users', payload)\n const newUserId = typeof created?.id === 'string' ? created.id : null\n if (created?._warning === 'invite_email_failed') {\n const msg = t('auth.users.flash.createdEmailFailed', 'User created but invitation email could not be sent. You can resend it from the user page.')\n window.location.href = `/backend/users?flash=${encodeURIComponent(msg)}&type=warning`\n return\n }\n\n if (widgetMode === 'override' && newUserId) {\n await updateCrud('dashboards/users/widgets', {\n userId: newUserId,\n mode: 'override',\n widgetIds: selectedWidgets,\n organizationId: values.organizationId ? values.organizationId : null,\n tenantId: actorIsSuperAdmin\n ? (typeof values.tenantId === 'string' && values.tenantId.length ? values.tenantId : null)\n : null,\n }, {\n errorMessage: t('auth.users.form.errors.widgetsAssign', 'Failed to assign dashboard widgets to the new user'),\n })\n }\n }}\n />\n </PageBody>\n </Page>\n )\n}\n\nfunction DashboardWidgetSelector({\n catalog,\n loading,\n error,\n mode,\n onModeChange,\n selected,\n onToggle,\n}: {\n catalog: Array<{ id: string; title: string; description: string | null }>\n loading: boolean\n error: string | null\n mode: 'inherit' | 'override'\n onModeChange: (mode: 'inherit' | 'override') => void\n selected: string[]\n onToggle: (id: string) => void\n}) {\n const t = useT()\n if (loading) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner size=\"sm\" /> {t('auth.users.widgets.loading', 'Loading widgets\u2026')}\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive\">{error}</div>\n )}\n {!error && (\n <>\n <div className=\"flex items-center gap-3 rounded-md border bg-muted/30 px-3 py-2\">\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n value=\"inherit\"\n checked={mode === 'inherit'}\n onChange={() => onModeChange('inherit')}\n />\n {t('auth.users.widgets.mode.inherit', 'Inherit from roles')}\n </label>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n value=\"override\"\n checked={mode === 'override'}\n onChange={() => onModeChange('override')}\n />\n {t('auth.users.widgets.mode.override', 'Override for this user')}\n </label>\n </div>\n {mode === 'override' && (\n <div className=\"space-y-2\">\n {catalog.map((widget) => (\n <label key={widget.id} className=\"flex items-start gap-3 rounded-md border px-3 py-2 hover:border-primary/40\">\n <input\n type=\"checkbox\"\n className=\"mt-1 size-4\"\n checked={selected.includes(widget.id)}\n onChange={() => onToggle(widget.id)}\n />\n <div>\n <div className=\"text-sm font-medium leading-none\">{widget.title}</div>\n {widget.description ? <div className=\"text-xs text-muted-foreground\">{widget.description}</div> : null}\n </div>\n </label>\n ))}\n </div>\n )}\n {mode === 'inherit' && (\n <div className=\"rounded-md border bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n {t('auth.users.widgets.mode.hint', 'New users inherit widgets from their assigned roles. Override to pick a custom set.')}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n"],
4
+ "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { E } from '#generated/entities.ids.generated'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm, type CrudField, type CrudFormGroup, type CrudFieldOption } from '@open-mercato/ui/backend/CrudForm'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { OrganizationSelect } from '@open-mercato/core/modules/directory/components/OrganizationSelect'\nimport { TenantSelect } from '@open-mercato/core/modules/directory/components/TenantSelect'\nimport { fetchRoleOptions } from '@open-mercato/core/modules/auth/backend/users/roleOptions'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'\n\ntype CreateUserFormValues = {\n email: string\n password: string\n tenantId: string | null\n organizationId: string | null\n roles: string[]\n} & Record<string, unknown>\n\ntype UserListResponse = {\n isSuperAdmin?: boolean\n}\n\ntype WidgetCatalogResponse = {\n items?: Array<{ id?: string | null; title?: string | null; description?: string | null }>\n}\n\ntype TenantAwareOrganizationSelectProps = {\n fieldId: string\n value: string | null\n setValue: (value: string | null) => void\n tenantId: string | null\n includeInactiveIds?: Iterable<string | null | undefined>\n}\n\nfunction TenantAwareOrganizationSelectInput({\n fieldId,\n value,\n setValue,\n tenantId,\n includeInactiveIds,\n}: TenantAwareOrganizationSelectProps) {\n const prevTenantRef = React.useRef<string | null>(tenantId)\n const hydratedRef = React.useRef(false)\n const handleChange = React.useCallback((next: string | null) => {\n setValue(next ?? null)\n }, [setValue])\n\n React.useEffect(() => {\n if (!hydratedRef.current) {\n hydratedRef.current = true\n prevTenantRef.current = tenantId\n return\n }\n if (prevTenantRef.current !== tenantId) {\n prevTenantRef.current = tenantId\n setValue(null)\n }\n }, [tenantId, setValue])\n\n return (\n <OrganizationSelect\n id={fieldId}\n value={value}\n onChange={handleChange}\n required\n includeEmptyOption\n className=\"w-full h-9 rounded border px-2 text-sm\"\n tenantId={tenantId}\n includeInactiveIds={includeInactiveIds}\n />\n )\n}\n\nexport default function CreateUserPage() {\n const t = useT()\n const [widgetCatalog, setWidgetCatalog] = React.useState<Array<{ id: string; title: string; description: string | null }>>([])\n const [widgetLoading, setWidgetLoading] = React.useState(true)\n const [widgetError, setWidgetError] = React.useState<string | null>(null)\n const [widgetMode, setWidgetMode] = React.useState<'inherit' | 'override'>('inherit')\n const [selectedWidgets, setSelectedWidgets] = React.useState<string[]>([])\n const [selectedTenantId, setSelectedTenantId] = React.useState<string | null>(null)\n const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)\n const [actorResolved, setActorResolved] = React.useState(false)\n const [sendInviteEmail, setSendInviteEmail] = React.useState(false)\n const passwordPolicy = React.useMemo(() => getPasswordPolicy(), [])\n const passwordRequirements = React.useMemo(\n () => formatPasswordRequirements(passwordPolicy, t),\n [passwordPolicy, t],\n )\n const passwordDescription = React.useMemo(() => (\n passwordRequirements\n ? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })\n : undefined\n ), [passwordRequirements, t])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadCatalog() {\n setWidgetLoading(true)\n setWidgetError(null)\n try {\n const { ok, result } = await apiCall<WidgetCatalogResponse>('/api/dashboards/widgets/catalog')\n if (!ok) throw new Error('request_failed')\n if (!cancelled) {\n const rawItems: unknown[] = Array.isArray(result?.items) ? result?.items ?? [] : []\n const normalized = rawItems\n .map((item: unknown) => {\n if (!item || typeof item !== 'object') return null\n const entry = item as Record<string, unknown>\n const idValue = entry.id\n const titleValue = entry.title\n const descriptionValue = entry.description\n const id = typeof idValue === 'string' ? idValue : null\n if (!id || !id.length) return null\n const title = typeof titleValue === 'string' && titleValue.length > 0 ? titleValue : id\n const description = typeof descriptionValue === 'string' && descriptionValue.length > 0 ? descriptionValue : null\n return { id, title, description }\n })\n .filter((item): item is { id: string; title: string; description: string | null } => item !== null)\n setWidgetCatalog(normalized)\n }\n } catch (err) {\n console.error('Failed to load dashboard widget catalog', err)\n if (!cancelled) {\n setWidgetError(t(\n 'auth.users.widgets.errors.load',\n 'Unable to load dashboard widgets. You can configure them later from the user page.',\n ))\n }\n } finally {\n if (!cancelled) setWidgetLoading(false)\n }\n }\n loadCatalog()\n return () => { cancelled = true }\n }, [t])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadActor() {\n try {\n const { ok, result } = await apiCall<UserListResponse>('/api/auth/users?page=1&pageSize=1')\n if (!cancelled && ok) setActorIsSuperAdmin(Boolean(result?.isSuperAdmin))\n } catch (err) {\n console.error('Failed to resolve actor super admin flag', err)\n } finally {\n if (!cancelled) setActorResolved(true)\n }\n }\n loadActor()\n return () => { cancelled = true }\n }, [])\n\n const toggleWidget = React.useCallback((id: string) => {\n setSelectedWidgets((prev) => (prev.includes(id) ? prev.filter((value) => value !== id) : [...prev, id]))\n }, [])\n\n // Block role loading until we know whether the actor is a super admin. Without this guard the\n // initial (non-super-admin) branch fires before the flag resolves and the server returns roles\n // from other tenants because the real caller is a super admin without tenantId scoping.\n const loadRoleOptions = React.useCallback(async (query?: string): Promise<CrudFieldOption[]> => {\n if (!actorResolved) return []\n if (actorIsSuperAdmin) {\n if (!selectedTenantId) return []\n return fetchRoleOptions(query, { tenantId: selectedTenantId })\n }\n return fetchRoleOptions(query)\n }, [actorIsSuperAdmin, actorResolved, selectedTenantId])\n\n const fields: CrudField[] = React.useMemo(() => {\n const items: CrudField[] = [\n { id: 'email', label: t('auth.users.form.field.email', 'Email'), type: 'text', required: true },\n {\n id: 'sendInviteEmail',\n label: t('auth.users.form.field.sendInviteEmail', 'Send password setup link via email'),\n type: 'custom',\n component: () => (\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n className=\"size-4\"\n checked={sendInviteEmail}\n onChange={(e) => setSendInviteEmail(e.target.checked)}\n />\n {t('auth.users.form.field.sendInviteEmailHint', 'Invite user to set their own password via a secure email link')}\n </label>\n ),\n },\n ...(!sendInviteEmail ? [{\n id: 'password',\n label: t('auth.users.form.field.password', 'Password'),\n type: 'password' as const,\n required: true,\n description: passwordDescription,\n }] : []),\n ]\n if (actorIsSuperAdmin) {\n items.push({\n id: 'tenantId',\n label: t('auth.users.form.field.tenant', 'Tenant'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const normalizedValue = typeof value === 'string'\n ? value\n : (typeof selectedTenantId === 'string' ? selectedTenantId : null)\n return (\n <TenantSelect\n id=\"tenantId\"\n value={normalizedValue}\n onChange={(next) => {\n const resolved = next ?? null\n setValue(resolved)\n setSelectedTenantId(resolved)\n }}\n includeEmptyOption\n className=\"w-full h-9 rounded border px-2 text-sm\"\n required\n />\n )\n },\n })\n }\n items.push({\n id: 'organizationId',\n label: t('auth.users.form.field.organization', 'Organization'),\n type: 'custom',\n required: true,\n component: ({ id, value, setValue }) => {\n const normalizedValue = typeof value === 'string' ? value : null\n return (\n <TenantAwareOrganizationSelectInput\n fieldId={id}\n value={normalizedValue}\n setValue={(next) => setValue(next ?? null)}\n tenantId={selectedTenantId}\n />\n )\n },\n })\n items.push({ id: 'roles', label: t('auth.users.form.field.roles', 'Roles'), type: 'tags', loadOptions: loadRoleOptions })\n return items\n }, [actorIsSuperAdmin, loadRoleOptions, passwordDescription, selectedTenantId, sendInviteEmail, t])\n\n const detailFieldIds = React.useMemo(() => {\n const base: string[] = sendInviteEmail\n ? ['email', 'sendInviteEmail', 'organizationId', 'roles']\n : ['email', 'sendInviteEmail', 'password', 'organizationId', 'roles']\n if (actorIsSuperAdmin) {\n const orgIdx = base.indexOf('organizationId')\n base.splice(orgIdx, 0, 'tenantId')\n }\n return base\n }, [actorIsSuperAdmin, sendInviteEmail])\n\n const groups: CrudFormGroup[] = React.useMemo(() => [\n { id: 'details', title: t('auth.users.form.group.details', 'Details'), column: 1, fields: detailFieldIds },\n {\n id: 'acl',\n title: t('auth.users.form.group.access', 'Access'),\n column: 1,\n component: () => (\n <div className=\"text-sm text-muted-foreground\">\n {t('auth.users.form.aclHint', 'ACL can be edited after creating the user.')}\n </div>\n ),\n },\n { id: 'custom', title: t('auth.users.form.group.customFields', 'Custom Data'), column: 2, kind: 'customFields' },\n {\n id: 'dashboardWidgets',\n title: t('auth.users.form.group.widgets', 'Dashboard Widgets'),\n column: 2,\n component: () => (\n <DashboardWidgetSelector\n catalog={widgetCatalog}\n loading={widgetLoading}\n error={widgetError}\n mode={widgetMode}\n onModeChange={setWidgetMode}\n selected={selectedWidgets}\n onToggle={toggleWidget}\n />\n ),\n },\n ], [detailFieldIds, t, widgetCatalog, widgetError, widgetLoading, widgetMode, selectedWidgets, toggleWidget])\n\n const initialValues = React.useMemo<Partial<CreateUserFormValues>>(\n () => ({\n email: '',\n password: '',\n tenantId: null,\n organizationId: null,\n roles: [],\n }),\n [],\n )\n\n return (\n <Page>\n <PageBody>\n <CrudForm<CreateUserFormValues>\n title={t('auth.users.form.title.create', 'Create User')}\n backHref=\"/backend/users\"\n fields={fields}\n groups={groups}\n entityId={E.auth.user}\n initialValues={initialValues}\n submitLabel={t('auth.users.form.action.create', 'Create')}\n cancelHref=\"/backend/users\"\n successRedirect={`/backend/users?flash=${encodeURIComponent(\n sendInviteEmail\n ? t('auth.users.flash.createdWithInvite', 'User created and invitation sent')\n : t('auth.users.flash.created', 'User created')\n )}&type=success`}\n onSubmit={async (values) => {\n const customFields = collectCustomFieldValues(values)\n const payload: Record<string, unknown> = {\n email: values.email,\n organizationId: values.organizationId ? values.organizationId : null,\n roles: Array.isArray(values.roles) ? values.roles : [],\n ...(Object.keys(customFields).length ? { customFields } : {}),\n }\n if (sendInviteEmail) {\n payload.sendInviteEmail = true\n } else {\n payload.password = values.password\n }\n if (actorIsSuperAdmin) {\n const rawTenant = typeof values.tenantId === 'string' ? values.tenantId.trim() : null\n payload.tenantId = rawTenant && rawTenant.length ? rawTenant : null\n }\n const { result: created } = await createCrud<{ id?: string; _warning?: string }>('auth/users', payload)\n const newUserId = typeof created?.id === 'string' ? created.id : null\n if (created?._warning === 'invite_email_failed') {\n const msg = t('auth.users.flash.createdEmailFailed', 'User created but invitation email could not be sent. You can resend it from the user page.')\n window.location.href = `/backend/users?flash=${encodeURIComponent(msg)}&type=warning`\n return\n }\n\n if (widgetMode === 'override' && newUserId) {\n await updateCrud('dashboards/users/widgets', {\n userId: newUserId,\n mode: 'override',\n widgetIds: selectedWidgets,\n organizationId: values.organizationId ? values.organizationId : null,\n tenantId: actorIsSuperAdmin\n ? (typeof values.tenantId === 'string' && values.tenantId.length ? values.tenantId : null)\n : null,\n }, {\n errorMessage: t('auth.users.form.errors.widgetsAssign', 'Failed to assign dashboard widgets to the new user'),\n })\n }\n }}\n />\n </PageBody>\n </Page>\n )\n}\n\nfunction DashboardWidgetSelector({\n catalog,\n loading,\n error,\n mode,\n onModeChange,\n selected,\n onToggle,\n}: {\n catalog: Array<{ id: string; title: string; description: string | null }>\n loading: boolean\n error: string | null\n mode: 'inherit' | 'override'\n onModeChange: (mode: 'inherit' | 'override') => void\n selected: string[]\n onToggle: (id: string) => void\n}) {\n const t = useT()\n if (loading) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner size=\"sm\" /> {t('auth.users.widgets.loading', 'Loading widgets\u2026')}\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive\">{error}</div>\n )}\n {!error && (\n <>\n <div className=\"flex items-center gap-3 rounded-md border bg-muted/30 px-3 py-2\">\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n value=\"inherit\"\n checked={mode === 'inherit'}\n onChange={() => onModeChange('inherit')}\n />\n {t('auth.users.widgets.mode.inherit', 'Inherit from roles')}\n </label>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n value=\"override\"\n checked={mode === 'override'}\n onChange={() => onModeChange('override')}\n />\n {t('auth.users.widgets.mode.override', 'Override for this user')}\n </label>\n </div>\n {mode === 'override' && (\n <div className=\"space-y-2\">\n {catalog.map((widget) => (\n <label key={widget.id} className=\"flex items-start gap-3 rounded-md border px-3 py-2 hover:border-primary/40\">\n <input\n type=\"checkbox\"\n className=\"mt-1 size-4\"\n checked={selected.includes(widget.id)}\n onChange={() => onToggle(widget.id)}\n />\n <div>\n <div className=\"text-sm font-medium leading-none\">{widget.title}</div>\n {widget.description ? <div className=\"text-xs text-muted-foreground\">{widget.description}</div> : null}\n </div>\n </label>\n ))}\n </div>\n )}\n {mode === 'inherit' && (\n <div className=\"rounded-md border bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n {t('auth.users.widgets.mode.hint', 'New users inherit widgets from their assigned roles. Override to pick a custom set.')}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -158,10 +158,10 @@ function RulesListPage() {
158
158
  accessorKey: "ruleType",
159
159
  cell: ({ row }) => {
160
160
  const typeColors = {
161
- GUARD: "bg-red-100 text-red-800",
162
- VALIDATION: "bg-yellow-100 text-yellow-800",
163
- CALCULATION: "bg-blue-100 text-blue-800",
164
- ACTION: "bg-green-100 text-green-800",
161
+ GUARD: "bg-status-error-bg text-status-error-text",
162
+ VALIDATION: "bg-status-warning-bg text-status-warning-text",
163
+ CALCULATION: "bg-status-info-bg text-status-info-text",
164
+ ACTION: "bg-status-success-bg text-status-success-text",
165
165
  ASSIGNMENT: "bg-purple-100 text-purple-800"
166
166
  };
167
167
  const color = typeColors[row.original.ruleType] || "bg-muted text-foreground";
@@ -187,7 +187,7 @@ function RulesListPage() {
187
187
  "button",
188
188
  {
189
189
  onClick: () => handleToggleEnabled(row.original.id, row.original.enabled),
190
- className: `inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${row.original.enabled ? "bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-300 dark:hover:bg-green-800" : "bg-muted text-muted-foreground hover:bg-muted/80"}`,
190
+ className: `inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${row.original.enabled ? "bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80" : "bg-muted text-muted-foreground hover:bg-muted/50"}`,
191
191
  title: t("business_rules.actions.toggleEnabled"),
192
192
  children: row.original.enabled ? t("common.yes") : t("common.no")
193
193
  }
@@ -237,7 +237,7 @@ function RulesListPage() {
237
237
  if (error) {
238
238
  return /* @__PURE__ */ jsxs(Page, { children: [
239
239
  /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsxs("div", { className: "p-8 text-center", children: [
240
- /* @__PURE__ */ jsx("p", { className: "text-red-600", children: t("business_rules.messages.loadFailed") }),
240
+ /* @__PURE__ */ jsx("p", { className: "text-status-error-text", children: t("business_rules.messages.loadFailed") }),
241
241
  /* @__PURE__ */ jsx(Button, { onClick: () => queryClient.invalidateQueries({ queryKey: ["business-rules"] }), className: "mt-4", children: t("common.retry") })
242
242
  ] }) }),
243
243
  ConfirmDialogElement
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/business_rules/backend/rules/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\ntype Rule = {\n id: string\n ruleId: string\n ruleName: string\n description: string | null\n ruleType: 'GUARD' | 'VALIDATION' | 'CALCULATION' | 'ACTION' | 'ASSIGNMENT'\n ruleCategory: string | null\n entityType: string\n eventType: string | null\n enabled: boolean\n priority: number\n version: number\n effectiveFrom: string | null\n effectiveTo: string | null\n tenantId: string\n organizationId: string\n createdAt: string\n updatedAt: string\n}\n\ntype RulesResponse = {\n items: Rule[]\n total: number\n totalPages: number\n}\n\nexport default function RulesListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'list', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'priority')\n params.set('sortDir', 'desc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.ruleType) params.set('ruleType', filterValues.ruleType as string)\n if (filterValues.entityType) params.set('entityType', filterValues.entityType as string)\n if (filterValues.eventType) params.set('eventType', filterValues.eventType as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RulesResponse>(\n `/api/business_rules/rules?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rules')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, ruleName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.confirm.delete', { name: ruleName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const result = await apiCall(`/api/business_rules/rules?id=${id}`, {\n method: 'DELETE',\n })\n\n if (result.ok) {\n flash(t('business_rules.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const result = await apiCall('/api/business_rules/rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('common.enabled'), value: 'true' },\n { label: t('common.disabled'), value: 'false' },\n ],\n },\n {\n id: 'ruleType',\n type: 'select',\n label: t('business_rules.filters.type'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('business_rules.types.guard'), value: 'GUARD' },\n { label: t('business_rules.types.validation'), value: 'VALIDATION' },\n { label: t('business_rules.types.calculation'), value: 'CALCULATION' },\n { label: t('business_rules.types.action'), value: 'ACTION' },\n { label: t('business_rules.types.assignment'), value: 'ASSIGNMENT' },\n ],\n },\n {\n id: 'entityType',\n type: 'text',\n label: t('business_rules.filters.entityType'),\n placeholder: t('business_rules.filters.entityTypePlaceholder'),\n },\n {\n id: 'eventType',\n type: 'text',\n label: t('business_rules.filters.eventType'),\n placeholder: t('business_rules.filters.eventTypePlaceholder'),\n },\n ]\n\n const columns: ColumnDef<Rule>[] = [\n {\n id: 'ruleId',\n header: t('business_rules.fields.ruleId'),\n accessorKey: 'ruleId',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.ruleId}</span>\n ),\n },\n {\n id: 'ruleName',\n header: t('business_rules.fields.ruleName'),\n accessorKey: 'ruleName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.ruleName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'ruleType',\n header: t('business_rules.fields.ruleType'),\n accessorKey: 'ruleType',\n cell: ({ row }) => {\n const typeColors = {\n GUARD: 'bg-red-100 text-red-800',\n VALIDATION: 'bg-yellow-100 text-yellow-800',\n CALCULATION: 'bg-blue-100 text-blue-800',\n ACTION: 'bg-green-100 text-green-800',\n ASSIGNMENT: 'bg-purple-100 text-purple-800',\n }\n const color = typeColors[row.original.ruleType] || 'bg-muted text-foreground'\n return (\n <span className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${color}`}>\n {row.original.ruleType}\n </span>\n )\n },\n },\n {\n id: 'entityType',\n header: t('business_rules.fields.entityType'),\n accessorKey: 'entityType',\n },\n {\n id: 'eventType',\n header: t('business_rules.fields.eventType'),\n accessorKey: 'eventType',\n cell: ({ row }) => row.original.eventType || '-',\n },\n {\n id: 'enabled',\n header: t('business_rules.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-300 dark:hover:bg-green-800'\n : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n title={t('business_rules.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'priority',\n header: t('business_rules.fields.priority'),\n accessorKey: 'priority',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.priority}</span>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/rules/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'duplicate',\n label: t('common.duplicate'),\n onSelect: () => {\n // TODO: Implement duplicate functionality in Step 5.2\n flash(t('business_rules.messages.duplicateNotYetImplemented'), 'info')\n },\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.ruleName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <div className=\"p-8 text-center\">\n <p className=\"text-red-600\">{t('business_rules.messages.loadFailed')}</p>\n <Button onClick={() => queryClient.invalidateQueries({ queryKey: ['business-rules'] })} className=\"mt-4\">\n {t('common.retry')}\n </Button>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.list.title')}\n actions={(\n <Button asChild>\n <Link href=\"/backend/rules/create\">\n {t('business_rules.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n perspective={{\n tableId: 'business-rules.rules.list',\n }}\n pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\ntype Rule = {\n id: string\n ruleId: string\n ruleName: string\n description: string | null\n ruleType: 'GUARD' | 'VALIDATION' | 'CALCULATION' | 'ACTION' | 'ASSIGNMENT'\n ruleCategory: string | null\n entityType: string\n eventType: string | null\n enabled: boolean\n priority: number\n version: number\n effectiveFrom: string | null\n effectiveTo: string | null\n tenantId: string\n organizationId: string\n createdAt: string\n updatedAt: string\n}\n\ntype RulesResponse = {\n items: Rule[]\n total: number\n totalPages: number\n}\n\nexport default function RulesListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'list', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'priority')\n params.set('sortDir', 'desc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.ruleType) params.set('ruleType', filterValues.ruleType as string)\n if (filterValues.entityType) params.set('entityType', filterValues.entityType as string)\n if (filterValues.eventType) params.set('eventType', filterValues.eventType as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RulesResponse>(\n `/api/business_rules/rules?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rules')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, ruleName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.confirm.delete', { name: ruleName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const result = await apiCall(`/api/business_rules/rules?id=${id}`, {\n method: 'DELETE',\n })\n\n if (result.ok) {\n flash(t('business_rules.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const result = await apiCall('/api/business_rules/rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('common.enabled'), value: 'true' },\n { label: t('common.disabled'), value: 'false' },\n ],\n },\n {\n id: 'ruleType',\n type: 'select',\n label: t('business_rules.filters.type'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('business_rules.types.guard'), value: 'GUARD' },\n { label: t('business_rules.types.validation'), value: 'VALIDATION' },\n { label: t('business_rules.types.calculation'), value: 'CALCULATION' },\n { label: t('business_rules.types.action'), value: 'ACTION' },\n { label: t('business_rules.types.assignment'), value: 'ASSIGNMENT' },\n ],\n },\n {\n id: 'entityType',\n type: 'text',\n label: t('business_rules.filters.entityType'),\n placeholder: t('business_rules.filters.entityTypePlaceholder'),\n },\n {\n id: 'eventType',\n type: 'text',\n label: t('business_rules.filters.eventType'),\n placeholder: t('business_rules.filters.eventTypePlaceholder'),\n },\n ]\n\n const columns: ColumnDef<Rule>[] = [\n {\n id: 'ruleId',\n header: t('business_rules.fields.ruleId'),\n accessorKey: 'ruleId',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.ruleId}</span>\n ),\n },\n {\n id: 'ruleName',\n header: t('business_rules.fields.ruleName'),\n accessorKey: 'ruleName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.ruleName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'ruleType',\n header: t('business_rules.fields.ruleType'),\n accessorKey: 'ruleType',\n cell: ({ row }) => {\n const typeColors = {\n GUARD: 'bg-status-error-bg text-status-error-text',\n VALIDATION: 'bg-status-warning-bg text-status-warning-text',\n CALCULATION: 'bg-status-info-bg text-status-info-text',\n ACTION: 'bg-status-success-bg text-status-success-text',\n ASSIGNMENT: 'bg-purple-100 text-purple-800',\n }\n const color = typeColors[row.original.ruleType] || 'bg-muted text-foreground'\n return (\n <span className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${color}`}>\n {row.original.ruleType}\n </span>\n )\n },\n },\n {\n id: 'entityType',\n header: t('business_rules.fields.entityType'),\n accessorKey: 'entityType',\n },\n {\n id: 'eventType',\n header: t('business_rules.fields.eventType'),\n accessorKey: 'eventType',\n cell: ({ row }) => row.original.eventType || '-',\n },\n {\n id: 'enabled',\n header: t('business_rules.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'priority',\n header: t('business_rules.fields.priority'),\n accessorKey: 'priority',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.priority}</span>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/rules/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'duplicate',\n label: t('common.duplicate'),\n onSelect: () => {\n // TODO: Implement duplicate functionality in Step 5.2\n flash(t('business_rules.messages.duplicateNotYetImplemented'), 'info')\n },\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.ruleName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <div className=\"p-8 text-center\">\n <p className=\"text-status-error-text\">{t('business_rules.messages.loadFailed')}</p>\n <Button onClick={() => queryClient.invalidateQueries({ queryKey: ['business-rules'] })} className=\"mt-4\">\n {t('common.retry')}\n </Button>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.list.title')}\n actions={(\n <Button asChild>\n <Link href=\"/backend/rules/create\">\n {t('business_rules.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n perspective={{\n tableId: 'business-rules.rules.list',\n }}\n pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -117,7 +117,7 @@ function RuleSetsListPage() {
117
117
  Link,
118
118
  {
119
119
  href: `/backend/sets/${row.original.id}`,
120
- className: "font-mono text-sm text-blue-600 hover:text-blue-800 hover:underline",
120
+ className: "font-mono text-sm text-primary hover:underline",
121
121
  children: row.original.setId
122
122
  }
123
123
  )
@@ -139,7 +139,7 @@ function RuleSetsListPage() {
139
139
  "button",
140
140
  {
141
141
  onClick: () => handleToggleEnabled(row.original.id, row.original.enabled),
142
- className: `inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${row.original.enabled ? "bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-300 dark:hover:bg-green-800" : "bg-muted text-muted-foreground hover:bg-muted/80"}`,
142
+ className: `inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${row.original.enabled ? "bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80" : "bg-muted text-muted-foreground hover:bg-muted/50"}`,
143
143
  title: t("business_rules.sets.actions.toggleEnabled"),
144
144
  children: row.original.enabled ? t("common.yes") : t("common.no")
145
145
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/business_rules/backend/sets/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\ntype RuleSet = {\n id: string\n setId: string\n setName: string\n description: string | null\n enabled: boolean\n tenantId: string\n organizationId: string\n createdBy: string | null\n updatedBy: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype RuleSetsResponse = {\n items: RuleSet[]\n total: number\n totalPages: number\n}\n\nexport default function RuleSetsListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'sets', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'setName')\n params.set('sortDir', 'asc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RuleSetsResponse>(\n `/api/business_rules/sets?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rule sets')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, setName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.sets.confirm.delete', { name: setName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const result = await apiCall(`/api/business_rules/sets?id=${id}`, {\n method: 'DELETE',\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const result = await apiCall('/api/business_rules/sets', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.sets.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { value: '', label: t('common.all') },\n { value: 'true', label: t('common.enabled') },\n { value: 'false', label: t('common.disabled') },\n ],\n },\n ]\n\n const columns: ColumnDef<RuleSet>[] = [\n {\n id: 'setId',\n header: t('business_rules.sets.fields.setId'),\n accessorKey: 'setId',\n cell: ({ row }) => (\n <Link\n href={`/backend/sets/${row.original.id}`}\n className=\"font-mono text-sm text-blue-600 hover:text-blue-800 hover:underline\"\n >\n {row.original.setId}\n </Link>\n ),\n },\n {\n id: 'setName',\n header: t('business_rules.sets.fields.setName'),\n accessorKey: 'setName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.setName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground mt-0.5 line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'enabled',\n header: t('business_rules.sets.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-300 dark:hover:bg-green-800'\n : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n title={t('business_rules.sets.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/sets/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.setName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.sets.list.title')}\n actions={(\n <Button asChild>\n <Link href=\"/backend/sets/create\">\n {t('business_rules.sets.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n isLoading={isLoading}\n error={error ? t('business_rules.sets.messages.loadFailed') : undefined}\n pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\ntype RuleSet = {\n id: string\n setId: string\n setName: string\n description: string | null\n enabled: boolean\n tenantId: string\n organizationId: string\n createdBy: string | null\n updatedBy: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype RuleSetsResponse = {\n items: RuleSet[]\n total: number\n totalPages: number\n}\n\nexport default function RuleSetsListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'sets', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'setName')\n params.set('sortDir', 'asc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RuleSetsResponse>(\n `/api/business_rules/sets?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rule sets')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, setName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.sets.confirm.delete', { name: setName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const result = await apiCall(`/api/business_rules/sets?id=${id}`, {\n method: 'DELETE',\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const result = await apiCall('/api/business_rules/sets', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.sets.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { value: '', label: t('common.all') },\n { value: 'true', label: t('common.enabled') },\n { value: 'false', label: t('common.disabled') },\n ],\n },\n ]\n\n const columns: ColumnDef<RuleSet>[] = [\n {\n id: 'setId',\n header: t('business_rules.sets.fields.setId'),\n accessorKey: 'setId',\n cell: ({ row }) => (\n <Link\n href={`/backend/sets/${row.original.id}`}\n className=\"font-mono text-sm text-primary hover:underline\"\n >\n {row.original.setId}\n </Link>\n ),\n },\n {\n id: 'setName',\n header: t('business_rules.sets.fields.setName'),\n accessorKey: 'setName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.setName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground mt-0.5 line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'enabled',\n header: t('business_rules.sets.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.sets.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/sets/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.setName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.sets.list.title')}\n actions={(\n <Button asChild>\n <Link href=\"/backend/sets/create\">\n {t('business_rules.sets.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n isLoading={isLoading}\n error={error ? t('business_rules.sets.messages.loadFailed') : undefined}\n pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -113,14 +113,14 @@ function ActionBuilder({
113
113
  /* @__PURE__ */ jsx(Plus, { className: "w-4 h-4 mr-2" }),
114
114
  t("business_rules.components.actionBuilder.addAction")
115
115
  ] }),
116
- actions.length > 1 && /* @__PURE__ */ jsx(Button, { type: "button", onClick: handleClearAll, variant: "outline", size: "sm", className: "text-red-600", children: t("business_rules.components.actionBuilder.clearAll") })
116
+ actions.length > 1 && /* @__PURE__ */ jsx(Button, { type: "button", onClick: handleClearAll, variant: "outline", size: "sm", className: "text-status-error-text", children: t("business_rules.components.actionBuilder.clearAll") })
117
117
  ] })
118
118
  ] }),
119
- !validation.valid && /* @__PURE__ */ jsxs("div", { className: "p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded", children: [
120
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-red-800 dark:text-red-300 mb-1", children: t("business_rules.components.actionBuilder.validationErrors") }),
121
- /* @__PURE__ */ jsx("ul", { className: "list-disc list-inside space-y-0.5", children: validation.errors.map((err, index) => /* @__PURE__ */ jsx("li", { className: "text-xs text-red-700 dark:text-red-400", children: err }, index)) })
119
+ !validation.valid && /* @__PURE__ */ jsxs("div", { className: "p-3 bg-status-error-bg border border-status-error-border rounded", children: [
120
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-status-error-text mb-1", children: t("business_rules.components.actionBuilder.validationErrors") }),
121
+ /* @__PURE__ */ jsx("ul", { className: "list-disc list-inside space-y-0.5", children: validation.errors.map((err, index) => /* @__PURE__ */ jsx("li", { className: "text-xs text-status-error-text", children: err }, index)) })
122
122
  ] }),
123
- error && /* @__PURE__ */ jsx("div", { className: "p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-red-700 dark:text-red-400", children: error }) }),
123
+ error && /* @__PURE__ */ jsx("div", { className: "p-3 bg-status-error-bg border border-status-error-border rounded", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-status-error-text", children: error }) }),
124
124
  showDebug && actions.length > 0 && /* @__PURE__ */ jsx("div", { className: "p-3 bg-zinc-900 dark:bg-zinc-950 rounded text-xs font-mono overflow-x-auto border border-border", children: /* @__PURE__ */ jsx("pre", { className: "text-zinc-100", children: JSON.stringify(actions, null, 2) }) }),
125
125
  actions.length > 0 && /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground space-y-1", children: [
126
126
  /* @__PURE__ */ jsxs("p", { children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/business_rules/components/ActionBuilder.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Plus, Code } from 'lucide-react'\nimport { ActionRow } from './ActionRow'\nimport type { Action } from './utils/actionValidation'\nimport { validateActions } from './utils/actionValidation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\nexport type ActionBuilderProps = {\n value: Action[] | null | undefined\n onChange: (value: Action[]) => void\n error?: string\n showJsonPreview?: boolean\n label?: string\n emptyMessage?: string\n}\n\nexport function ActionBuilder({\n value,\n onChange,\n error,\n showJsonPreview = false,\n label,\n emptyMessage,\n}: ActionBuilderProps) {\n const t = useT()\n const { confirm: confirmDialog, ConfirmDialogElement } = useConfirmDialog()\n const [showDebug, setShowDebug] = React.useState(false)\n const actions = value || []\n\n const handleAddAction = () => {\n const newAction: Action = {\n type: '',\n config: {},\n }\n onChange([...actions, newAction])\n }\n\n const handleChangeAction = (index: number, updatedAction: Action) => {\n const newActions = [...actions]\n newActions[index] = updatedAction\n onChange(newActions)\n }\n\n const handleDeleteAction = (index: number) => {\n const newActions = actions.filter((_, i) => i !== index)\n onChange(newActions)\n }\n\n const handleMoveUp = (index: number) => {\n if (index === 0) return\n const newActions = [...actions]\n const temp = newActions[index - 1]\n newActions[index - 1] = newActions[index]\n newActions[index] = temp\n onChange(newActions)\n }\n\n const handleMoveDown = (index: number) => {\n if (index === actions.length - 1) return\n const newActions = [...actions]\n const temp = newActions[index + 1]\n newActions[index + 1] = newActions[index]\n newActions[index] = temp\n onChange(newActions)\n }\n\n const handleClearAll = async () => {\n const confirmed = await confirmDialog({\n title: t('business_rules.components.actionBuilder.confirm.clearAll'),\n variant: 'destructive',\n })\n if (confirmed) {\n onChange([])\n }\n }\n\n // Validate actions (memoized to avoid expensive re-computation)\n const validation = React.useMemo(() => {\n return validateActions(actions, t)\n }, [actions, t])\n\n return (\n <div className=\"space-y-3\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-medium text-foreground\">\n {label || t('business_rules.components.actionBuilder.label')}\n </h3>\n {actions.length > 0 && (\n <span className=\"text-xs text-muted-foreground\">\n ({t('business_rules.components.actionBuilder.actionCount', { count: actions.length })})\n </span>\n )}\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center gap-2\">\n {showJsonPreview && actions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setShowDebug(!showDebug)}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n title={t('business_rules.components.actionBuilder.jsonPreview.toggle')}\n >\n <Code className=\"w-3 h-3\" />\n {showDebug\n ? t('business_rules.components.actionBuilder.jsonPreview.hide')\n : t('business_rules.components.actionBuilder.jsonPreview.show')\n }\n </button>\n )}\n </div>\n </div>\n\n {/* Empty State */}\n {actions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center p-8 border-2 border-dashed border-border rounded-lg bg-muted\">\n <p className=\"text-sm text-muted-foreground mb-4\">\n {emptyMessage || t('business_rules.components.actionBuilder.emptyMessage')}\n </p>\n <Button type=\"button\" onClick={handleAddAction} variant=\"outline\" size=\"sm\">\n <Plus className=\"w-4 h-4 mr-2\" />\n {t('business_rules.components.actionBuilder.addAction')}\n </Button>\n </div>\n ) : (\n <>\n {/* Action List */}\n <div className=\"space-y-2\">\n {actions.map((action, index) => (\n <ActionRow\n key={index}\n action={action}\n index={index}\n onChange={handleChangeAction}\n onDelete={handleDeleteAction}\n onMoveUp={index > 0 ? handleMoveUp : undefined}\n onMoveDown={index < actions.length - 1 ? handleMoveDown : undefined}\n canMoveUp={index > 0}\n canMoveDown={index < actions.length - 1}\n />\n ))}\n </div>\n\n {/* Add More / Clear All */}\n <div className=\"flex items-center justify-between\">\n <Button type=\"button\" onClick={handleAddAction} variant=\"outline\" size=\"sm\">\n <Plus className=\"w-4 h-4 mr-2\" />\n {t('business_rules.components.actionBuilder.addAction')}\n </Button>\n {actions.length > 1 && (\n <Button type=\"button\" onClick={handleClearAll} variant=\"outline\" size=\"sm\" className=\"text-red-600\">\n {t('business_rules.components.actionBuilder.clearAll')}\n </Button>\n )}\n </div>\n </>\n )}\n\n {/* Validation Errors */}\n {!validation.valid && (\n <div className=\"p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-300 mb-1\">\n {t('business_rules.components.actionBuilder.validationErrors')}\n </p>\n <ul className=\"list-disc list-inside space-y-0.5\">\n {validation.errors.map((err, index) => (\n <li key={index} className=\"text-xs text-red-700 dark:text-red-400\">\n {err}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* External Error */}\n {error && (\n <div className=\"p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded\">\n <p className=\"text-sm text-red-700 dark:text-red-400\">{error}</p>\n </div>\n )}\n\n {/* JSON Preview */}\n {showDebug && actions.length > 0 && (\n <div className=\"p-3 bg-zinc-900 dark:bg-zinc-950 rounded text-xs font-mono overflow-x-auto border border-border\">\n <pre className=\"text-zinc-100\">{JSON.stringify(actions, null, 2)}</pre>\n </div>\n )}\n\n {/* Help Text */}\n {actions.length > 0 && (\n <div className=\"text-xs text-muted-foreground space-y-1\">\n <p>\n <strong>{t('business_rules.components.actionBuilder.help.actionOrder')}</strong>{' '}\n {t('business_rules.components.actionBuilder.help.actionOrderDescription')}\n </p>\n <p>\n <strong>{t('business_rules.components.actionBuilder.help.messageInterpolation')}</strong>{' '}\n {t('business_rules.components.actionBuilder.help.messageInterpolationDescription')}\n </p>\n </div>\n )}\n {ConfirmDialogElement}\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Plus, Code } from 'lucide-react'\nimport { ActionRow } from './ActionRow'\nimport type { Action } from './utils/actionValidation'\nimport { validateActions } from './utils/actionValidation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\nexport type ActionBuilderProps = {\n value: Action[] | null | undefined\n onChange: (value: Action[]) => void\n error?: string\n showJsonPreview?: boolean\n label?: string\n emptyMessage?: string\n}\n\nexport function ActionBuilder({\n value,\n onChange,\n error,\n showJsonPreview = false,\n label,\n emptyMessage,\n}: ActionBuilderProps) {\n const t = useT()\n const { confirm: confirmDialog, ConfirmDialogElement } = useConfirmDialog()\n const [showDebug, setShowDebug] = React.useState(false)\n const actions = value || []\n\n const handleAddAction = () => {\n const newAction: Action = {\n type: '',\n config: {},\n }\n onChange([...actions, newAction])\n }\n\n const handleChangeAction = (index: number, updatedAction: Action) => {\n const newActions = [...actions]\n newActions[index] = updatedAction\n onChange(newActions)\n }\n\n const handleDeleteAction = (index: number) => {\n const newActions = actions.filter((_, i) => i !== index)\n onChange(newActions)\n }\n\n const handleMoveUp = (index: number) => {\n if (index === 0) return\n const newActions = [...actions]\n const temp = newActions[index - 1]\n newActions[index - 1] = newActions[index]\n newActions[index] = temp\n onChange(newActions)\n }\n\n const handleMoveDown = (index: number) => {\n if (index === actions.length - 1) return\n const newActions = [...actions]\n const temp = newActions[index + 1]\n newActions[index + 1] = newActions[index]\n newActions[index] = temp\n onChange(newActions)\n }\n\n const handleClearAll = async () => {\n const confirmed = await confirmDialog({\n title: t('business_rules.components.actionBuilder.confirm.clearAll'),\n variant: 'destructive',\n })\n if (confirmed) {\n onChange([])\n }\n }\n\n // Validate actions (memoized to avoid expensive re-computation)\n const validation = React.useMemo(() => {\n return validateActions(actions, t)\n }, [actions, t])\n\n return (\n <div className=\"space-y-3\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-medium text-foreground\">\n {label || t('business_rules.components.actionBuilder.label')}\n </h3>\n {actions.length > 0 && (\n <span className=\"text-xs text-muted-foreground\">\n ({t('business_rules.components.actionBuilder.actionCount', { count: actions.length })})\n </span>\n )}\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center gap-2\">\n {showJsonPreview && actions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setShowDebug(!showDebug)}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n title={t('business_rules.components.actionBuilder.jsonPreview.toggle')}\n >\n <Code className=\"w-3 h-3\" />\n {showDebug\n ? t('business_rules.components.actionBuilder.jsonPreview.hide')\n : t('business_rules.components.actionBuilder.jsonPreview.show')\n }\n </button>\n )}\n </div>\n </div>\n\n {/* Empty State */}\n {actions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center p-8 border-2 border-dashed border-border rounded-lg bg-muted\">\n <p className=\"text-sm text-muted-foreground mb-4\">\n {emptyMessage || t('business_rules.components.actionBuilder.emptyMessage')}\n </p>\n <Button type=\"button\" onClick={handleAddAction} variant=\"outline\" size=\"sm\">\n <Plus className=\"w-4 h-4 mr-2\" />\n {t('business_rules.components.actionBuilder.addAction')}\n </Button>\n </div>\n ) : (\n <>\n {/* Action List */}\n <div className=\"space-y-2\">\n {actions.map((action, index) => (\n <ActionRow\n key={index}\n action={action}\n index={index}\n onChange={handleChangeAction}\n onDelete={handleDeleteAction}\n onMoveUp={index > 0 ? handleMoveUp : undefined}\n onMoveDown={index < actions.length - 1 ? handleMoveDown : undefined}\n canMoveUp={index > 0}\n canMoveDown={index < actions.length - 1}\n />\n ))}\n </div>\n\n {/* Add More / Clear All */}\n <div className=\"flex items-center justify-between\">\n <Button type=\"button\" onClick={handleAddAction} variant=\"outline\" size=\"sm\">\n <Plus className=\"w-4 h-4 mr-2\" />\n {t('business_rules.components.actionBuilder.addAction')}\n </Button>\n {actions.length > 1 && (\n <Button type=\"button\" onClick={handleClearAll} variant=\"outline\" size=\"sm\" className=\"text-status-error-text\">\n {t('business_rules.components.actionBuilder.clearAll')}\n </Button>\n )}\n </div>\n </>\n )}\n\n {/* Validation Errors */}\n {!validation.valid && (\n <div className=\"p-3 bg-status-error-bg border border-status-error-border rounded\">\n <p className=\"text-sm font-medium text-status-error-text mb-1\">\n {t('business_rules.components.actionBuilder.validationErrors')}\n </p>\n <ul className=\"list-disc list-inside space-y-0.5\">\n {validation.errors.map((err, index) => (\n <li key={index} className=\"text-xs text-status-error-text\">\n {err}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* External Error */}\n {error && (\n <div className=\"p-3 bg-status-error-bg border border-status-error-border rounded\">\n <p className=\"text-sm text-status-error-text\">{error}</p>\n </div>\n )}\n\n {/* JSON Preview */}\n {showDebug && actions.length > 0 && (\n <div className=\"p-3 bg-zinc-900 dark:bg-zinc-950 rounded text-xs font-mono overflow-x-auto border border-border\">\n <pre className=\"text-zinc-100\">{JSON.stringify(actions, null, 2)}</pre>\n </div>\n )}\n\n {/* Help Text */}\n {actions.length > 0 && (\n <div className=\"text-xs text-muted-foreground space-y-1\">\n <p>\n <strong>{t('business_rules.components.actionBuilder.help.actionOrder')}</strong>{' '}\n {t('business_rules.components.actionBuilder.help.actionOrderDescription')}\n </p>\n <p>\n <strong>{t('business_rules.components.actionBuilder.help.messageInterpolation')}</strong>{' '}\n {t('business_rules.components.actionBuilder.help.messageInterpolationDescription')}\n </p>\n </div>\n )}\n {ConfirmDialogElement}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }