@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
@@ -265,7 +265,7 @@ function AdjustmentDialog({
265
265
  type: "custom",
266
266
  component: ({ value, setValue }) => {
267
267
  const currentMode = value === "rate" || value === "amount" ? value : mode;
268
- return /* @__PURE__ */ jsx("div", { className: "inline-flex rounded-md border bg-muted/40 p-1 text-sm font-medium", children: ["rate", "amount"].map((option) => /* @__PURE__ */ jsx(
268
+ return /* @__PURE__ */ jsx("div", { className: "inline-flex rounded-md border bg-muted/50 p-1 text-sm font-medium", children: ["rate", "amount"].map((option) => /* @__PURE__ */ jsx(
269
269
  "button",
270
270
  {
271
271
  type: "button",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/components/documents/AdjustmentDialog.tsx"],
4
- "sourcesContent": ["// @ts-nocheck\n\n\"use client\"\n\nimport * as React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { normalizeCustomFieldResponse, normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields/normalize'\nimport { DictionaryEntrySelect, type DictionaryOption } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { SalesAdjustmentKind } from '../../data/entities'\nimport { E } from '#generated/entities.ids.generated'\nimport { Settings } from 'lucide-react'\nimport { extractCustomFieldValues, normalizeCustomFieldSubmitValue } from './customFieldHelpers'\n\ntype TaxRateOption = {\n id: string\n name: string\n code: string | null\n rate: number | null\n isDefault: boolean\n}\n\ntype AdjustmentFormState = {\n id?: string\n label: string\n code: string\n kind: SalesAdjustmentKind\n mode?: 'rate' | 'amount'\n calculatorKey: string\n rate: string\n amountNet: string\n amountGross: string\n position: string\n customFieldSetId?: string | null\n taxRateId?: string | null\n taxRateValue?: number | null\n}\n\nexport type AdjustmentRowData = {\n id: string\n label: string | null\n code: string | null\n kind: SalesAdjustmentKind\n calculatorKey: string | null\n rate: number | null\n amountNet: number | null\n amountGross: number | null\n currencyCode: string | null\n position: number\n customFields?: Record<string, unknown> | null\n customFieldSetId?: string | null\n metadata?: Record<string, unknown> | null\n}\n\nexport type AdjustmentSubmitPayload = {\n id?: string\n label: string | null\n code: string | null\n kind: SalesAdjustmentKind\n calculatorKey: string | null\n rate?: number | null\n amountNet?: number | null\n amountGross?: number | null\n position?: number | null\n currencyCode: string\n customFields?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype AdjustmentDialogProps = {\n open: boolean\n onOpenChange: (open: boolean) => void\n kind: 'order' | 'quote'\n currencyCode: string | null | undefined\n kindOptions: DictionaryOption[]\n loadKindOptions: () => Promise<DictionaryOption[]>\n labels: {\n addTitle: string\n editTitle: string\n submitCreate: string\n submitUpdate: string\n }\n initialAdjustment?: AdjustmentRowData | null\n onSubmit: (payload: AdjustmentSubmitPayload) => Promise<void>\n}\n\nconst normalizeNumber = (value: unknown): number | null => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return null\n}\n\nconst formatTaxRateLabel = (rate: TaxRateOption): string => {\n const extras: string[] = []\n if (typeof rate.rate === 'number' && Number.isFinite(rate.rate)) {\n extras.push(`${rate.rate}%`)\n }\n if (rate.code) {\n extras.push(rate.code.toUpperCase())\n }\n if (!extras.length) return rate.name\n return `${rate.name} \u2022 ${extras.join(' \u00B7 ')}`\n}\n\nconst roundAmount = (value: number): number => Math.round((value + Number.EPSILON) * 100) / 100\n\nconst resolveModeFromAdjustment = (adjustment?: AdjustmentRowData | null): 'rate' | 'amount' => {\n if (!adjustment) return 'amount'\n const metadataMode =\n typeof adjustment.metadata === 'object' && adjustment.metadata\n ? (adjustment.metadata as any).calculationMode\n : null\n if (metadataMode === 'rate' || metadataMode === 'amount') return metadataMode\n const rateValue = normalizeNumber(adjustment.rate)\n const amountNetValue = normalizeNumber(adjustment.amountNet)\n const amountGrossValue = normalizeNumber(adjustment.amountGross)\n const hasAmounts = Number.isFinite(amountNetValue) || Number.isFinite(amountGrossValue)\n if (Number.isFinite(rateValue) && (rateValue !== 0 || !hasAmounts)) return 'rate'\n if (hasAmounts) return 'amount'\n return 'amount'\n}\n\nconst PROVIDER_CALCULATOR_PREFIXES = ['shipping-provider:', 'payment-provider:']\n\nexport function AdjustmentDialog({\n open,\n onOpenChange,\n kind,\n currencyCode,\n kindOptions,\n loadKindOptions,\n labels,\n initialAdjustment,\n onSubmit,\n}: AdjustmentDialogProps) {\n const t = useT()\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const entityId = kind === 'order' ? E.sales.sales_order_adjustment : E.sales.sales_quote_adjustment\n const initialMode: 'rate' | 'amount' = resolveModeFromAdjustment(initialAdjustment)\n const [mode, setMode] = React.useState<'rate' | 'amount'>(initialMode)\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [taxRates, setTaxRates] = React.useState<TaxRateOption[]>([])\n const taxRatesRef = React.useRef<TaxRateOption[]>([])\n const taxRatesLoadedRef = React.useRef(false)\n const lastAmountChangedRef = React.useRef<'net' | 'gross' | null>(null)\n const [initialValues, setInitialValues] = React.useState<AdjustmentFormState>(() => ({\n id: undefined,\n label: '',\n code: '',\n kind: (kindOptions[0]?.value as SalesAdjustmentKind) ?? 'custom',\n mode: initialMode,\n calculatorKey: '',\n rate: '',\n amountNet: '',\n amountGross: '',\n position: '',\n customFieldSetId: null,\n taxRateId: null,\n taxRateValue: null,\n }))\n\n const taxRateMap = React.useMemo(\n () =>\n taxRates.reduce<Map<string, TaxRateOption>>((acc, rate) => {\n acc.set(rate.id, rate)\n return acc\n }, new Map()),\n [taxRates]\n )\n\n const resolveTaxRateValue = React.useCallback(\n (values: Record<string, unknown>): number | null => {\n const fallback = normalizeNumber((values as any)?.taxRateValue)\n if (Number.isFinite(fallback)) return fallback\n const rateId =\n typeof (values as any)?.taxRateId === 'string' && (values as any)?.taxRateId.trim().length\n ? (values as any)?.taxRateId.trim()\n : null\n if (rateId) {\n const option = taxRateMap.get(rateId)\n const parsed = normalizeNumber(option?.rate)\n if (Number.isFinite(parsed)) return parsed\n }\n return null\n },\n [taxRateMap]\n )\n\n const loadTaxRates = React.useCallback(async (): Promise<TaxRateOption[]> => {\n if (taxRatesLoadedRef.current && taxRatesRef.current.length) return taxRatesRef.current\n try {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/tax-rates?pageSize=200',\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const parsed = items\n .map<TaxRateOption | null>((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n const name =\n typeof item.name === 'string' && item.name.trim().length\n ? item.name.trim()\n : typeof item.code === 'string'\n ? item.code\n : null\n if (!id || !name) return null\n const rate = normalizeNumber((item as any).rate)\n const code =\n typeof (item as any).code === 'string' && (item as any).code.trim().length\n ? (item as any).code.trim()\n : null\n const isDefault = Boolean((item as any).isDefault ?? (item as any).is_default)\n return { id, name, code, rate: Number.isFinite(rate) ? rate : null, isDefault }\n })\n .filter((entry): entry is TaxRateOption => Boolean(entry))\n taxRatesRef.current = parsed\n taxRatesLoadedRef.current = true\n setTaxRates(parsed)\n return parsed\n } catch (err) {\n console.error('sales.tax-rates.fetch', err)\n taxRatesRef.current = []\n setTaxRates([])\n taxRatesLoadedRef.current = true\n return []\n }\n }, [])\n\n const applyOppositeAmount = React.useCallback(\n (\n source: 'net' | 'gross',\n rawValue: string,\n values: Record<string, unknown>,\n setFormValue?: (key: string, value: unknown) => void\n ) => {\n if (mode !== 'amount') return\n if (!rawValue || rawValue.trim() === '') {\n if (!setFormValue) return\n setFormValue(source === 'net' ? 'amountGross' : 'amountNet', '')\n return\n }\n const rateValue = resolveTaxRateValue(values)\n if (!Number.isFinite(rateValue)) return\n const numeric = normalizeNumber(rawValue)\n if (!Number.isFinite(numeric)) return\n if (!setFormValue) return\n if (source === 'net') {\n const gross = roundAmount(numeric * (1 + rateValue / 100))\n setFormValue('amountGross', Number.isFinite(gross) ? gross.toFixed(2) : '')\n } else {\n const net = roundAmount(numeric / (1 + rateValue / 100))\n setFormValue('amountNet', Number.isFinite(net) ? net.toFixed(2) : '')\n }\n },\n [mode, resolveTaxRateValue]\n )\n\n React.useEffect(() => {\n if (!open) return\n let mounted = true\n if (!kindOptions.length) {\n void loadKindOptions()\n }\n const prepare = async () => {\n const rates = await loadTaxRates()\n if (!mounted) return\n const metaTaxRateId =\n typeof initialAdjustment?.metadata === 'object' &&\n initialAdjustment?.metadata &&\n typeof (initialAdjustment.metadata as any).taxRateId === 'string'\n ? (initialAdjustment.metadata as any).taxRateId\n : null\n const metaTaxRateValue =\n typeof initialAdjustment?.metadata === 'object' &&\n initialAdjustment?.metadata &&\n Number.isFinite(normalizeNumber((initialAdjustment.metadata as any).taxRate))\n ? Number(normalizeNumber((initialAdjustment.metadata as any).taxRate))\n : null\n const defaultRate = rates.find((rate) => rate.isDefault) ?? null\n const resolvedMode = resolveModeFromAdjustment(initialAdjustment)\n const next: AdjustmentFormState = {\n id: initialAdjustment?.id,\n label: initialAdjustment?.label ?? '',\n code: initialAdjustment?.code ?? '',\n kind: initialAdjustment?.kind ?? (kindOptions[0]?.value as SalesAdjustmentKind) ?? 'custom',\n mode: resolvedMode,\n calculatorKey: initialAdjustment?.calculatorKey ?? '',\n rate: initialAdjustment?.rate ?? '',\n amountNet: initialAdjustment?.amountNet ?? '',\n amountGross: initialAdjustment?.amountGross ?? '',\n position: initialAdjustment?.position ?? '',\n customFieldSetId: initialAdjustment?.customFieldSetId ?? null,\n taxRateId: metaTaxRateId ?? defaultRate?.id ?? null,\n taxRateValue:\n metaTaxRateValue ??\n (Number.isFinite(defaultRate?.rate ?? null) ? (defaultRate?.rate as number) : null),\n }\n const customValues = extractCustomFieldValues(initialAdjustment as Record<string, unknown> | null)\n setInitialValues({ ...next, ...customValues })\n setMode(resolvedMode)\n setFormResetKey((prev) => prev + 1)\n }\n prepare().catch(() => {})\n return () => {\n mounted = false\n }\n }, [initialAdjustment, kindOptions, loadKindOptions, loadTaxRates, open])\n\n const fields = React.useMemo<CrudField<AdjustmentFormState>[]>(() => {\n const percentSuffix = (\n <div className=\"flex h-9 items-center rounded-r-md border border-l-0 bg-muted px-3 text-sm font-semibold text-muted-foreground\">\n %\n </div>\n )\n return [\n {\n id: 'label',\n label: t('sales.documents.adjustments.label', 'Label'),\n type: 'text',\n placeholder: t('sales.documents.adjustments.labelPlaceholder', 'e.g. Shipping fee'),\n required: true,\n },\n {\n id: 'code',\n label: t('sales.documents.adjustments.code', 'Code'),\n type: 'text',\n placeholder: t('sales.documents.adjustments.codePlaceholder', 'PROMO10'),\n },\n {\n id: 'kind',\n label: t('sales.documents.adjustments.kindLabel', 'Kind'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? 'custom')}\n fetchOptions={loadKindOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/sales#adjustment-kinds\"\n selectClassName=\"w-full\"\n labels={{\n placeholder: t('sales.documents.adjustments.kindSelect.placeholder', 'Select adjustment kind\u2026'),\n addLabel: t('sales.config.adjustmentKinds.actions.add', 'Add adjustment kind'),\n addPrompt: t(\n 'sales.config.adjustmentKinds.dialog.createDescription',\n 'Define a reusable adjustment kind shown in document adjustment dialogs.'\n ),\n dialogTitle: t('sales.config.adjustmentKinds.dialog.createTitle', 'Create adjustment kind'),\n valueLabel: t('sales.config.adjustmentKinds.form.codeLabel', 'Code'),\n valuePlaceholder: t('sales.config.adjustmentKinds.form.codePlaceholder', 'e.g. discount'),\n labelLabel: t('sales.config.adjustmentKinds.form.labelLabel', 'Label'),\n labelPlaceholder: t('sales.config.adjustmentKinds.form.labelPlaceholder', 'e.g. Discount'),\n emptyError: t('sales.config.adjustmentKinds.errors.required', 'Code is required.'),\n cancelLabel: t('ui.actions.cancel', 'Cancel'),\n saveLabel: t('ui.actions.save', 'Save'),\n saveShortcutHint: t('ui.actions.saveShortcut', 'Cmd/Ctrl + Enter'),\n successCreateLabel: t('sales.config.adjustmentKinds.messages.created', 'Adjustment kind created.'),\n errorLoad: t('sales.config.adjustmentKinds.errors.load', 'Failed to load adjustment kinds.'),\n errorSave: t('sales.config.adjustmentKinds.errors.save', 'Failed to save adjustment kind.'),\n loadingLabel: t('sales.config.adjustmentKinds.loading', 'Loading adjustment kinds\u2026'),\n manageTitle: t('sales.config.adjustmentKinds.title', 'Adjustment kinds'),\n }}\n showLabelInput={false}\n />\n ),\n },\n {\n id: 'calculatorKey',\n label: t('sales.documents.adjustments.calculatorKey', 'Calculator key'),\n type: 'text',\n placeholder: 'optional',\n },\n {\n id: 'mode',\n label: t('sales.documents.adjustments.amountMode', 'Calculation mode'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentMode = value === 'rate' || value === 'amount' ? value : mode\n return (\n <div className=\"inline-flex rounded-md border bg-muted/40 p-1 text-sm font-medium\">\n {(['rate', 'amount'] as const).map((option) => (\n <button\n key={option}\n type=\"button\"\n className={`rounded px-3 py-1 transition-colors ${\n currentMode === option ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground'\n }`}\n onClick={() => {\n setMode(option)\n setValue?.(option)\n if (option === 'rate') {\n const form = dialogContentRef.current?.querySelector('form')\n const rateInput = form?.querySelector<HTMLInputElement>('input[name=\"rate\"]')\n rateInput?.focus()\n }\n }}\n >\n {option === 'rate'\n ? t('sales.documents.adjustments.mode.rate', 'Percentage')\n : t('sales.documents.adjustments.mode.amount', 'Fixed amount')}\n </button>\n ))}\n </div>\n )\n },\n },\n {\n id: 'rate',\n label: t('sales.documents.adjustments.rate', 'Rate'),\n type: 'custom',\n placeholder: '0.00',\n required: mode === 'rate',\n component: ({ value, setValue }) => (\n <div className=\"flex items-center\">\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n disabled={mode !== 'rate'}\n className=\"rounded-r-none\"\n />\n {percentSuffix}\n </div>\n ),\n },\n {\n id: 'amountNet',\n label: t('sales.documents.adjustments.amountNet', 'Net amount'),\n type: 'custom',\n placeholder: '0.00',\n required: mode === 'amount',\n disabled: mode !== 'amount',\n layout: 'half',\n component: ({ value, setValue, setFormValue, values }) => (\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => {\n setValue(event.target.value)\n lastAmountChangedRef.current = 'net'\n applyOppositeAmount('net', event.target.value, values ?? {}, setFormValue)\n }}\n placeholder=\"0.00\"\n disabled={mode !== 'amount'}\n />\n ),\n },\n {\n id: 'amountGross',\n label: t('sales.documents.adjustments.amountGross', 'Gross amount'),\n type: 'custom',\n placeholder: '0.00',\n disabled: mode !== 'amount',\n layout: 'half',\n component: ({ value, setValue, setFormValue, values }) => (\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => {\n setValue(event.target.value)\n lastAmountChangedRef.current = 'gross'\n applyOppositeAmount('gross', event.target.value, values ?? {}, setFormValue)\n }}\n placeholder=\"0.00\"\n disabled={mode !== 'amount'}\n />\n ),\n },\n {\n id: 'taxRateId',\n label: t('sales.documents.adjustments.taxRate', 'Tax class'),\n type: 'custom',\n layout: 'half',\n component: ({ value, setValue, setFormValue, values }) => {\n const resolvedValue =\n typeof value === 'string' && value.trim().length\n ? value\n : null\n const rateId =\n resolvedValue ??\n (() => {\n const rateValue = normalizeNumber(\n (values as any)?.taxRateValue ?? (values as any)?.taxRate\n )\n if (!Number.isFinite(rateValue)) return null\n const match = taxRatesRef.current.find(\n (rate) => Number.isFinite(rate.rate) && rate.rate === rateValue\n )\n return match?.id ?? null\n })()\n const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const nextId = event.target.value || null\n const option = nextId ? taxRateMap.get(nextId) ?? null : null\n setValue(nextId)\n const normalizedRate = normalizeNumber(option?.rate)\n setFormValue?.('taxRateValue', Number.isFinite(normalizedRate) ? normalizedRate : null)\n const rateNumeric = Number.isFinite(normalizedRate) ? normalizedRate : null\n if (rateNumeric === null) return\n const lastChanged = lastAmountChangedRef.current\n if (mode !== 'amount') return\n if (lastChanged === 'gross') {\n const gross = normalizeNumber((values as any)?.amountGross)\n if (Number.isFinite(gross)) {\n const net = roundAmount(gross / (1 + rateNumeric / 100))\n setFormValue?.('amountNet', net.toFixed(2))\n }\n return\n }\n const net = normalizeNumber((values as any)?.amountNet)\n if (Number.isFinite(net)) {\n const gross = roundAmount(net * (1 + rateNumeric / 100))\n setFormValue?.('amountGross', gross.toFixed(2))\n }\n }\n return (\n <div className=\"flex items-center gap-2\">\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={rateId ?? ''}\n onChange={handleChange}\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t('sales.documents.adjustments.taxRate.placeholder', 'No tax class selected')\n : t('sales.documents.adjustments.taxRate.empty', 'No tax classes available')}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== 'undefined') {\n window.open('/backend/config/sales?section=tax-rates', '_blank', 'noopener,noreferrer')\n }\n }}\n title={t('sales.documents.adjustments.taxRate.manage', 'Manage tax classes')}\n >\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {t('sales.documents.adjustments.taxRate.manage', 'Manage tax classes')}\n </span>\n </Button>\n </div>\n )\n },\n },\n {\n id: 'taxRateValue',\n label: '',\n type: 'custom',\n component: () => null,\n },\n {\n id: 'position',\n label: t('sales.documents.adjustments.position', 'Position'),\n type: 'number',\n placeholder: '0',\n },\n {\n id: 'currencyDisplay',\n label: t('sales.documents.adjustments.currency', 'Currency'),\n type: 'custom',\n component: () => (\n <Badge variant=\"outline\" className=\"px-3 py-2 text-sm font-semibold\">\n {currencyCode ? currencyCode.toUpperCase() : t('sales.documents.adjustments.currencyPlaceholder', 'e.g. USD')}\n </Badge>\n ),\n },\n ]\n }, [applyOppositeAmount, currencyCode, loadKindOptions, mode, t, taxRates.length, taxRateMap])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n return [\n { id: 'adjustment-core', fields },\n {\n id: 'adjustment-custom',\n column: 2,\n title: t('entities.customFields.title', 'Custom fields'),\n kind: 'customFields',\n },\n ]\n }, [fields, t])\n\n const resolveFormMode = React.useCallback(\n (values: Record<string, unknown>): 'rate' | 'amount' => {\n const raw = values.mode\n if (raw === 'rate' || raw === 'amount') return raw\n return mode\n },\n [mode]\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const calculationMode = resolveFormMode(values)\n const resolvedCurrency = currencyCode ? currencyCode.toUpperCase() : ''\n if (!resolvedCurrency || resolvedCurrency.length !== 3) {\n throw createCrudFormError(\n t('sales.documents.adjustments.errorCurrency', 'Currency is required.'),\n { currencyCode: t('sales.documents.adjustments.errorCurrency', 'Currency is required.') }\n )\n }\n const label = typeof values.label === 'string' ? values.label.trim() : ''\n if (!label.length) {\n throw createCrudFormError(\n t('sales.documents.adjustments.labelRequired', 'Label is required.'),\n { label: t('sales.documents.adjustments.labelRequired', 'Label is required.') }\n )\n }\n const percentageRate = normalizeNumber(values.rate)\n const amountNet = normalizeNumber(values.amountNet)\n const amountGross = normalizeNumber(values.amountGross)\n if (calculationMode === 'rate') {\n if (!Number.isFinite(percentageRate)) {\n throw createCrudFormError(\n t('sales.documents.adjustments.errorRate', 'Enter a percentage rate.'),\n { rate: t('sales.documents.adjustments.errorRate', 'Enter a percentage rate.') }\n )\n }\n } else {\n if (!Number.isFinite(amountNet) && !Number.isFinite(amountGross)) {\n throw createCrudFormError(\n t('sales.documents.adjustments.errorAmount', 'Provide at least one amount.'),\n { amountNet: t('sales.documents.adjustments.errorAmount', 'Provide at least one amount.') }\n )\n }\n }\n const customFields = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n })\n const rateValue = resolveTaxRateValue(values)\n const selectedRateId =\n typeof values.taxRateId === 'string' && values.taxRateId.trim().length\n ? values.taxRateId\n : null\n const metadata: Record<string, unknown> = {\n ...(typeof initialAdjustment?.metadata === 'object' && initialAdjustment?.metadata\n ? initialAdjustment.metadata\n : {}),\n }\n const isEditingProviderAdjustment =\n typeof initialAdjustment?.calculatorKey === 'string' &&\n PROVIDER_CALCULATOR_PREFIXES.some((prefix) =>\n (initialAdjustment?.calculatorKey ?? '').startsWith(prefix)\n )\n if (selectedRateId) metadata.taxRateId = selectedRateId\n if (Number.isFinite(rateValue)) metadata.taxRate = rateValue\n if (isEditingProviderAdjustment) {\n metadata.manualOverride = true\n }\n metadata.calculationMode = calculationMode\n\n const payload: AdjustmentSubmitPayload = {\n id: typeof values.id === 'string' ? values.id : initialAdjustment?.id,\n label,\n code:\n typeof values.code === 'string' && values.code.trim().length ? values.code.trim() : null,\n kind:\n typeof values.kind === 'string' && values.kind.trim().length\n ? (values.kind as SalesAdjustmentKind)\n : 'custom',\n calculatorKey:\n typeof values.calculatorKey === 'string' && values.calculatorKey.trim().length\n ? values.calculatorKey.trim()\n : null,\n rate: calculationMode === 'rate' && Number.isFinite(percentageRate) ? percentageRate : null,\n amountNet: calculationMode === 'amount' && Number.isFinite(amountNet) ? amountNet : null,\n amountGross: calculationMode === 'amount' && Number.isFinite(amountGross) ? amountGross : null,\n position: Number.isFinite(normalizeNumber(values.position)) ? Number(normalizeNumber(values.position)) : null,\n currencyCode: resolvedCurrency,\n customFields: Object.keys(customFields).length ? normalizeCustomFieldValues(customFields) : null,\n metadata: Object.keys(metadata).length ? metadata : null,\n }\n await onSubmit(payload)\n onOpenChange(false)\n },\n [\n currencyCode,\n initialAdjustment?.calculatorKey,\n initialAdjustment?.id,\n initialAdjustment?.metadata,\n onOpenChange,\n onSubmit,\n resolveFormMode,\n resolveTaxRateValue,\n t,\n ]\n )\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"sm:max-w-5xl\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onOpenChange(false)\n return\n }\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n const form = dialogContentRef.current?.querySelector('form')\n form?.requestSubmit()\n }\n }}\n ref={dialogContentRef}\n >\n <DialogHeader>\n <DialogTitle>{initialAdjustment ? labels.editTitle : labels.addTitle}</DialogTitle>\n </DialogHeader>\n <CrudForm<AdjustmentFormState>\n key={formResetKey}\n embedded\n fields={fields}\n groups={groups}\n entityId={entityId}\n initialValues={initialValues}\n submitLabel={initialAdjustment ? labels.submitUpdate : labels.submitCreate}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.adjustments.loading', 'Loading adjustments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
4
+ "sourcesContent": ["// @ts-nocheck\n\n\"use client\"\n\nimport * as React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { normalizeCustomFieldResponse, normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields/normalize'\nimport { DictionaryEntrySelect, type DictionaryOption } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { SalesAdjustmentKind } from '../../data/entities'\nimport { E } from '#generated/entities.ids.generated'\nimport { Settings } from 'lucide-react'\nimport { extractCustomFieldValues, normalizeCustomFieldSubmitValue } from './customFieldHelpers'\n\ntype TaxRateOption = {\n id: string\n name: string\n code: string | null\n rate: number | null\n isDefault: boolean\n}\n\ntype AdjustmentFormState = {\n id?: string\n label: string\n code: string\n kind: SalesAdjustmentKind\n mode?: 'rate' | 'amount'\n calculatorKey: string\n rate: string\n amountNet: string\n amountGross: string\n position: string\n customFieldSetId?: string | null\n taxRateId?: string | null\n taxRateValue?: number | null\n}\n\nexport type AdjustmentRowData = {\n id: string\n label: string | null\n code: string | null\n kind: SalesAdjustmentKind\n calculatorKey: string | null\n rate: number | null\n amountNet: number | null\n amountGross: number | null\n currencyCode: string | null\n position: number\n customFields?: Record<string, unknown> | null\n customFieldSetId?: string | null\n metadata?: Record<string, unknown> | null\n}\n\nexport type AdjustmentSubmitPayload = {\n id?: string\n label: string | null\n code: string | null\n kind: SalesAdjustmentKind\n calculatorKey: string | null\n rate?: number | null\n amountNet?: number | null\n amountGross?: number | null\n position?: number | null\n currencyCode: string\n customFields?: Record<string, unknown> | null\n metadata?: Record<string, unknown> | null\n}\n\ntype AdjustmentDialogProps = {\n open: boolean\n onOpenChange: (open: boolean) => void\n kind: 'order' | 'quote'\n currencyCode: string | null | undefined\n kindOptions: DictionaryOption[]\n loadKindOptions: () => Promise<DictionaryOption[]>\n labels: {\n addTitle: string\n editTitle: string\n submitCreate: string\n submitUpdate: string\n }\n initialAdjustment?: AdjustmentRowData | null\n onSubmit: (payload: AdjustmentSubmitPayload) => Promise<void>\n}\n\nconst normalizeNumber = (value: unknown): number | null => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return null\n}\n\nconst formatTaxRateLabel = (rate: TaxRateOption): string => {\n const extras: string[] = []\n if (typeof rate.rate === 'number' && Number.isFinite(rate.rate)) {\n extras.push(`${rate.rate}%`)\n }\n if (rate.code) {\n extras.push(rate.code.toUpperCase())\n }\n if (!extras.length) return rate.name\n return `${rate.name} \u2022 ${extras.join(' \u00B7 ')}`\n}\n\nconst roundAmount = (value: number): number => Math.round((value + Number.EPSILON) * 100) / 100\n\nconst resolveModeFromAdjustment = (adjustment?: AdjustmentRowData | null): 'rate' | 'amount' => {\n if (!adjustment) return 'amount'\n const metadataMode =\n typeof adjustment.metadata === 'object' && adjustment.metadata\n ? (adjustment.metadata as any).calculationMode\n : null\n if (metadataMode === 'rate' || metadataMode === 'amount') return metadataMode\n const rateValue = normalizeNumber(adjustment.rate)\n const amountNetValue = normalizeNumber(adjustment.amountNet)\n const amountGrossValue = normalizeNumber(adjustment.amountGross)\n const hasAmounts = Number.isFinite(amountNetValue) || Number.isFinite(amountGrossValue)\n if (Number.isFinite(rateValue) && (rateValue !== 0 || !hasAmounts)) return 'rate'\n if (hasAmounts) return 'amount'\n return 'amount'\n}\n\nconst PROVIDER_CALCULATOR_PREFIXES = ['shipping-provider:', 'payment-provider:']\n\nexport function AdjustmentDialog({\n open,\n onOpenChange,\n kind,\n currencyCode,\n kindOptions,\n loadKindOptions,\n labels,\n initialAdjustment,\n onSubmit,\n}: AdjustmentDialogProps) {\n const t = useT()\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const entityId = kind === 'order' ? E.sales.sales_order_adjustment : E.sales.sales_quote_adjustment\n const initialMode: 'rate' | 'amount' = resolveModeFromAdjustment(initialAdjustment)\n const [mode, setMode] = React.useState<'rate' | 'amount'>(initialMode)\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [taxRates, setTaxRates] = React.useState<TaxRateOption[]>([])\n const taxRatesRef = React.useRef<TaxRateOption[]>([])\n const taxRatesLoadedRef = React.useRef(false)\n const lastAmountChangedRef = React.useRef<'net' | 'gross' | null>(null)\n const [initialValues, setInitialValues] = React.useState<AdjustmentFormState>(() => ({\n id: undefined,\n label: '',\n code: '',\n kind: (kindOptions[0]?.value as SalesAdjustmentKind) ?? 'custom',\n mode: initialMode,\n calculatorKey: '',\n rate: '',\n amountNet: '',\n amountGross: '',\n position: '',\n customFieldSetId: null,\n taxRateId: null,\n taxRateValue: null,\n }))\n\n const taxRateMap = React.useMemo(\n () =>\n taxRates.reduce<Map<string, TaxRateOption>>((acc, rate) => {\n acc.set(rate.id, rate)\n return acc\n }, new Map()),\n [taxRates]\n )\n\n const resolveTaxRateValue = React.useCallback(\n (values: Record<string, unknown>): number | null => {\n const fallback = normalizeNumber((values as any)?.taxRateValue)\n if (Number.isFinite(fallback)) return fallback\n const rateId =\n typeof (values as any)?.taxRateId === 'string' && (values as any)?.taxRateId.trim().length\n ? (values as any)?.taxRateId.trim()\n : null\n if (rateId) {\n const option = taxRateMap.get(rateId)\n const parsed = normalizeNumber(option?.rate)\n if (Number.isFinite(parsed)) return parsed\n }\n return null\n },\n [taxRateMap]\n )\n\n const loadTaxRates = React.useCallback(async (): Promise<TaxRateOption[]> => {\n if (taxRatesLoadedRef.current && taxRatesRef.current.length) return taxRatesRef.current\n try {\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/tax-rates?pageSize=200',\n undefined,\n { fallback: { items: [] } }\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const parsed = items\n .map<TaxRateOption | null>((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n const name =\n typeof item.name === 'string' && item.name.trim().length\n ? item.name.trim()\n : typeof item.code === 'string'\n ? item.code\n : null\n if (!id || !name) return null\n const rate = normalizeNumber((item as any).rate)\n const code =\n typeof (item as any).code === 'string' && (item as any).code.trim().length\n ? (item as any).code.trim()\n : null\n const isDefault = Boolean((item as any).isDefault ?? (item as any).is_default)\n return { id, name, code, rate: Number.isFinite(rate) ? rate : null, isDefault }\n })\n .filter((entry): entry is TaxRateOption => Boolean(entry))\n taxRatesRef.current = parsed\n taxRatesLoadedRef.current = true\n setTaxRates(parsed)\n return parsed\n } catch (err) {\n console.error('sales.tax-rates.fetch', err)\n taxRatesRef.current = []\n setTaxRates([])\n taxRatesLoadedRef.current = true\n return []\n }\n }, [])\n\n const applyOppositeAmount = React.useCallback(\n (\n source: 'net' | 'gross',\n rawValue: string,\n values: Record<string, unknown>,\n setFormValue?: (key: string, value: unknown) => void\n ) => {\n if (mode !== 'amount') return\n if (!rawValue || rawValue.trim() === '') {\n if (!setFormValue) return\n setFormValue(source === 'net' ? 'amountGross' : 'amountNet', '')\n return\n }\n const rateValue = resolveTaxRateValue(values)\n if (!Number.isFinite(rateValue)) return\n const numeric = normalizeNumber(rawValue)\n if (!Number.isFinite(numeric)) return\n if (!setFormValue) return\n if (source === 'net') {\n const gross = roundAmount(numeric * (1 + rateValue / 100))\n setFormValue('amountGross', Number.isFinite(gross) ? gross.toFixed(2) : '')\n } else {\n const net = roundAmount(numeric / (1 + rateValue / 100))\n setFormValue('amountNet', Number.isFinite(net) ? net.toFixed(2) : '')\n }\n },\n [mode, resolveTaxRateValue]\n )\n\n React.useEffect(() => {\n if (!open) return\n let mounted = true\n if (!kindOptions.length) {\n void loadKindOptions()\n }\n const prepare = async () => {\n const rates = await loadTaxRates()\n if (!mounted) return\n const metaTaxRateId =\n typeof initialAdjustment?.metadata === 'object' &&\n initialAdjustment?.metadata &&\n typeof (initialAdjustment.metadata as any).taxRateId === 'string'\n ? (initialAdjustment.metadata as any).taxRateId\n : null\n const metaTaxRateValue =\n typeof initialAdjustment?.metadata === 'object' &&\n initialAdjustment?.metadata &&\n Number.isFinite(normalizeNumber((initialAdjustment.metadata as any).taxRate))\n ? Number(normalizeNumber((initialAdjustment.metadata as any).taxRate))\n : null\n const defaultRate = rates.find((rate) => rate.isDefault) ?? null\n const resolvedMode = resolveModeFromAdjustment(initialAdjustment)\n const next: AdjustmentFormState = {\n id: initialAdjustment?.id,\n label: initialAdjustment?.label ?? '',\n code: initialAdjustment?.code ?? '',\n kind: initialAdjustment?.kind ?? (kindOptions[0]?.value as SalesAdjustmentKind) ?? 'custom',\n mode: resolvedMode,\n calculatorKey: initialAdjustment?.calculatorKey ?? '',\n rate: initialAdjustment?.rate ?? '',\n amountNet: initialAdjustment?.amountNet ?? '',\n amountGross: initialAdjustment?.amountGross ?? '',\n position: initialAdjustment?.position ?? '',\n customFieldSetId: initialAdjustment?.customFieldSetId ?? null,\n taxRateId: metaTaxRateId ?? defaultRate?.id ?? null,\n taxRateValue:\n metaTaxRateValue ??\n (Number.isFinite(defaultRate?.rate ?? null) ? (defaultRate?.rate as number) : null),\n }\n const customValues = extractCustomFieldValues(initialAdjustment as Record<string, unknown> | null)\n setInitialValues({ ...next, ...customValues })\n setMode(resolvedMode)\n setFormResetKey((prev) => prev + 1)\n }\n prepare().catch(() => {})\n return () => {\n mounted = false\n }\n }, [initialAdjustment, kindOptions, loadKindOptions, loadTaxRates, open])\n\n const fields = React.useMemo<CrudField<AdjustmentFormState>[]>(() => {\n const percentSuffix = (\n <div className=\"flex h-9 items-center rounded-r-md border border-l-0 bg-muted px-3 text-sm font-semibold text-muted-foreground\">\n %\n </div>\n )\n return [\n {\n id: 'label',\n label: t('sales.documents.adjustments.label', 'Label'),\n type: 'text',\n placeholder: t('sales.documents.adjustments.labelPlaceholder', 'e.g. Shipping fee'),\n required: true,\n },\n {\n id: 'code',\n label: t('sales.documents.adjustments.code', 'Code'),\n type: 'text',\n placeholder: t('sales.documents.adjustments.codePlaceholder', 'PROMO10'),\n },\n {\n id: 'kind',\n label: t('sales.documents.adjustments.kindLabel', 'Kind'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? 'custom')}\n fetchOptions={loadKindOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/sales#adjustment-kinds\"\n selectClassName=\"w-full\"\n labels={{\n placeholder: t('sales.documents.adjustments.kindSelect.placeholder', 'Select adjustment kind\u2026'),\n addLabel: t('sales.config.adjustmentKinds.actions.add', 'Add adjustment kind'),\n addPrompt: t(\n 'sales.config.adjustmentKinds.dialog.createDescription',\n 'Define a reusable adjustment kind shown in document adjustment dialogs.'\n ),\n dialogTitle: t('sales.config.adjustmentKinds.dialog.createTitle', 'Create adjustment kind'),\n valueLabel: t('sales.config.adjustmentKinds.form.codeLabel', 'Code'),\n valuePlaceholder: t('sales.config.adjustmentKinds.form.codePlaceholder', 'e.g. discount'),\n labelLabel: t('sales.config.adjustmentKinds.form.labelLabel', 'Label'),\n labelPlaceholder: t('sales.config.adjustmentKinds.form.labelPlaceholder', 'e.g. Discount'),\n emptyError: t('sales.config.adjustmentKinds.errors.required', 'Code is required.'),\n cancelLabel: t('ui.actions.cancel', 'Cancel'),\n saveLabel: t('ui.actions.save', 'Save'),\n saveShortcutHint: t('ui.actions.saveShortcut', 'Cmd/Ctrl + Enter'),\n successCreateLabel: t('sales.config.adjustmentKinds.messages.created', 'Adjustment kind created.'),\n errorLoad: t('sales.config.adjustmentKinds.errors.load', 'Failed to load adjustment kinds.'),\n errorSave: t('sales.config.adjustmentKinds.errors.save', 'Failed to save adjustment kind.'),\n loadingLabel: t('sales.config.adjustmentKinds.loading', 'Loading adjustment kinds\u2026'),\n manageTitle: t('sales.config.adjustmentKinds.title', 'Adjustment kinds'),\n }}\n showLabelInput={false}\n />\n ),\n },\n {\n id: 'calculatorKey',\n label: t('sales.documents.adjustments.calculatorKey', 'Calculator key'),\n type: 'text',\n placeholder: 'optional',\n },\n {\n id: 'mode',\n label: t('sales.documents.adjustments.amountMode', 'Calculation mode'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentMode = value === 'rate' || value === 'amount' ? value : mode\n return (\n <div className=\"inline-flex rounded-md border bg-muted/50 p-1 text-sm font-medium\">\n {(['rate', 'amount'] as const).map((option) => (\n <button\n key={option}\n type=\"button\"\n className={`rounded px-3 py-1 transition-colors ${\n currentMode === option ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground'\n }`}\n onClick={() => {\n setMode(option)\n setValue?.(option)\n if (option === 'rate') {\n const form = dialogContentRef.current?.querySelector('form')\n const rateInput = form?.querySelector<HTMLInputElement>('input[name=\"rate\"]')\n rateInput?.focus()\n }\n }}\n >\n {option === 'rate'\n ? t('sales.documents.adjustments.mode.rate', 'Percentage')\n : t('sales.documents.adjustments.mode.amount', 'Fixed amount')}\n </button>\n ))}\n </div>\n )\n },\n },\n {\n id: 'rate',\n label: t('sales.documents.adjustments.rate', 'Rate'),\n type: 'custom',\n placeholder: '0.00',\n required: mode === 'rate',\n component: ({ value, setValue }) => (\n <div className=\"flex items-center\">\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n disabled={mode !== 'rate'}\n className=\"rounded-r-none\"\n />\n {percentSuffix}\n </div>\n ),\n },\n {\n id: 'amountNet',\n label: t('sales.documents.adjustments.amountNet', 'Net amount'),\n type: 'custom',\n placeholder: '0.00',\n required: mode === 'amount',\n disabled: mode !== 'amount',\n layout: 'half',\n component: ({ value, setValue, setFormValue, values }) => (\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => {\n setValue(event.target.value)\n lastAmountChangedRef.current = 'net'\n applyOppositeAmount('net', event.target.value, values ?? {}, setFormValue)\n }}\n placeholder=\"0.00\"\n disabled={mode !== 'amount'}\n />\n ),\n },\n {\n id: 'amountGross',\n label: t('sales.documents.adjustments.amountGross', 'Gross amount'),\n type: 'custom',\n placeholder: '0.00',\n disabled: mode !== 'amount',\n layout: 'half',\n component: ({ value, setValue, setFormValue, values }) => (\n <Input\n value={typeof value === 'string' ? value : value == null ? '' : String(value)}\n onChange={(event) => {\n setValue(event.target.value)\n lastAmountChangedRef.current = 'gross'\n applyOppositeAmount('gross', event.target.value, values ?? {}, setFormValue)\n }}\n placeholder=\"0.00\"\n disabled={mode !== 'amount'}\n />\n ),\n },\n {\n id: 'taxRateId',\n label: t('sales.documents.adjustments.taxRate', 'Tax class'),\n type: 'custom',\n layout: 'half',\n component: ({ value, setValue, setFormValue, values }) => {\n const resolvedValue =\n typeof value === 'string' && value.trim().length\n ? value\n : null\n const rateId =\n resolvedValue ??\n (() => {\n const rateValue = normalizeNumber(\n (values as any)?.taxRateValue ?? (values as any)?.taxRate\n )\n if (!Number.isFinite(rateValue)) return null\n const match = taxRatesRef.current.find(\n (rate) => Number.isFinite(rate.rate) && rate.rate === rateValue\n )\n return match?.id ?? null\n })()\n const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const nextId = event.target.value || null\n const option = nextId ? taxRateMap.get(nextId) ?? null : null\n setValue(nextId)\n const normalizedRate = normalizeNumber(option?.rate)\n setFormValue?.('taxRateValue', Number.isFinite(normalizedRate) ? normalizedRate : null)\n const rateNumeric = Number.isFinite(normalizedRate) ? normalizedRate : null\n if (rateNumeric === null) return\n const lastChanged = lastAmountChangedRef.current\n if (mode !== 'amount') return\n if (lastChanged === 'gross') {\n const gross = normalizeNumber((values as any)?.amountGross)\n if (Number.isFinite(gross)) {\n const net = roundAmount(gross / (1 + rateNumeric / 100))\n setFormValue?.('amountNet', net.toFixed(2))\n }\n return\n }\n const net = normalizeNumber((values as any)?.amountNet)\n if (Number.isFinite(net)) {\n const gross = roundAmount(net * (1 + rateNumeric / 100))\n setFormValue?.('amountGross', gross.toFixed(2))\n }\n }\n return (\n <div className=\"flex items-center gap-2\">\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={rateId ?? ''}\n onChange={handleChange}\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t('sales.documents.adjustments.taxRate.placeholder', 'No tax class selected')\n : t('sales.documents.adjustments.taxRate.empty', 'No tax classes available')}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== 'undefined') {\n window.open('/backend/config/sales?section=tax-rates', '_blank', 'noopener,noreferrer')\n }\n }}\n title={t('sales.documents.adjustments.taxRate.manage', 'Manage tax classes')}\n >\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {t('sales.documents.adjustments.taxRate.manage', 'Manage tax classes')}\n </span>\n </Button>\n </div>\n )\n },\n },\n {\n id: 'taxRateValue',\n label: '',\n type: 'custom',\n component: () => null,\n },\n {\n id: 'position',\n label: t('sales.documents.adjustments.position', 'Position'),\n type: 'number',\n placeholder: '0',\n },\n {\n id: 'currencyDisplay',\n label: t('sales.documents.adjustments.currency', 'Currency'),\n type: 'custom',\n component: () => (\n <Badge variant=\"outline\" className=\"px-3 py-2 text-sm font-semibold\">\n {currencyCode ? currencyCode.toUpperCase() : t('sales.documents.adjustments.currencyPlaceholder', 'e.g. USD')}\n </Badge>\n ),\n },\n ]\n }, [applyOppositeAmount, currencyCode, loadKindOptions, mode, t, taxRates.length, taxRateMap])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n return [\n { id: 'adjustment-core', fields },\n {\n id: 'adjustment-custom',\n column: 2,\n title: t('entities.customFields.title', 'Custom fields'),\n kind: 'customFields',\n },\n ]\n }, [fields, t])\n\n const resolveFormMode = React.useCallback(\n (values: Record<string, unknown>): 'rate' | 'amount' => {\n const raw = values.mode\n if (raw === 'rate' || raw === 'amount') return raw\n return mode\n },\n [mode]\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const calculationMode = resolveFormMode(values)\n const resolvedCurrency = currencyCode ? currencyCode.toUpperCase() : ''\n if (!resolvedCurrency || resolvedCurrency.length !== 3) {\n throw createCrudFormError(\n t('sales.documents.adjustments.errorCurrency', 'Currency is required.'),\n { currencyCode: t('sales.documents.adjustments.errorCurrency', 'Currency is required.') }\n )\n }\n const label = typeof values.label === 'string' ? values.label.trim() : ''\n if (!label.length) {\n throw createCrudFormError(\n t('sales.documents.adjustments.labelRequired', 'Label is required.'),\n { label: t('sales.documents.adjustments.labelRequired', 'Label is required.') }\n )\n }\n const percentageRate = normalizeNumber(values.rate)\n const amountNet = normalizeNumber(values.amountNet)\n const amountGross = normalizeNumber(values.amountGross)\n if (calculationMode === 'rate') {\n if (!Number.isFinite(percentageRate)) {\n throw createCrudFormError(\n t('sales.documents.adjustments.errorRate', 'Enter a percentage rate.'),\n { rate: t('sales.documents.adjustments.errorRate', 'Enter a percentage rate.') }\n )\n }\n } else {\n if (!Number.isFinite(amountNet) && !Number.isFinite(amountGross)) {\n throw createCrudFormError(\n t('sales.documents.adjustments.errorAmount', 'Provide at least one amount.'),\n { amountNet: t('sales.documents.adjustments.errorAmount', 'Provide at least one amount.') }\n )\n }\n }\n const customFields = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n })\n const rateValue = resolveTaxRateValue(values)\n const selectedRateId =\n typeof values.taxRateId === 'string' && values.taxRateId.trim().length\n ? values.taxRateId\n : null\n const metadata: Record<string, unknown> = {\n ...(typeof initialAdjustment?.metadata === 'object' && initialAdjustment?.metadata\n ? initialAdjustment.metadata\n : {}),\n }\n const isEditingProviderAdjustment =\n typeof initialAdjustment?.calculatorKey === 'string' &&\n PROVIDER_CALCULATOR_PREFIXES.some((prefix) =>\n (initialAdjustment?.calculatorKey ?? '').startsWith(prefix)\n )\n if (selectedRateId) metadata.taxRateId = selectedRateId\n if (Number.isFinite(rateValue)) metadata.taxRate = rateValue\n if (isEditingProviderAdjustment) {\n metadata.manualOverride = true\n }\n metadata.calculationMode = calculationMode\n\n const payload: AdjustmentSubmitPayload = {\n id: typeof values.id === 'string' ? values.id : initialAdjustment?.id,\n label,\n code:\n typeof values.code === 'string' && values.code.trim().length ? values.code.trim() : null,\n kind:\n typeof values.kind === 'string' && values.kind.trim().length\n ? (values.kind as SalesAdjustmentKind)\n : 'custom',\n calculatorKey:\n typeof values.calculatorKey === 'string' && values.calculatorKey.trim().length\n ? values.calculatorKey.trim()\n : null,\n rate: calculationMode === 'rate' && Number.isFinite(percentageRate) ? percentageRate : null,\n amountNet: calculationMode === 'amount' && Number.isFinite(amountNet) ? amountNet : null,\n amountGross: calculationMode === 'amount' && Number.isFinite(amountGross) ? amountGross : null,\n position: Number.isFinite(normalizeNumber(values.position)) ? Number(normalizeNumber(values.position)) : null,\n currencyCode: resolvedCurrency,\n customFields: Object.keys(customFields).length ? normalizeCustomFieldValues(customFields) : null,\n metadata: Object.keys(metadata).length ? metadata : null,\n }\n await onSubmit(payload)\n onOpenChange(false)\n },\n [\n currencyCode,\n initialAdjustment?.calculatorKey,\n initialAdjustment?.id,\n initialAdjustment?.metadata,\n onOpenChange,\n onSubmit,\n resolveFormMode,\n resolveTaxRateValue,\n t,\n ]\n )\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"sm:max-w-5xl\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onOpenChange(false)\n return\n }\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n const form = dialogContentRef.current?.querySelector('form')\n form?.requestSubmit()\n }\n }}\n ref={dialogContentRef}\n >\n <DialogHeader>\n <DialogTitle>{initialAdjustment ? labels.editTitle : labels.addTitle}</DialogTitle>\n </DialogHeader>\n <CrudForm<AdjustmentFormState>\n key={formResetKey}\n embedded\n fields={fields}\n groups={groups}\n entityId={entityId}\n initialValues={initialValues}\n submitLabel={initialAdjustment ? labels.submitUpdate : labels.submitCreate}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.adjustments.loading', 'Loading adjustments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
5
  "mappings": ";AAiUM,cAwGI,YAxGJ;AA7TN,YAAY,WAAW;AACvB,SAAS,QAAQ,eAAe,cAAc,mBAAmB;AACjE,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,gBAAoD;AAC7D,SAAS,gCAAgC;AACzC,SAAS,eAAe;AACxB,SAAS,2BAA2B;AACpC,SAAuC,kCAAkC;AACzE,SAAS,6BAAoD;AAC7D,SAAS,YAAY;AAErB,SAAS,SAAS;AAClB,SAAS,gBAAgB;AACzB,SAAS,0BAA0B,uCAAuC;AA0E1E,MAAM,kBAAkB,CAAC,UAAkC;AACzD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAChE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,QAAQ;AACpD,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEA,MAAM,qBAAqB,CAAC,SAAgC;AAC1D,QAAM,SAAmB,CAAC;AAC1B,MAAI,OAAO,KAAK,SAAS,YAAY,OAAO,SAAS,KAAK,IAAI,GAAG;AAC/D,WAAO,KAAK,GAAG,KAAK,IAAI,GAAG;AAAA,EAC7B;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK,KAAK,KAAK,YAAY,CAAC;AAAA,EACrC;AACA,MAAI,CAAC,OAAO,OAAQ,QAAO,KAAK;AAChC,SAAO,GAAG,KAAK,IAAI,WAAM,OAAO,KAAK,QAAK,CAAC;AAC7C;AAEA,MAAM,cAAc,CAAC,UAA0B,KAAK,OAAO,QAAQ,OAAO,WAAW,GAAG,IAAI;AAE5F,MAAM,4BAA4B,CAAC,eAA6D;AAC9F,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,eACJ,OAAO,WAAW,aAAa,YAAY,WAAW,WACjD,WAAW,SAAiB,kBAC7B;AACN,MAAI,iBAAiB,UAAU,iBAAiB,SAAU,QAAO;AACjE,QAAM,YAAY,gBAAgB,WAAW,IAAI;AACjD,QAAM,iBAAiB,gBAAgB,WAAW,SAAS;AAC3D,QAAM,mBAAmB,gBAAgB,WAAW,WAAW;AAC/D,QAAM,aAAa,OAAO,SAAS,cAAc,KAAK,OAAO,SAAS,gBAAgB;AACtF,MAAI,OAAO,SAAS,SAAS,MAAM,cAAc,KAAK,CAAC,YAAa,QAAO;AAC3E,MAAI,WAAY,QAAO;AACvB,SAAO;AACT;AAEA,MAAM,+BAA+B,CAAC,sBAAsB,mBAAmB;AAExE,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,IAAI,KAAK;AACf,QAAM,mBAAmB,MAAM,OAA8B,IAAI;AACjE,QAAM,WAAW,SAAS,UAAU,EAAE,MAAM,yBAAyB,EAAE,MAAM;AAC7E,QAAM,cAAiC,0BAA0B,iBAAiB;AAClF,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAA4B,WAAW;AACrE,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,CAAC;AACxD,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA0B,CAAC,CAAC;AAClE,QAAM,cAAc,MAAM,OAAwB,CAAC,CAAC;AACpD,QAAM,oBAAoB,MAAM,OAAO,KAAK;AAC5C,QAAM,uBAAuB,MAAM,OAA+B,IAAI;AACtE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA8B,OAAO;AAAA,IACnF,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAO,YAAY,CAAC,GAAG,SAAiC;AAAA,IACxD,MAAM;AAAA,IACN,eAAe;AAAA,IACf,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,cAAc;AAAA,EAChB,EAAE;AAEF,QAAM,aAAa,MAAM;AAAA,IACvB,MACE,SAAS,OAAmC,CAAC,KAAK,SAAS;AACzD,UAAI,IAAI,KAAK,IAAI,IAAI;AACrB,aAAO;AAAA,IACT,GAAG,oBAAI,IAAI,CAAC;AAAA,IACd,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,CAAC,WAAmD;AAClD,YAAM,WAAW,gBAAiB,QAAgB,YAAY;AAC9D,UAAI,OAAO,SAAS,QAAQ,EAAG,QAAO;AACtC,YAAM,SACJ,OAAQ,QAAgB,cAAc,YAAa,QAAgB,UAAU,KAAK,EAAE,SAC/E,QAAgB,UAAU,KAAK,IAChC;AACN,UAAI,QAAQ;AACV,cAAM,SAAS,WAAW,IAAI,MAAM;AACpC,cAAM,SAAS,gBAAgB,QAAQ,IAAI;AAC3C,YAAI,OAAO,SAAS,MAAM,EAAG,QAAO;AAAA,MACtC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,eAAe,MAAM,YAAY,YAAsC;AAC3E,QAAI,kBAAkB,WAAW,YAAY,QAAQ,OAAQ,QAAO,YAAY;AAChF,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/E,YAAM,SAAS,MACZ,IAA0B,CAAC,SAAS;AACnC,cAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,cAAM,OACJ,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC9C,KAAK,KAAK,KAAK,IACf,OAAO,KAAK,SAAS,WACnB,KAAK,OACL;AACR,YAAI,CAAC,MAAM,CAAC,KAAM,QAAO;AACzB,cAAM,OAAO,gBAAiB,KAAa,IAAI;AAC/C,cAAM,OACJ,OAAQ,KAAa,SAAS,YAAa,KAAa,KAAK,KAAK,EAAE,SAC/D,KAAa,KAAK,KAAK,IACxB;AACN,cAAM,YAAY,QAAS,KAAa,aAAc,KAAa,UAAU;AAC7E,eAAO,EAAE,IAAI,MAAM,MAAM,MAAM,OAAO,SAAS,IAAI,IAAI,OAAO,MAAM,UAAU;AAAA,MAChF,CAAC,EACA,OAAO,CAAC,UAAkC,QAAQ,KAAK,CAAC;AAC3D,kBAAY,UAAU;AACtB,wBAAkB,UAAU;AAC5B,kBAAY,MAAM;AAClB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,MAAM,yBAAyB,GAAG;AAC1C,kBAAY,UAAU,CAAC;AACvB,kBAAY,CAAC,CAAC;AACd,wBAAkB,UAAU;AAC5B,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM;AAAA,IAChC,CACE,QACA,UACA,QACA,iBACG;AACH,UAAI,SAAS,SAAU;AACvB,UAAI,CAAC,YAAY,SAAS,KAAK,MAAM,IAAI;AACvC,YAAI,CAAC,aAAc;AACnB,qBAAa,WAAW,QAAQ,gBAAgB,aAAa,EAAE;AAC/D;AAAA,MACF;AACA,YAAM,YAAY,oBAAoB,MAAM;AAC5C,UAAI,CAAC,OAAO,SAAS,SAAS,EAAG;AACjC,YAAM,UAAU,gBAAgB,QAAQ;AACxC,UAAI,CAAC,OAAO,SAAS,OAAO,EAAG;AAC/B,UAAI,CAAC,aAAc;AACnB,UAAI,WAAW,OAAO;AACpB,cAAM,QAAQ,YAAY,WAAW,IAAI,YAAY,IAAI;AACzD,qBAAa,eAAe,OAAO,SAAS,KAAK,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE;AAAA,MAC5E,OAAO;AACL,cAAM,MAAM,YAAY,WAAW,IAAI,YAAY,IAAI;AACvD,qBAAa,aAAa,OAAO,SAAS,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,IACA,CAAC,MAAM,mBAAmB;AAAA,EAC5B;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,QAAI,UAAU;AACd,QAAI,CAAC,YAAY,QAAQ;AACvB,WAAK,gBAAgB;AAAA,IACvB;AACA,UAAM,UAAU,YAAY;AAC1B,YAAM,QAAQ,MAAM,aAAa;AACjC,UAAI,CAAC,QAAS;AACd,YAAM,gBACJ,OAAO,mBAAmB,aAAa,YACvC,mBAAmB,YACnB,OAAQ,kBAAkB,SAAiB,cAAc,WACpD,kBAAkB,SAAiB,YACpC;AACN,YAAM,mBACJ,OAAO,mBAAmB,aAAa,YACvC,mBAAmB,YACnB,OAAO,SAAS,gBAAiB,kBAAkB,SAAiB,OAAO,CAAC,IACxE,OAAO,gBAAiB,kBAAkB,SAAiB,OAAO,CAAC,IACnE;AACN,YAAM,cAAc,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK;AAC5D,YAAM,eAAe,0BAA0B,iBAAiB;AAChE,YAAM,OAA4B;AAAA,QAChC,IAAI,mBAAmB;AAAA,QACvB,OAAO,mBAAmB,SAAS;AAAA,QACnC,MAAM,mBAAmB,QAAQ;AAAA,QACjC,MAAM,mBAAmB,QAAS,YAAY,CAAC,GAAG,SAAiC;AAAA,QACnF,MAAM;AAAA,QACN,eAAe,mBAAmB,iBAAiB;AAAA,QACnD,MAAM,mBAAmB,QAAQ;AAAA,QACjC,WAAW,mBAAmB,aAAa;AAAA,QAC3C,aAAa,mBAAmB,eAAe;AAAA,QAC/C,UAAU,mBAAmB,YAAY;AAAA,QACzC,kBAAkB,mBAAmB,oBAAoB;AAAA,QACzD,WAAW,iBAAiB,aAAa,MAAM;AAAA,QAC/C,cACE,qBACC,OAAO,SAAS,aAAa,QAAQ,IAAI,IAAK,aAAa,OAAkB;AAAA,MAClF;AACA,YAAM,eAAe,yBAAyB,iBAAmD;AACjG,uBAAiB,EAAE,GAAG,MAAM,GAAG,aAAa,CAAC;AAC7C,cAAQ,YAAY;AACpB,sBAAgB,CAAC,SAAS,OAAO,CAAC;AAAA,IACpC;AACA,YAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACxB,WAAO,MAAM;AACX,gBAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,mBAAmB,aAAa,iBAAiB,cAAc,IAAI,CAAC;AAExE,QAAM,SAAS,MAAM,QAA0C,MAAM;AACnE,UAAM,gBACJ,oBAAC,SAAI,WAAU,kHAAiH,eAEhI;AAEF,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,qCAAqC,OAAO;AAAA,QACrD,MAAM;AAAA,QACN,aAAa,EAAE,gDAAgD,mBAAmB;AAAA,QAClF,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,oCAAoC,MAAM;AAAA,QACnD,MAAM;AAAA,QACN,aAAa,EAAE,+CAA+C,SAAS;AAAA,MACzE;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,yCAAyC,MAAM;AAAA,QACxD,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW,CAAC,EAAE,OAAO,SAAS,MAC5B;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,YAC3C,UAAU,CAAC,SAAS,SAAS,QAAQ,QAAQ;AAAA,YAC7C,cAAc;AAAA,YACd,mBAAmB;AAAA,YACnB,YAAW;AAAA,YACX,iBAAgB;AAAA,YAChB,QAAQ;AAAA,cACN,aAAa,EAAE,sDAAsD,8BAAyB;AAAA,cAC9F,UAAU,EAAE,4CAA4C,qBAAqB;AAAA,cAC7E,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cACA,aAAa,EAAE,mDAAmD,wBAAwB;AAAA,cAC1F,YAAY,EAAE,+CAA+C,MAAM;AAAA,cACnE,kBAAkB,EAAE,qDAAqD,eAAe;AAAA,cACxF,YAAY,EAAE,gDAAgD,OAAO;AAAA,cACrE,kBAAkB,EAAE,sDAAsD,eAAe;AAAA,cACzF,YAAY,EAAE,gDAAgD,mBAAmB;AAAA,cACjF,aAAa,EAAE,qBAAqB,QAAQ;AAAA,cAC5C,WAAW,EAAE,mBAAmB,MAAM;AAAA,cACtC,kBAAkB,EAAE,2BAA2B,kBAAkB;AAAA,cACjE,oBAAoB,EAAE,iDAAiD,0BAA0B;AAAA,cACjG,WAAW,EAAE,4CAA4C,kCAAkC;AAAA,cAC3F,WAAW,EAAE,4CAA4C,iCAAiC;AAAA,cAC1F,cAAc,EAAE,wCAAwC,gCAA2B;AAAA,cACnF,aAAa,EAAE,sCAAsC,kBAAkB;AAAA,YACzE;AAAA,YACA,gBAAgB;AAAA;AAAA,QAClB;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,6CAA6C,gBAAgB;AAAA,QACtE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,0CAA0C,kBAAkB;AAAA,QACrE,MAAM;AAAA,QACN,WAAW,CAAC,EAAE,OAAO,SAAS,MAAM;AAClC,gBAAM,cAAc,UAAU,UAAU,UAAU,WAAW,QAAQ;AACrE,iBACE,oBAAC,SAAI,WAAU,qEACX,WAAC,QAAQ,QAAQ,EAAY,IAAI,CAAC,WAClC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,uCACT,gBAAgB,SAAS,4CAA4C,uBACvE;AAAA,cACA,SAAS,MAAM;AACb,wBAAQ,MAAM;AACd,2BAAW,MAAM;AACjB,oBAAI,WAAW,QAAQ;AACrB,wBAAM,OAAO,iBAAiB,SAAS,cAAc,MAAM;AAC3D,wBAAM,YAAY,MAAM,cAAgC,oBAAoB;AAC5E,6BAAW,MAAM;AAAA,gBACnB;AAAA,cACF;AAAA,cAEC,qBAAW,SACR,EAAE,yCAAyC,YAAY,IACvD,EAAE,2CAA2C,cAAc;AAAA;AAAA,YAjB1D;AAAA,UAkBP,CACD,GACH;AAAA,QAEJ;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,oCAAoC,MAAM;AAAA,QACnD,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,WAAW,CAAC,EAAE,OAAO,SAAS,MAC5B,qBAAC,SAAI,WAAU,qBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,cAC5E,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,cAChD,aAAY;AAAA,cACZ,UAAU,SAAS;AAAA,cACnB,WAAU;AAAA;AAAA,UACZ;AAAA,UACC;AAAA,WACH;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,yCAAyC,YAAY;AAAA,QAC9D,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,QACnB,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAClD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,YAC5E,UAAU,CAAC,UAAU;AACnB,uBAAS,MAAM,OAAO,KAAK;AAC3B,mCAAqB,UAAU;AAC/B,kCAAoB,OAAO,MAAM,OAAO,OAAO,UAAU,CAAC,GAAG,YAAY;AAAA,YAC3E;AAAA,YACA,aAAY;AAAA,YACZ,UAAU,SAAS;AAAA;AAAA,QACrB;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,2CAA2C,cAAc;AAAA,QAClE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAClD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAAA,YAC5E,UAAU,CAAC,UAAU;AACnB,uBAAS,MAAM,OAAO,KAAK;AAC3B,mCAAqB,UAAU;AAC/B,kCAAoB,SAAS,MAAM,OAAO,OAAO,UAAU,CAAC,GAAG,YAAY;AAAA,YAC7E;AAAA,YACA,aAAY;AAAA,YACZ,UAAU,SAAS;AAAA;AAAA,QACrB;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,uCAAuC,WAAW;AAAA,QAC3D,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,CAAC,EAAE,OAAO,UAAU,cAAc,OAAO,MAAM;AACxD,gBAAM,gBACJ,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SACtC,QACA;AACN,gBAAM,SACJ,kBACC,MAAM;AACL,kBAAM,YAAY;AAAA,cACf,QAAgB,gBAAiB,QAAgB;AAAA,YACpD;AACA,gBAAI,CAAC,OAAO,SAAS,SAAS,EAAG,QAAO;AACxC,kBAAM,QAAQ,YAAY,QAAQ;AAAA,cAChC,CAAC,SAAS,OAAO,SAAS,KAAK,IAAI,KAAK,KAAK,SAAS;AAAA,YACxD;AACA,mBAAO,OAAO,MAAM;AAAA,UACtB,GAAG;AACL,gBAAM,eAAe,CAAC,UAAgD;AACpE,kBAAM,SAAS,MAAM,OAAO,SAAS;AACrC,kBAAM,SAAS,SAAS,WAAW,IAAI,MAAM,KAAK,OAAO;AACzD,qBAAS,MAAM;AACf,kBAAM,iBAAiB,gBAAgB,QAAQ,IAAI;AACnD,2BAAe,gBAAgB,OAAO,SAAS,cAAc,IAAI,iBAAiB,IAAI;AACtF,kBAAM,cAAc,OAAO,SAAS,cAAc,IAAI,iBAAiB;AACvE,gBAAI,gBAAgB,KAAM;AAC1B,kBAAM,cAAc,qBAAqB;AACzC,gBAAI,SAAS,SAAU;AACvB,gBAAI,gBAAgB,SAAS;AAC3B,oBAAM,QAAQ,gBAAiB,QAAgB,WAAW;AAC1D,kBAAI,OAAO,SAAS,KAAK,GAAG;AAC1B,sBAAMA,OAAM,YAAY,SAAS,IAAI,cAAc,IAAI;AACvD,+BAAe,aAAaA,KAAI,QAAQ,CAAC,CAAC;AAAA,cAC5C;AACA;AAAA,YACF;AACA,kBAAM,MAAM,gBAAiB,QAAgB,SAAS;AACtD,gBAAI,OAAO,SAAS,GAAG,GAAG;AACxB,oBAAM,QAAQ,YAAY,OAAO,IAAI,cAAc,IAAI;AACvD,6BAAe,eAAe,MAAM,QAAQ,CAAC,CAAC;AAAA,YAChD;AAAA,UACF;AACA,iBACE,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,UAAU;AAAA,gBACjB,UAAU;AAAA,gBACV,UAAU,CAAC,SAAS;AAAA,gBAEpB;AAAA,sCAAC,YAAO,OAAM,IACX,mBAAS,SACN,EAAE,mDAAmD,uBAAuB,IAC5E,EAAE,6CAA6C,0BAA0B,GAC/E;AAAA,kBACC,SAAS,IAAI,CAAC,SACb,oBAAC,YAAqB,OAAO,KAAK,IAC/B,6BAAmB,IAAI,KADb,KAAK,EAElB,CACD;AAAA;AAAA;AAAA,YACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,sBAAI,OAAO,WAAW,aAAa;AACjC,2BAAO,KAAK,2CAA2C,UAAU,qBAAqB;AAAA,kBACxF;AAAA,gBACF;AAAA,gBACA,OAAO,EAAE,8CAA8C,oBAAoB;AAAA,gBAE3E;AAAA,sCAAC,YAAS,WAAU,WAAU;AAAA,kBAC9B,oBAAC,UAAK,WAAU,WACb,YAAE,8CAA8C,oBAAoB,GACvE;AAAA;AAAA;AAAA,YACF;AAAA,aACF;AAAA,QAEJ;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,wCAAwC,UAAU;AAAA,QAC3D,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,wCAAwC,UAAU;AAAA,QAC3D,MAAM;AAAA,QACN,WAAW,MACT,oBAAC,SAAM,SAAQ,WAAU,WAAU,mCAChC,yBAAe,aAAa,YAAY,IAAI,EAAE,mDAAmD,UAAU,GAC9G;AAAA,MAEJ;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,cAAc,iBAAiB,MAAM,GAAG,SAAS,QAAQ,UAAU,CAAC;AAE7F,QAAM,SAAS,MAAM,QAAyB,MAAM;AAClD,WAAO;AAAA,MACL,EAAE,IAAI,mBAAmB,OAAO;AAAA,MAChC;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,+BAA+B,eAAe;AAAA,QACvD,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC,CAAC;AAEd,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,WAAuD;AACtD,YAAM,MAAM,OAAO;AACnB,UAAI,QAAQ,UAAU,QAAQ,SAAU,QAAO;AAC/C,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO,WAAoC;AACzC,YAAM,kBAAkB,gBAAgB,MAAM;AAC9C,YAAM,mBAAmB,eAAe,aAAa,YAAY,IAAI;AACrE,UAAI,CAAC,oBAAoB,iBAAiB,WAAW,GAAG;AACtD,cAAM;AAAA,UACJ,EAAE,6CAA6C,uBAAuB;AAAA,UACtE,EAAE,cAAc,EAAE,6CAA6C,uBAAuB,EAAE;AAAA,QAC1F;AAAA,MACF;AACA,YAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,MAAM,KAAK,IAAI;AACvE,UAAI,CAAC,MAAM,QAAQ;AACjB,cAAM;AAAA,UACJ,EAAE,6CAA6C,oBAAoB;AAAA,UACnE,EAAE,OAAO,EAAE,6CAA6C,oBAAoB,EAAE;AAAA,QAChF;AAAA,MACF;AACA,YAAM,iBAAiB,gBAAgB,OAAO,IAAI;AAClD,YAAM,YAAY,gBAAgB,OAAO,SAAS;AAClD,YAAM,cAAc,gBAAgB,OAAO,WAAW;AACtD,UAAI,oBAAoB,QAAQ;AAC9B,YAAI,CAAC,OAAO,SAAS,cAAc,GAAG;AACpC,gBAAM;AAAA,YACJ,EAAE,yCAAyC,0BAA0B;AAAA,YACrE,EAAE,MAAM,EAAE,yCAAyC,0BAA0B,EAAE;AAAA,UACjF;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,CAAC,OAAO,SAAS,SAAS,KAAK,CAAC,OAAO,SAAS,WAAW,GAAG;AAChE,gBAAM;AAAA,YACJ,EAAE,2CAA2C,8BAA8B;AAAA,YAC3E,EAAE,WAAW,EAAE,2CAA2C,8BAA8B,EAAE;AAAA,UAC5F;AAAA,QACF;AAAA,MACF;AACA,YAAM,eAAe,yBAAyB,QAAQ;AAAA,QACpD,WAAW,CAAC,UAAU,gCAAgC,KAAK;AAAA,MAC7D,CAAC;AACD,YAAM,YAAY,oBAAoB,MAAM;AAC5C,YAAM,iBACJ,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,KAAK,EAAE,SAC5D,OAAO,YACP;AACN,YAAM,WAAoC;AAAA,QACxC,GAAI,OAAO,mBAAmB,aAAa,YAAY,mBAAmB,WACtE,kBAAkB,WAClB,CAAC;AAAA,MACP;AACA,YAAM,8BACJ,OAAO,mBAAmB,kBAAkB,YAC5C,6BAA6B;AAAA,QAAK,CAAC,YAChC,mBAAmB,iBAAiB,IAAI,WAAW,MAAM;AAAA,MAC5D;AACF,UAAI,eAAgB,UAAS,YAAY;AACzC,UAAI,OAAO,SAAS,SAAS,EAAG,UAAS,UAAU;AACnD,UAAI,6BAA6B;AAC/B,iBAAS,iBAAiB;AAAA,MAC5B;AACA,eAAS,kBAAkB;AAE3B,YAAM,UAAmC;AAAA,QACvC,IAAI,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK,mBAAmB;AAAA,QACnE;AAAA,QACA,MACE,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,EAAE,SAAS,OAAO,KAAK,KAAK,IAAI;AAAA,QACtF,MACE,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,EAAE,SACjD,OAAO,OACR;AAAA,QACN,eACE,OAAO,OAAO,kBAAkB,YAAY,OAAO,cAAc,KAAK,EAAE,SACpE,OAAO,cAAc,KAAK,IAC1B;AAAA,QACN,MAAM,oBAAoB,UAAU,OAAO,SAAS,cAAc,IAAI,iBAAiB;AAAA,QACvF,WAAW,oBAAoB,YAAY,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,QACpF,aAAa,oBAAoB,YAAY,OAAO,SAAS,WAAW,IAAI,cAAc;AAAA,QAC1F,UAAU,OAAO,SAAS,gBAAgB,OAAO,QAAQ,CAAC,IAAI,OAAO,gBAAgB,OAAO,QAAQ,CAAC,IAAI;AAAA,QACzG,cAAc;AAAA,QACd,cAAc,OAAO,KAAK,YAAY,EAAE,SAAS,2BAA2B,YAAY,IAAI;AAAA,QAC5F,UAAU,OAAO,KAAK,QAAQ,EAAE,SAAS,WAAW;AAAA,MACtD;AACA,YAAM,SAAS,OAAO;AACtB,mBAAa,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,MACE;AAAA,MACA,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,oBAAC,UAAO,MAAY,cAClB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,WAAW,CAAC,UAAU;AACpB,YAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAM,eAAe;AACrB,uBAAa,KAAK;AAClB;AAAA,QACF;AACA,aAAK,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,SAAS;AAC7D,gBAAM,eAAe;AACrB,gBAAM,OAAO,iBAAiB,SAAS,cAAc,MAAM;AAC3D,gBAAM,cAAc;AAAA,QACtB;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MAEL;AAAA,4BAAC,gBACC,8BAAC,eAAa,8BAAoB,OAAO,YAAY,OAAO,UAAS,GACvE;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YAEC,UAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa,oBAAoB,OAAO,eAAe,OAAO;AAAA,YAC9D,UAAU;AAAA,YACV,gBAAgB,EAAE,uCAAuC,2BAAsB;AAAA,YAC/E,4BAA4B,EAAE,oBAAoB,iBAAiB;AAAA;AAAA,UAT9D;AAAA,QAUP;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;",
6
6
  "names": ["net"]
7
7
  }
@@ -31,12 +31,12 @@ function DocumentTotals({ title, currency, items, className }) {
31
31
  const hiddenCount = Math.max(0, uniqueItemCount - visibleItems.length);
32
32
  if (!items.length) return null;
33
33
  return /* @__PURE__ */ jsx("div", { className: cn("space-y-3", className), children: /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded-xl border bg-card shadow-sm", children: [
34
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b bg-muted/40 px-4 py-3", children: [
34
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b bg-muted/50 px-4 py-3", children: [
35
35
  /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: heading }),
36
- currency ? /* @__PURE__ */ jsx("span", { className: "rounded-full border border-border/60 bg-background/60 px-3 py-1 text-xs font-semibold tracking-wide text-foreground", children: currency }) : null
36
+ currency ? /* @__PURE__ */ jsx("span", { className: "rounded-full border border-border/70 bg-background/80 px-3 py-1 text-xs font-semibold tracking-wide text-foreground", children: currency }) : null
37
37
  ] }),
38
38
  /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
39
- /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-border/80", children: visibleItems.filter((item) => !item.emphasize).map((item) => /* @__PURE__ */ jsxs("tr", { className: "bg-background/60 transition-colors hover:bg-muted/30", children: [
39
+ /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-border/80", children: visibleItems.filter((item) => !item.emphasize).map((item) => /* @__PURE__ */ jsxs("tr", { className: "bg-background/80 transition-colors hover:bg-muted/30", children: [
40
40
  /* @__PURE__ */ jsx("td", { className: "px-4 py-3 font-medium text-foreground/90", children: item.label }),
41
41
  /* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsx(PriceWithCurrency, { amount: item.amount, currency, className: "font-mono text-base" }) })
42
42
  ] }, item.key)) }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/components/documents/DocumentTotals.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { PriceWithCurrency } from '../PriceWithCurrency'\n\nexport type DocumentTotalItem = {\n key: string\n label: string\n amount: number | string | null | undefined\n emphasize?: boolean\n}\n\ntype DocumentTotalsProps = {\n title?: string\n currency: string | null | undefined\n items: DocumentTotalItem[]\n className?: string\n}\n\nexport function DocumentTotals({ title, currency, items, className }: DocumentTotalsProps) {\n const t = useT()\n const emphasizedRows = items.filter((item) => item.emphasize)\n const heading = title ?? t('sales.documents.detail.totals.title')\n const [expanded, setExpanded] = React.useState(false)\n const paidItem = React.useMemo(() => {\n const entry = items.find((item) => item.key === 'paidTotalAmount')\n if (!entry) return null\n const numeric =\n typeof entry.amount === 'number'\n ? entry.amount\n : typeof entry.amount === 'string'\n ? Number(entry.amount)\n : null\n if (numeric === null || Number.isNaN(numeric) || numeric <= 0) return null\n return entry\n }, [items])\n const collapsedItems = React.useMemo(() => {\n const base = emphasizedRows.length ? [...emphasizedRows] : items.slice(0, 3)\n const augmented = paidItem && !base.some((item) => item.key === paidItem.key) ? [...base, paidItem] : base\n const seen = new Set<string>()\n return augmented.filter((item) => {\n if (seen.has(item.key)) return false\n seen.add(item.key)\n return true\n })\n }, [emphasizedRows, items, paidItem])\n const visibleItems = expanded ? items : collapsedItems\n const uniqueItemCount = React.useMemo(() => new Set(items.map((item) => item.key)).size, [items])\n const hiddenCount = Math.max(0, uniqueItemCount - visibleItems.length)\n\n if (!items.length) return null\n\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-hidden rounded-xl border bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b bg-muted/40 px-4 py-3\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{heading}</span>\n {currency ? (\n <span className=\"rounded-full border border-border/60 bg-background/60 px-3 py-1 text-xs font-semibold tracking-wide text-foreground\">\n {currency}\n </span>\n ) : null}\n </div>\n <table className=\"w-full text-sm\">\n <tbody className=\"divide-y divide-border/80\">\n {visibleItems\n .filter((item) => !item.emphasize)\n .map((item) => (\n <tr key={item.key} className=\"bg-background/60 transition-colors hover:bg-muted/30\">\n <td className=\"px-4 py-3 font-medium text-foreground/90\">{item.label}</td>\n <td className=\"px-4 py-3 text-right\">\n <PriceWithCurrency amount={item.amount} currency={currency} className=\"font-mono text-base\" />\n </td>\n </tr>\n ))}\n </tbody>\n {visibleItems.some((item) => item.emphasize) ? (\n <tfoot className=\"border-t-2 border-primary/40 bg-primary/5\">\n {visibleItems\n .filter((item) => item.emphasize)\n .map((item) => (\n <tr key={item.key}>\n <td className=\"px-4 py-3 font-semibold uppercase tracking-wide text-foreground\">\n {item.label}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <PriceWithCurrency\n amount={item.amount}\n currency={currency}\n className=\"font-mono text-lg font-semibold text-foreground\"\n />\n </td>\n </tr>\n ))}\n </tfoot>\n ) : null}\n </table>\n {hiddenCount > 0 ? (\n <div className=\"flex items-center justify-between border-t bg-muted/30 px-4 py-3\">\n <span className=\"text-xs text-muted-foreground\">\n {expanded\n ? t('sales.documents.detail.totals.showingAll')\n : t('sales.documents.detail.totals.showingKey', { count: hiddenCount })}\n </span>\n <button\n type=\"button\"\n className=\"text-xs font-semibold text-primary transition-colors hover:text-primary/80\"\n onClick={() => setExpanded((prev) => !prev)}\n >\n {expanded ? t('sales.documents.detail.totals.hideDetails') : t('sales.documents.detail.totals.showDetails')}\n </button>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { PriceWithCurrency } from '../PriceWithCurrency'\n\nexport type DocumentTotalItem = {\n key: string\n label: string\n amount: number | string | null | undefined\n emphasize?: boolean\n}\n\ntype DocumentTotalsProps = {\n title?: string\n currency: string | null | undefined\n items: DocumentTotalItem[]\n className?: string\n}\n\nexport function DocumentTotals({ title, currency, items, className }: DocumentTotalsProps) {\n const t = useT()\n const emphasizedRows = items.filter((item) => item.emphasize)\n const heading = title ?? t('sales.documents.detail.totals.title')\n const [expanded, setExpanded] = React.useState(false)\n const paidItem = React.useMemo(() => {\n const entry = items.find((item) => item.key === 'paidTotalAmount')\n if (!entry) return null\n const numeric =\n typeof entry.amount === 'number'\n ? entry.amount\n : typeof entry.amount === 'string'\n ? Number(entry.amount)\n : null\n if (numeric === null || Number.isNaN(numeric) || numeric <= 0) return null\n return entry\n }, [items])\n const collapsedItems = React.useMemo(() => {\n const base = emphasizedRows.length ? [...emphasizedRows] : items.slice(0, 3)\n const augmented = paidItem && !base.some((item) => item.key === paidItem.key) ? [...base, paidItem] : base\n const seen = new Set<string>()\n return augmented.filter((item) => {\n if (seen.has(item.key)) return false\n seen.add(item.key)\n return true\n })\n }, [emphasizedRows, items, paidItem])\n const visibleItems = expanded ? items : collapsedItems\n const uniqueItemCount = React.useMemo(() => new Set(items.map((item) => item.key)).size, [items])\n const hiddenCount = Math.max(0, uniqueItemCount - visibleItems.length)\n\n if (!items.length) return null\n\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-hidden rounded-xl border bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b bg-muted/50 px-4 py-3\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{heading}</span>\n {currency ? (\n <span className=\"rounded-full border border-border/70 bg-background/80 px-3 py-1 text-xs font-semibold tracking-wide text-foreground\">\n {currency}\n </span>\n ) : null}\n </div>\n <table className=\"w-full text-sm\">\n <tbody className=\"divide-y divide-border/80\">\n {visibleItems\n .filter((item) => !item.emphasize)\n .map((item) => (\n <tr key={item.key} className=\"bg-background/80 transition-colors hover:bg-muted/30\">\n <td className=\"px-4 py-3 font-medium text-foreground/90\">{item.label}</td>\n <td className=\"px-4 py-3 text-right\">\n <PriceWithCurrency amount={item.amount} currency={currency} className=\"font-mono text-base\" />\n </td>\n </tr>\n ))}\n </tbody>\n {visibleItems.some((item) => item.emphasize) ? (\n <tfoot className=\"border-t-2 border-primary/40 bg-primary/5\">\n {visibleItems\n .filter((item) => item.emphasize)\n .map((item) => (\n <tr key={item.key}>\n <td className=\"px-4 py-3 font-semibold uppercase tracking-wide text-foreground\">\n {item.label}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <PriceWithCurrency\n amount={item.amount}\n currency={currency}\n className=\"font-mono text-lg font-semibold text-foreground\"\n />\n </td>\n </tr>\n ))}\n </tfoot>\n ) : null}\n </table>\n {hiddenCount > 0 ? (\n <div className=\"flex items-center justify-between border-t bg-muted/30 px-4 py-3\">\n <span className=\"text-xs text-muted-foreground\">\n {expanded\n ? t('sales.documents.detail.totals.showingAll')\n : t('sales.documents.detail.totals.showingKey', { count: hiddenCount })}\n </span>\n <button\n type=\"button\"\n className=\"text-xs font-semibold text-primary transition-colors hover:text-primary/80\"\n onClick={() => setExpanded((prev) => !prev)}\n >\n {expanded ? t('sales.documents.detail.totals.hideDetails') : t('sales.documents.detail.totals.showDetails')}\n </button>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -263,7 +263,7 @@ function PaymentDialog({
263
263
  placeholder: "0.00"
264
264
  }
265
265
  ),
266
- /* @__PURE__ */ jsx("span", { className: "rounded-full border border-border/60 bg-muted/40 px-3 py-1 text-xs font-semibold uppercase text-foreground", children: currencyLabel })
266
+ /* @__PURE__ */ jsx("span", { className: "rounded-full border border-border/70 bg-muted/50 px-3 py-1 text-xs font-semibold uppercase text-foreground", children: currencyLabel })
267
267
  ] });
268
268
  }
269
269
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/components/documents/PaymentDialog.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CreditCard } from 'lucide-react'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\n\nexport type PaymentTotals = {\n paidTotalAmount?: number | null\n refundedTotalAmount?: number | null\n outstandingAmount?: number | null\n}\n\nexport type PaymentFormData = {\n id?: string | null\n amount?: number | string | null\n paymentMethodId?: string | null\n paymentReference?: string | null\n receivedAt?: string | null\n currencyCode?: string | null\n statusEntryId?: string | null\n customValues?: Record<string, unknown> | null\n customFieldSetId?: string | null\n}\n\ntype PaymentMethodOption = {\n id: string\n name: string\n code: string\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n}\n\ntype PaymentDialogProps = {\n open: boolean\n mode: 'create' | 'edit'\n payment?: PaymentFormData | null\n currencyCode: string | null | undefined\n orderId: string\n organizationId: string | null\n tenantId: string | null\n onOpenChange: (open: boolean) => void\n onSaved?: (totals?: PaymentTotals | null) => void | Promise<void>\n}\n\nconst normalizeNumber = (value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return 0\n}\n\nexport function PaymentDialog({\n open,\n mode,\n payment,\n currencyCode,\n orderId,\n organizationId,\n tenantId,\n onOpenChange,\n onSaved,\n}: PaymentDialogProps) {\n const t = useT()\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [paymentMethods, setPaymentMethods] = React.useState<PaymentMethodOption[]>([])\n const [methodsLoading, setMethodsLoading] = React.useState(false)\n const [paymentStatuses, setPaymentStatuses] = React.useState<StatusOption[]>([])\n const [paymentStatusLoading, setPaymentStatusLoading] = React.useState(false)\n const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])\n const [documentStatusLoading, setDocumentStatusLoading] = React.useState(false)\n\n const currencyLabel = React.useMemo(() => {\n const code = currencyCode ? currencyCode.toUpperCase() : ''\n if (!code) return t('sales.documents.detail.empty', 'Not set')\n return code\n }, [currencyCode, t])\n\n const initialValues = React.useMemo(\n () => ({\n amount: payment?.amount ?? '',\n paymentMethodId: payment?.paymentMethodId ?? '',\n paymentReference: payment?.paymentReference ?? '',\n receivedAt: payment?.receivedAt ? payment.receivedAt.slice(0, 10) : '',\n statusEntryId: payment?.statusEntryId ?? '',\n documentStatusEntryId: '',\n customFieldSetId: payment?.customFieldSetId ?? '',\n ...extractCustomFieldValues(payment),\n }),\n [\n payment?.amount,\n payment?.customFieldSetId,\n payment?.customValues,\n payment?.paymentMethodId,\n payment?.paymentReference,\n payment?.receivedAt,\n payment?.statusEntryId,\n ],\n )\n\n const loadPaymentMethods = React.useCallback(\n async (query?: string): Promise<PaymentMethodOption[]> => {\n setMethodsLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', isActive: 'true' })\n if (query && query.trim().length) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-methods?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n if (response.ok && Array.isArray(response.result?.items)) {\n const options = response.result.items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const name = typeof item.name === 'string' ? item.name : null\n const code = typeof item.code === 'string' ? item.code : null\n return {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n }\n })\n .filter((entry): entry is PaymentMethodOption => !!entry)\n if (!query) setPaymentMethods(options)\n return options\n }\n if (!query) setPaymentMethods([])\n return []\n } catch (err) {\n console.error('sales.payments.methods.load', err)\n return []\n } finally {\n setMethodsLoading(false)\n }\n },\n []\n )\n\n const fetchPaymentMethodItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n paymentMethods.length && !query\n ? paymentMethods\n : await loadPaymentMethods(query)\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.name.toLowerCase().includes(term) ||\n option.code.toLowerCase().includes(term)\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.name,\n subtitle: option.code,\n icon: <CreditCard className=\"h-4 w-4 text-muted-foreground\" />,\n }))\n },\n [loadPaymentMethods, paymentMethods]\n )\n\n const shortcutLabel = t('sales.documents.payments.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter')\n const renderStatusIcon = React.useCallback(\n (color?: string | null) => (\n <span\n className=\"h-2.5 w-2.5 rounded-full border border-border/70\"\n style={color ? { backgroundColor: color, borderColor: color } : undefined}\n />\n ),\n [],\n )\n\n const loadDocumentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setDocumentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setDocumentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.payments.statuses.load', err)\n setDocumentStatuses([])\n return []\n } finally {\n setDocumentStatusLoading(false)\n }\n }, [])\n\n const loadPaymentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setPaymentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setPaymentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.payments.statuses.load', err)\n setPaymentStatuses([])\n return []\n } finally {\n setPaymentStatusLoading(false)\n }\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n setFormResetKey((prev) => prev + 1)\n if (!paymentMethods.length) {\n void loadPaymentMethods()\n }\n if (!paymentStatuses.length) {\n void loadPaymentStatuses()\n }\n if (mode === 'create') {\n if (!documentStatuses.length) {\n void loadDocumentStatuses()\n }\n }\n }, [\n documentStatuses.length,\n loadDocumentStatuses,\n loadPaymentStatuses,\n loadPaymentMethods,\n mode,\n open,\n payment?.id,\n paymentStatuses.length,\n paymentMethods.length,\n ])\n\n const fetchDocumentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n documentStatuses.length && !query ? documentStatuses : await loadDocumentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [documentStatuses, loadDocumentStatuses, renderStatusIcon],\n )\n\n const fetchPaymentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n paymentStatuses.length && !query ? paymentStatuses : await loadPaymentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [loadPaymentStatuses, paymentStatuses, renderStatusIcon],\n )\n\n const fields = React.useMemo<CrudField[]>(\n () => [\n {\n id: 'amount',\n label: t('sales.documents.payments.amount', 'Amount'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const normalized = typeof value === 'number' ? value : typeof value === 'string' ? value : ''\n return (\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"0.01\"\n value={normalized as string | number}\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n />\n <span className=\"rounded-full border border-border/60 bg-muted/40 px-3 py-1 text-xs font-semibold uppercase text-foreground\">\n {currencyLabel}\n </span>\n </div>\n )\n },\n },\n {\n id: 'paymentMethodId',\n label: t('sales.documents.payments.method', 'Method'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchPaymentMethodItems}\n searchPlaceholder={t('sales.documents.payments.methodPlaceholder', 'Search payment method')}\n emptyLabel={t('sales.documents.payments.methodsEmpty', 'No payment methods')}\n loadingLabel={t('sales.documents.payments.loadingMethods', 'Loading payment methods\u2026')}\n selectedHintLabel={(id) =>\n t('sales.documents.payments.methodSelected', 'Selected method: {{id}}', { id })\n }\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'statusEntryId',\n label: t('sales.documents.payments.status', 'Status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchPaymentStatusItems}\n placeholder={t('sales.documents.payments.statusPlaceholder', 'Select status')}\n loading={paymentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ...(mode === 'create'\n ? ([\n {\n id: 'documentStatusEntryId',\n label: t('sales.documents.status.changeDocument', 'Change order/quote status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchDocumentStatusItems}\n placeholder={t(\n 'sales.documents.status.documentPlaceholder',\n 'Select new order/quote status',\n )}\n loading={documentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ] as CrudField[])\n : []),\n {\n id: 'paymentReference',\n label: t('sales.documents.payments.reference', 'Reference'),\n type: 'text',\n placeholder: t('sales.documents.payments.referencePlaceholder', 'External reference or note'),\n },\n {\n id: 'receivedAt',\n label: t('sales.documents.payments.receivedAt', 'Received at'),\n type: 'date',\n },\n ],\n [\n currencyLabel,\n documentStatusLoading,\n fetchPaymentStatusItems,\n fetchDocumentStatusItems,\n fetchPaymentMethodItems,\n paymentStatusLoading,\n mode,\n t,\n ],\n )\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => {\n const base: CrudFormGroup[] = [\n {\n id: 'paymentDetails',\n title: t('sales.documents.payments.form.title', 'Payment details'),\n column: 1,\n fields: ['amount', 'paymentMethodId', 'statusEntryId'],\n },\n ]\n if (mode === 'create') {\n base.push({\n id: 'statusChanges',\n title: t('sales.documents.status.sectionTitle', 'Status changes'),\n column: 1,\n fields: ['documentStatusEntryId'],\n })\n }\n base.push({\n id: 'paymentReference',\n title: t('sales.documents.payments.reference', 'Reference'),\n column: 2,\n fields: ['paymentReference', 'receivedAt'],\n })\n base.push({\n id: 'paymentCustomFields',\n title: t('entities.customFields.title', 'Custom fields'),\n column: 2,\n kind: 'customFields',\n })\n return base\n },\n [mode, t],\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const resolvedCurrency = currencyCode ? currencyCode.toUpperCase() : ''\n const amountValue = normalizeNumber(values.amount)\n if (!resolvedCurrency.trim()) {\n throw createCrudFormError(t('sales.documents.payments.currencyRequired', 'Currency is required.'))\n }\n if (amountValue <= 0) {\n throw createCrudFormError(t('sales.documents.payments.amountRequired', 'Enter a positive amount.'), {\n amount: t('sales.documents.payments.amountRequired', 'Enter a positive amount.'),\n })\n }\n\n const payload: Record<string, unknown> = {\n orderId,\n amount: amountValue,\n currencyCode: resolvedCurrency,\n paymentReference:\n typeof values.paymentReference === 'string' && values.paymentReference.trim().length\n ? values.paymentReference.trim()\n : undefined,\n paymentMethodId:\n typeof values.paymentMethodId === 'string' && values.paymentMethodId.trim().length\n ? values.paymentMethodId\n : undefined,\n statusEntryId:\n typeof values.statusEntryId === 'string' && values.statusEntryId.trim().length\n ? values.statusEntryId\n : undefined,\n customFieldSetId:\n typeof values.customFieldSetId === 'string' && values.customFieldSetId.trim().length\n ? values.customFieldSetId.trim()\n : undefined,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n }\n const documentStatusEntryId =\n typeof values.documentStatusEntryId === 'string' && values.documentStatusEntryId.trim().length\n ? values.documentStatusEntryId\n : null\n if (documentStatusEntryId) {\n payload.documentStatusEntryId = documentStatusEntryId\n }\n if (typeof values.receivedAt === 'string' && values.receivedAt.trim().length) {\n payload.receivedAt = new Date(values.receivedAt)\n }\n const customFields = collectCustomFieldValues(values, {\n transform: normalizeCustomFieldSubmitValue,\n })\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const action = payment?.id ? updateCrud : createCrud\n const result = await action(\n 'sales/payments',\n payment?.id ? { id: payment.id, ...payload } : payload,\n {\n errorMessage: t('sales.documents.payments.errorSave', 'Failed to save payment.'),\n }\n )\n if (result.ok) {\n const totals = (result.result as any)?.orderTotals as PaymentTotals | undefined\n if (onSaved) {\n await onSaved(totals ?? null)\n }\n setFormResetKey((prev) => prev + 1)\n onOpenChange(false)\n }\n },\n [currencyCode, mode, onOpenChange, onSaved, orderId, organizationId, payment?.id, t, tenantId]\n )\n\n const handleShortcutSubmit = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n const form = dialogContentRef.current?.querySelector('form')\n form?.requestSubmit()\n }\n },\n []\n )\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n ref={dialogContentRef}\n className=\"sm:max-w-5xl\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onOpenChange(false)\n }\n handleShortcutSubmit(event)\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {mode === 'edit'\n ? t('sales.documents.payments.edit', 'Edit payment')\n : t('sales.documents.payments.add', 'Add payment')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n key={formResetKey}\n embedded\n entityId={E.sales.sales_payment}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n customFieldsetBindings={{ [E.sales.sales_payment]: { valueKey: 'customFieldSetId' } }}\n submitLabel={shortcutLabel}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.payments.loading', 'Loading payments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n contentHeader={\n methodsLoading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.payments.loadingMethods', 'Loading payment methods\u2026')}\n </p>\n ) : null\n }\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CreditCard } from 'lucide-react'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\n\nexport type PaymentTotals = {\n paidTotalAmount?: number | null\n refundedTotalAmount?: number | null\n outstandingAmount?: number | null\n}\n\nexport type PaymentFormData = {\n id?: string | null\n amount?: number | string | null\n paymentMethodId?: string | null\n paymentReference?: string | null\n receivedAt?: string | null\n currencyCode?: string | null\n statusEntryId?: string | null\n customValues?: Record<string, unknown> | null\n customFieldSetId?: string | null\n}\n\ntype PaymentMethodOption = {\n id: string\n name: string\n code: string\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n}\n\ntype PaymentDialogProps = {\n open: boolean\n mode: 'create' | 'edit'\n payment?: PaymentFormData | null\n currencyCode: string | null | undefined\n orderId: string\n organizationId: string | null\n tenantId: string | null\n onOpenChange: (open: boolean) => void\n onSaved?: (totals?: PaymentTotals | null) => void | Promise<void>\n}\n\nconst normalizeNumber = (value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return 0\n}\n\nexport function PaymentDialog({\n open,\n mode,\n payment,\n currencyCode,\n orderId,\n organizationId,\n tenantId,\n onOpenChange,\n onSaved,\n}: PaymentDialogProps) {\n const t = useT()\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [paymentMethods, setPaymentMethods] = React.useState<PaymentMethodOption[]>([])\n const [methodsLoading, setMethodsLoading] = React.useState(false)\n const [paymentStatuses, setPaymentStatuses] = React.useState<StatusOption[]>([])\n const [paymentStatusLoading, setPaymentStatusLoading] = React.useState(false)\n const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])\n const [documentStatusLoading, setDocumentStatusLoading] = React.useState(false)\n\n const currencyLabel = React.useMemo(() => {\n const code = currencyCode ? currencyCode.toUpperCase() : ''\n if (!code) return t('sales.documents.detail.empty', 'Not set')\n return code\n }, [currencyCode, t])\n\n const initialValues = React.useMemo(\n () => ({\n amount: payment?.amount ?? '',\n paymentMethodId: payment?.paymentMethodId ?? '',\n paymentReference: payment?.paymentReference ?? '',\n receivedAt: payment?.receivedAt ? payment.receivedAt.slice(0, 10) : '',\n statusEntryId: payment?.statusEntryId ?? '',\n documentStatusEntryId: '',\n customFieldSetId: payment?.customFieldSetId ?? '',\n ...extractCustomFieldValues(payment),\n }),\n [\n payment?.amount,\n payment?.customFieldSetId,\n payment?.customValues,\n payment?.paymentMethodId,\n payment?.paymentReference,\n payment?.receivedAt,\n payment?.statusEntryId,\n ],\n )\n\n const loadPaymentMethods = React.useCallback(\n async (query?: string): Promise<PaymentMethodOption[]> => {\n setMethodsLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100', isActive: 'true' })\n if (query && query.trim().length) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-methods?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n if (response.ok && Array.isArray(response.result?.items)) {\n const options = response.result.items\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const name = typeof item.name === 'string' ? item.name : null\n const code = typeof item.code === 'string' ? item.code : null\n return {\n id,\n name: name ?? code ?? id,\n code: code ?? id,\n }\n })\n .filter((entry): entry is PaymentMethodOption => !!entry)\n if (!query) setPaymentMethods(options)\n return options\n }\n if (!query) setPaymentMethods([])\n return []\n } catch (err) {\n console.error('sales.payments.methods.load', err)\n return []\n } finally {\n setMethodsLoading(false)\n }\n },\n []\n )\n\n const fetchPaymentMethodItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n paymentMethods.length && !query\n ? paymentMethods\n : await loadPaymentMethods(query)\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.name.toLowerCase().includes(term) ||\n option.code.toLowerCase().includes(term)\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.name,\n subtitle: option.code,\n icon: <CreditCard className=\"h-4 w-4 text-muted-foreground\" />,\n }))\n },\n [loadPaymentMethods, paymentMethods]\n )\n\n const shortcutLabel = t('sales.documents.payments.saveShortcut', 'Save \u2318\u23CE / Ctrl+Enter')\n const renderStatusIcon = React.useCallback(\n (color?: string | null) => (\n <span\n className=\"h-2.5 w-2.5 rounded-full border border-border/70\"\n style={color ? { backgroundColor: color, borderColor: color } : undefined}\n />\n ),\n [],\n )\n\n const loadDocumentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setDocumentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setDocumentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.payments.statuses.load', err)\n setDocumentStatuses([])\n return []\n } finally {\n setDocumentStatusLoading(false)\n }\n }, [])\n\n const loadPaymentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setPaymentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/payment-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setPaymentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.payments.statuses.load', err)\n setPaymentStatuses([])\n return []\n } finally {\n setPaymentStatusLoading(false)\n }\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n setFormResetKey((prev) => prev + 1)\n if (!paymentMethods.length) {\n void loadPaymentMethods()\n }\n if (!paymentStatuses.length) {\n void loadPaymentStatuses()\n }\n if (mode === 'create') {\n if (!documentStatuses.length) {\n void loadDocumentStatuses()\n }\n }\n }, [\n documentStatuses.length,\n loadDocumentStatuses,\n loadPaymentStatuses,\n loadPaymentMethods,\n mode,\n open,\n payment?.id,\n paymentStatuses.length,\n paymentMethods.length,\n ])\n\n const fetchDocumentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n documentStatuses.length && !query ? documentStatuses : await loadDocumentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [documentStatuses, loadDocumentStatuses, renderStatusIcon],\n )\n\n const fetchPaymentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n paymentStatuses.length && !query ? paymentStatuses : await loadPaymentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [loadPaymentStatuses, paymentStatuses, renderStatusIcon],\n )\n\n const fields = React.useMemo<CrudField[]>(\n () => [\n {\n id: 'amount',\n label: t('sales.documents.payments.amount', 'Amount'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const normalized = typeof value === 'number' ? value : typeof value === 'string' ? value : ''\n return (\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"0.01\"\n value={normalized as string | number}\n onChange={(event) => setValue(event.target.value)}\n placeholder=\"0.00\"\n />\n <span className=\"rounded-full border border-border/70 bg-muted/50 px-3 py-1 text-xs font-semibold uppercase text-foreground\">\n {currencyLabel}\n </span>\n </div>\n )\n },\n },\n {\n id: 'paymentMethodId',\n label: t('sales.documents.payments.method', 'Method'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchPaymentMethodItems}\n searchPlaceholder={t('sales.documents.payments.methodPlaceholder', 'Search payment method')}\n emptyLabel={t('sales.documents.payments.methodsEmpty', 'No payment methods')}\n loadingLabel={t('sales.documents.payments.loadingMethods', 'Loading payment methods\u2026')}\n selectedHintLabel={(id) =>\n t('sales.documents.payments.methodSelected', 'Selected method: {{id}}', { id })\n }\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'statusEntryId',\n label: t('sales.documents.payments.status', 'Status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchPaymentStatusItems}\n placeholder={t('sales.documents.payments.statusPlaceholder', 'Select status')}\n loading={paymentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ...(mode === 'create'\n ? ([\n {\n id: 'documentStatusEntryId',\n label: t('sales.documents.status.changeDocument', 'Change order/quote status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchDocumentStatusItems}\n placeholder={t(\n 'sales.documents.status.documentPlaceholder',\n 'Select new order/quote status',\n )}\n loading={documentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ] as CrudField[])\n : []),\n {\n id: 'paymentReference',\n label: t('sales.documents.payments.reference', 'Reference'),\n type: 'text',\n placeholder: t('sales.documents.payments.referencePlaceholder', 'External reference or note'),\n },\n {\n id: 'receivedAt',\n label: t('sales.documents.payments.receivedAt', 'Received at'),\n type: 'date',\n },\n ],\n [\n currencyLabel,\n documentStatusLoading,\n fetchPaymentStatusItems,\n fetchDocumentStatusItems,\n fetchPaymentMethodItems,\n paymentStatusLoading,\n mode,\n t,\n ],\n )\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => {\n const base: CrudFormGroup[] = [\n {\n id: 'paymentDetails',\n title: t('sales.documents.payments.form.title', 'Payment details'),\n column: 1,\n fields: ['amount', 'paymentMethodId', 'statusEntryId'],\n },\n ]\n if (mode === 'create') {\n base.push({\n id: 'statusChanges',\n title: t('sales.documents.status.sectionTitle', 'Status changes'),\n column: 1,\n fields: ['documentStatusEntryId'],\n })\n }\n base.push({\n id: 'paymentReference',\n title: t('sales.documents.payments.reference', 'Reference'),\n column: 2,\n fields: ['paymentReference', 'receivedAt'],\n })\n base.push({\n id: 'paymentCustomFields',\n title: t('entities.customFields.title', 'Custom fields'),\n column: 2,\n kind: 'customFields',\n })\n return base\n },\n [mode, t],\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const resolvedCurrency = currencyCode ? currencyCode.toUpperCase() : ''\n const amountValue = normalizeNumber(values.amount)\n if (!resolvedCurrency.trim()) {\n throw createCrudFormError(t('sales.documents.payments.currencyRequired', 'Currency is required.'))\n }\n if (amountValue <= 0) {\n throw createCrudFormError(t('sales.documents.payments.amountRequired', 'Enter a positive amount.'), {\n amount: t('sales.documents.payments.amountRequired', 'Enter a positive amount.'),\n })\n }\n\n const payload: Record<string, unknown> = {\n orderId,\n amount: amountValue,\n currencyCode: resolvedCurrency,\n paymentReference:\n typeof values.paymentReference === 'string' && values.paymentReference.trim().length\n ? values.paymentReference.trim()\n : undefined,\n paymentMethodId:\n typeof values.paymentMethodId === 'string' && values.paymentMethodId.trim().length\n ? values.paymentMethodId\n : undefined,\n statusEntryId:\n typeof values.statusEntryId === 'string' && values.statusEntryId.trim().length\n ? values.statusEntryId\n : undefined,\n customFieldSetId:\n typeof values.customFieldSetId === 'string' && values.customFieldSetId.trim().length\n ? values.customFieldSetId.trim()\n : undefined,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n }\n const documentStatusEntryId =\n typeof values.documentStatusEntryId === 'string' && values.documentStatusEntryId.trim().length\n ? values.documentStatusEntryId\n : null\n if (documentStatusEntryId) {\n payload.documentStatusEntryId = documentStatusEntryId\n }\n if (typeof values.receivedAt === 'string' && values.receivedAt.trim().length) {\n payload.receivedAt = new Date(values.receivedAt)\n }\n const customFields = collectCustomFieldValues(values, {\n transform: normalizeCustomFieldSubmitValue,\n })\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const action = payment?.id ? updateCrud : createCrud\n const result = await action(\n 'sales/payments',\n payment?.id ? { id: payment.id, ...payload } : payload,\n {\n errorMessage: t('sales.documents.payments.errorSave', 'Failed to save payment.'),\n }\n )\n if (result.ok) {\n const totals = (result.result as any)?.orderTotals as PaymentTotals | undefined\n if (onSaved) {\n await onSaved(totals ?? null)\n }\n setFormResetKey((prev) => prev + 1)\n onOpenChange(false)\n }\n },\n [currencyCode, mode, onOpenChange, onSaved, orderId, organizationId, payment?.id, t, tenantId]\n )\n\n const handleShortcutSubmit = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n const form = dialogContentRef.current?.querySelector('form')\n form?.requestSubmit()\n }\n },\n []\n )\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n ref={dialogContentRef}\n className=\"sm:max-w-5xl\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onOpenChange(false)\n }\n handleShortcutSubmit(event)\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {mode === 'edit'\n ? t('sales.documents.payments.edit', 'Edit payment')\n : t('sales.documents.payments.add', 'Add payment')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n key={formResetKey}\n embedded\n entityId={E.sales.sales_payment}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n customFieldsetBindings={{ [E.sales.sales_payment]: { valueKey: 'customFieldSetId' } }}\n submitLabel={shortcutLabel}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.payments.loading', 'Loading payments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n contentHeader={\n methodsLoading ? (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner className=\"h-3.5 w-3.5 animate-spin\" />\n {t('sales.documents.payments.loadingMethods', 'Loading payment methods\u2026')}\n </p>\n ) : null\n }\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -133,7 +133,7 @@ function CustomerQuickCreate({ t, onCreated }) {
133
133
  },
134
134
  [closeDialog, onCreated, organizationId, t]
135
135
  );
136
- const renderMenu = () => /* @__PURE__ */ jsxs("div", { className: "absolute right-0 z-30 mt-2 w-48 rounded border bg-popover p-1 shadow-lg", children: [
136
+ const renderMenu = () => /* @__PURE__ */ jsxs("div", { className: "absolute right-0 z-dropdown mt-2 w-48 rounded border bg-popover p-1 shadow-lg", children: [
137
137
  /* @__PURE__ */ jsxs(
138
138
  "button",
139
139
  {
@@ -937,7 +937,7 @@ function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inbox
937
937
  id: "infoNote",
938
938
  label: "",
939
939
  type: "custom",
940
- component: () => /* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-muted/40 p-3 text-sm text-muted-foreground", children: t("sales.documents.form.nextStep", "After creation you will add items, prices, and fulfillment details.") })
940
+ component: () => /* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-muted/50 p-3 text-sm text-muted-foreground", children: t("sales.documents.form.nextStep", "After creation you will add items, prices, and fulfillment details.") })
941
941
  }
942
942
  ], [
943
943
  addressFormat,