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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/dist/modules/api_docs/frontend/docs/api/Explorer.js +18 -18
  2. package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
  3. package/dist/modules/api_keys/backend/api-keys/create/page.js +1 -1
  4. package/dist/modules/api_keys/backend/api-keys/create/page.js.map +1 -1
  5. package/dist/modules/attachments/components/AttachmentLibrary.js +2 -2
  6. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  7. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +1 -1
  8. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +1 -1
  9. package/dist/modules/attachments/fields/attachment.js +1 -1
  10. package/dist/modules/attachments/fields/attachment.js.map +1 -1
  11. package/dist/modules/audit_logs/components/ActionLogDetailsDialog.js +1 -1
  12. package/dist/modules/audit_logs/components/ActionLogDetailsDialog.js.map +2 -2
  13. package/dist/modules/audit_logs/lib/display-helpers.js +1 -1
  14. package/dist/modules/audit_logs/lib/display-helpers.js.map +1 -1
  15. package/dist/modules/auth/backend/users/create/page.js +1 -1
  16. package/dist/modules/auth/backend/users/create/page.js.map +1 -1
  17. package/dist/modules/business_rules/backend/rules/page.js +6 -6
  18. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  19. package/dist/modules/business_rules/backend/sets/page.js +2 -2
  20. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  21. package/dist/modules/business_rules/components/ActionBuilder.js +5 -5
  22. package/dist/modules/business_rules/components/ActionBuilder.js.map +2 -2
  23. package/dist/modules/business_rules/components/ActionRow.js +8 -8
  24. package/dist/modules/business_rules/components/ActionRow.js.map +1 -1
  25. package/dist/modules/business_rules/components/ConditionBuilder.js +5 -5
  26. package/dist/modules/business_rules/components/ConditionBuilder.js.map +2 -2
  27. package/dist/modules/business_rules/components/ConditionGroup.js +2 -2
  28. package/dist/modules/business_rules/components/ConditionGroup.js.map +1 -1
  29. package/dist/modules/business_rules/components/ConditionRow.js +3 -3
  30. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  31. package/dist/modules/business_rules/components/RuleSetMembers.js +8 -8
  32. package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
  33. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +2 -2
  34. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +1 -1
  35. package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -5
  36. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +1 -1
  37. package/dist/modules/catalog/components/products/MetadataEditor.js +1 -1
  38. package/dist/modules/catalog/components/products/MetadataEditor.js.map +1 -1
  39. package/dist/modules/catalog/components/products/ProductImageCell.js +1 -1
  40. package/dist/modules/catalog/components/products/ProductImageCell.js.map +1 -1
  41. package/dist/modules/catalog/components/products/VariantBuilder.js +1 -1
  42. package/dist/modules/catalog/components/products/VariantBuilder.js.map +1 -1
  43. package/dist/modules/catalog/widgets/injection/product-seo/widget.client.js +1 -1
  44. package/dist/modules/catalog/widgets/injection/product-seo/widget.client.js.map +2 -2
  45. package/dist/modules/currencies/components/CurrencyFetchingConfig.js +1 -1
  46. package/dist/modules/currencies/components/CurrencyFetchingConfig.js.map +1 -1
  47. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +2 -2
  48. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  49. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +9 -9
  50. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  51. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -7
  52. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  53. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -2
  54. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +1 -1
  55. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +3 -3
  56. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +1 -1
  57. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +2 -2
  58. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +1 -1
  59. package/dist/modules/customers/components/AddressTiles.js +1 -1
  60. package/dist/modules/customers/components/AddressTiles.js.map +1 -1
  61. package/dist/modules/customers/components/detail/ActivityForm.js +3 -3
  62. package/dist/modules/customers/components/detail/ActivityForm.js.map +1 -1
  63. package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
  64. package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +1 -1
  65. package/dist/modules/customers/components/detail/CustomFieldValuesList.js +1 -1
  66. package/dist/modules/customers/components/detail/CustomFieldValuesList.js.map +1 -1
  67. package/dist/modules/customers/components/detail/DealForm.js +1 -1
  68. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  69. package/dist/modules/customers/components/detail/DealsSection.js +1 -1
  70. package/dist/modules/customers/components/detail/DealsSection.js.map +1 -1
  71. package/dist/modules/customers/components/detail/DetailFieldsSection.js +1 -1
  72. package/dist/modules/customers/components/detail/DetailFieldsSection.js.map +1 -1
  73. package/dist/modules/customers/components/detail/InlineEditors.js +5 -5
  74. package/dist/modules/customers/components/detail/InlineEditors.js.map +2 -2
  75. package/dist/modules/customers/components/detail/TasksSection.js +1 -1
  76. package/dist/modules/customers/components/detail/TasksSection.js.map +1 -1
  77. package/dist/modules/customers/components/detail/TimelineItemHeader.js +1 -1
  78. package/dist/modules/customers/components/detail/TimelineItemHeader.js.map +1 -1
  79. package/dist/modules/customers/components/formConfig.js +2 -2
  80. package/dist/modules/customers/components/formConfig.js.map +1 -1
  81. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +1 -1
  82. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +1 -1
  83. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +2 -2
  84. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +1 -1
  85. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +1 -1
  86. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +1 -1
  87. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +1 -1
  88. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +1 -1
  89. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +1 -1
  90. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +1 -1
  91. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +1 -1
  92. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +1 -1
  93. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js +1 -1
  94. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js.map +1 -1
  95. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +1 -1
  96. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +1 -1
  97. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js +1 -1
  98. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js.map +1 -1
  99. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +1 -1
  100. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +1 -1
  101. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +2 -2
  102. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +1 -1
  103. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +1 -1
  104. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +1 -1
  105. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +1 -1
  106. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +1 -1
  107. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +2 -2
  108. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +1 -1
  109. package/dist/modules/data_sync/backend/data-sync/page.js +4 -4
  110. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  111. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +2 -2
  112. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +1 -1
  113. package/dist/modules/dictionaries/components/AppearanceSelector.js +3 -3
  114. package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
  115. package/dist/modules/dictionaries/components/DictionariesManager.js +4 -4
  116. package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
  117. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +2 -2
  118. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  119. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +3 -3
  120. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +1 -1
  121. package/dist/modules/dictionaries/fields/dictionary.js +4 -4
  122. package/dist/modules/dictionaries/fields/dictionary.js.map +1 -1
  123. package/dist/modules/entities/components/EncryptionManager.js +3 -3
  124. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  125. package/dist/modules/entities/components/UserEntitiesTable.js +1 -1
  126. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  127. package/dist/modules/feature_toggles/components/formConfig.js +1 -1
  128. package/dist/modules/feature_toggles/components/formConfig.js.map +1 -1
  129. package/dist/modules/feature_toggles/components/overrideFormConfig.js +2 -2
  130. package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +1 -1
  131. package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js +12 -12
  132. package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js.map +2 -2
  133. package/dist/modules/inbox_ops/components/messages/InboxEmailPreview.js +1 -1
  134. package/dist/modules/inbox_ops/components/messages/InboxEmailPreview.js.map +1 -1
  135. package/dist/modules/inbox_ops/components/proposals/ActionCard.js +12 -12
  136. package/dist/modules/inbox_ops/components/proposals/ActionCard.js.map +2 -2
  137. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +3 -3
  138. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
  139. package/dist/modules/integrations/backend/integrations/[id]/page.js +6 -6
  140. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  141. package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -1
  142. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +1 -1
  143. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js +1 -1
  144. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js.map +1 -1
  145. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js +1 -1
  146. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js.map +1 -1
  147. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js +1 -1
  148. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js.map +1 -1
  149. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js +1 -1
  150. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js.map +1 -1
  151. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js +1 -1
  152. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js.map +1 -1
  153. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +11 -11
  154. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  155. package/dist/modules/planner/components/AvailabilityRulesEditor.js +2 -2
  156. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  157. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +2 -2
  158. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  159. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +3 -3
  160. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
  161. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +3 -3
  162. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
  163. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js +4 -4
  164. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js.map +2 -2
  165. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +4 -4
  166. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
  167. package/dist/modules/resources/backend/resources/resources/[id]/page.js +1 -1
  168. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +1 -1
  169. package/dist/modules/sales/backend/sales/documents/[id]/page.js +4 -4
  170. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +1 -1
  171. package/dist/modules/sales/components/DocumentNumberSettings.js +1 -1
  172. package/dist/modules/sales/components/DocumentNumberSettings.js.map +1 -1
  173. package/dist/modules/sales/components/channels/ChannelOfferForm.js +1 -1
  174. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +1 -1
  175. package/dist/modules/sales/components/documents/AdjustmentDialog.js +1 -1
  176. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +1 -1
  177. package/dist/modules/sales/components/documents/DocumentTotals.js +3 -3
  178. package/dist/modules/sales/components/documents/DocumentTotals.js.map +1 -1
  179. package/dist/modules/sales/components/documents/PaymentDialog.js +1 -1
  180. package/dist/modules/sales/components/documents/PaymentDialog.js.map +1 -1
  181. package/dist/modules/sales/components/documents/SalesDocumentForm.js +2 -2
  182. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  183. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +4 -4
  184. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +1 -1
  185. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +4 -4
  186. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +1 -1
  187. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +2 -2
  188. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +1 -1
  189. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +1 -1
  190. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +1 -1
  191. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +1 -1
  192. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +1 -1
  193. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  194. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  195. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +1 -1
  196. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +1 -1
  197. package/dist/modules/translations/components/TranslationDrawerAction.js +2 -2
  198. package/dist/modules/translations/components/TranslationDrawerAction.js.map +1 -1
  199. package/dist/modules/translations/components/TranslationManager.js +3 -3
  200. package/dist/modules/translations/components/TranslationManager.js.map +1 -1
  201. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js +2 -2
  202. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js.map +1 -1
  203. package/dist/modules/workflows/backend/definitions/[id]/page.js +5 -5
  204. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
  205. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2 -2
  206. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  207. package/dist/modules/workflows/backend/events/[id]/page.js +4 -4
  208. package/dist/modules/workflows/backend/events/[id]/page.js.map +1 -1
  209. package/dist/modules/workflows/backend/instances/[id]/page.js +2 -2
  210. package/dist/modules/workflows/backend/instances/[id]/page.js.map +1 -1
  211. package/dist/modules/workflows/backend/tasks/[id]/page.js +20 -20
  212. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  213. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
  214. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +1 -1
  215. package/dist/modules/workflows/components/EdgeEditDialog.js +12 -12
  216. package/dist/modules/workflows/components/EdgeEditDialog.js.map +1 -1
  217. package/dist/modules/workflows/components/NodeEditDialog.js +26 -26
  218. package/dist/modules/workflows/components/NodeEditDialog.js.map +1 -1
  219. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
  220. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +1 -1
  221. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js +2 -2
  222. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
  223. package/dist/modules/workflows/components/mobile/MobileInstanceOverview.js +7 -7
  224. package/dist/modules/workflows/components/mobile/MobileInstanceOverview.js.map +2 -2
  225. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +11 -11
  226. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  227. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +1 -1
  228. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +1 -1
  229. package/dist/modules/workflows/components/mobile/MobileWorkflowTimeline.js +23 -23
  230. package/dist/modules/workflows/components/mobile/MobileWorkflowTimeline.js.map +2 -2
  231. package/dist/modules/workflows/frontend/checkout-demo/page.js +6 -6
  232. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +1 -1
  233. package/package.json +3 -3
  234. package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +18 -18
  235. package/src/modules/api_keys/backend/api-keys/create/page.tsx +1 -1
  236. package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -3
  237. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +1 -1
  238. package/src/modules/attachments/fields/attachment.tsx +1 -1
  239. package/src/modules/audit_logs/components/ActionLogDetailsDialog.tsx +1 -1
  240. package/src/modules/audit_logs/lib/display-helpers.tsx +1 -1
  241. package/src/modules/auth/backend/users/create/page.tsx +1 -1
  242. package/src/modules/business_rules/backend/rules/page.tsx +7 -7
  243. package/src/modules/business_rules/backend/sets/page.tsx +3 -3
  244. package/src/modules/business_rules/components/ActionBuilder.tsx +6 -6
  245. package/src/modules/business_rules/components/ActionRow.tsx +8 -8
  246. package/src/modules/business_rules/components/ConditionBuilder.tsx +6 -6
  247. package/src/modules/business_rules/components/ConditionGroup.tsx +2 -2
  248. package/src/modules/business_rules/components/ConditionRow.tsx +3 -3
  249. package/src/modules/business_rules/components/RuleSetMembers.tsx +9 -9
  250. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +2 -2
  251. package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -5
  252. package/src/modules/catalog/components/products/MetadataEditor.tsx +1 -1
  253. package/src/modules/catalog/components/products/ProductImageCell.tsx +1 -1
  254. package/src/modules/catalog/components/products/VariantBuilder.tsx +1 -1
  255. package/src/modules/catalog/widgets/injection/product-seo/widget.client.tsx +1 -1
  256. package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +1 -1
  257. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +2 -2
  258. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +10 -10
  259. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +9 -9
  260. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +2 -2
  261. package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +3 -3
  262. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +2 -2
  263. package/src/modules/customers/components/AddressTiles.tsx +1 -1
  264. package/src/modules/customers/components/detail/ActivityForm.tsx +3 -3
  265. package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
  266. package/src/modules/customers/components/detail/CustomFieldValuesList.tsx +1 -1
  267. package/src/modules/customers/components/detail/DealForm.tsx +1 -1
  268. package/src/modules/customers/components/detail/DealsSection.tsx +1 -1
  269. package/src/modules/customers/components/detail/DetailFieldsSection.tsx +1 -1
  270. package/src/modules/customers/components/detail/InlineEditors.tsx +5 -5
  271. package/src/modules/customers/components/detail/TasksSection.tsx +1 -1
  272. package/src/modules/customers/components/detail/TimelineItemHeader.tsx +1 -1
  273. package/src/modules/customers/components/formConfig.tsx +2 -2
  274. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +1 -1
  275. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +2 -2
  276. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +1 -1
  277. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +1 -1
  278. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +1 -1
  279. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +1 -1
  280. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.tsx +1 -1
  281. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +1 -1
  282. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.tsx +1 -1
  283. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +1 -1
  284. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +2 -2
  285. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +1 -1
  286. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +1 -1
  287. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +2 -2
  288. package/src/modules/data_sync/backend/data-sync/page.tsx +4 -4
  289. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +2 -2
  290. package/src/modules/dictionaries/components/AppearanceSelector.tsx +3 -3
  291. package/src/modules/dictionaries/components/DictionariesManager.tsx +4 -4
  292. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +2 -2
  293. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +3 -3
  294. package/src/modules/dictionaries/fields/dictionary.tsx +4 -4
  295. package/src/modules/entities/components/EncryptionManager.tsx +3 -3
  296. package/src/modules/entities/components/UserEntitiesTable.tsx +1 -1
  297. package/src/modules/feature_toggles/components/formConfig.tsx +1 -1
  298. package/src/modules/feature_toggles/components/overrideFormConfig.tsx +2 -2
  299. package/src/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.tsx +12 -12
  300. package/src/modules/inbox_ops/components/messages/InboxEmailPreview.tsx +1 -1
  301. package/src/modules/inbox_ops/components/proposals/ActionCard.tsx +12 -12
  302. package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +4 -4
  303. package/src/modules/integrations/backend/integrations/[id]/page.tsx +6 -6
  304. package/src/modules/messages/components/MessagesInboxPageClient.tsx +1 -1
  305. package/src/modules/messages/components/defaults/DefaultMessageListItem.tsx +1 -1
  306. package/src/modules/messages/components/defaults/MessageRecordObjectDetail.tsx +1 -1
  307. package/src/modules/messages/components/defaults/MessageRecordObjectPreview.tsx +1 -1
  308. package/src/modules/messages/components/message-detail/panels/MessageListComponent.tsx +1 -1
  309. package/src/modules/messages/components/message-detail/panels/attachments-panel.tsx +1 -1
  310. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +11 -11
  311. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +2 -2
  312. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +2 -2
  313. package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +3 -3
  314. package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +3 -3
  315. package/src/modules/portal/frontend/[orgSlug]/portal/profile/page.tsx +4 -4
  316. package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +4 -4
  317. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +1 -1
  318. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +4 -4
  319. package/src/modules/sales/components/DocumentNumberSettings.tsx +1 -1
  320. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +1 -1
  321. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +1 -1
  322. package/src/modules/sales/components/documents/DocumentTotals.tsx +3 -3
  323. package/src/modules/sales/components/documents/PaymentDialog.tsx +1 -1
  324. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +2 -2
  325. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +4 -4
  326. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +4 -4
  327. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +2 -2
  328. package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +1 -1
  329. package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +1 -1
  330. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  331. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +1 -1
  332. package/src/modules/translations/components/TranslationDrawerAction.tsx +2 -2
  333. package/src/modules/translations/components/TranslationManager.tsx +3 -3
  334. package/src/modules/translations/widgets/injection/translation-manager/widget.client.tsx +2 -2
  335. package/src/modules/workflows/backend/definitions/[id]/page.tsx +5 -5
  336. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +2 -2
  337. package/src/modules/workflows/backend/events/[id]/page.tsx +4 -4
  338. package/src/modules/workflows/backend/instances/[id]/page.tsx +2 -2
  339. package/src/modules/workflows/backend/tasks/[id]/page.tsx +23 -23
  340. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
  341. package/src/modules/workflows/components/EdgeEditDialog.tsx +12 -12
  342. package/src/modules/workflows/components/NodeEditDialog.tsx +26 -26
  343. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
  344. package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +2 -2
  345. package/src/modules/workflows/components/mobile/MobileInstanceOverview.tsx +7 -7
  346. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +14 -14
  347. package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +1 -1
  348. package/src/modules/workflows/components/mobile/MobileWorkflowTimeline.tsx +23 -23
  349. package/src/modules/workflows/frontend/checkout-demo/page.tsx +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/components/documents/SalesDocumentForm.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport { createCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryEntrySelect,\n type DictionaryOption,\n type DictionarySelectLabels,\n} from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { Building2, Mail, Plus, Store, UserRound } from 'lucide-react'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport {\n buildCompanyPayload,\n buildPersonPayload,\n createCompanyFormFields,\n createCompanyFormGroups,\n createCompanyFormSchema,\n createPersonFormFields,\n createPersonFormGroups,\n createPersonFormSchema,\n type CompanyFormValues,\n type PersonFormValues,\n} from '@open-mercato/core/modules/customers/components/formConfig'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n formatAddressString,\n type AddressFormatStrategy,\n type AddressValue,\n} from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'\n\ntype DocumentKind = 'quote' | 'order'\n\ntype AddressDraft = AddressEditorDraft\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = { id: string; label: string }\n\ntype AddressOption = {\n id: string\n label: string\n summary: string\n name?: string | null\n isPrimary: boolean\n value: AddressValue\n}\n\nexport type SalesDocumentFormValues = {\n documentKind: DocumentKind\n documentNumber?: string\n currencyCode: string\n channelId?: string | null\n customerEntityId?: string | null\n customerEmail?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n useCustomShipping?: boolean\n useCustomBilling?: boolean\n sameAsShipping?: boolean\n saveShippingAddress?: boolean\n saveBillingAddress?: boolean\n shippingAddressDraft?: AddressDraft\n billingAddressDraft?: AddressDraft\n comments?: string | null\n} & Record<string, unknown>\n\ntype InboxPreFill = {\n customerEntityId?: string\n currencyCode?: string\n channelId?: string\n comments?: string\n lineItems?: Record<string, unknown>[]\n}\n\ntype SalesDocumentFormProps = {\n onCreated: (params: { id: string; kind: DocumentKind }) => void\n isSubmitting?: boolean\n initialKind?: DocumentKind\n inboxPreFill?: InboxPreFill\n}\n\ntype Translator = (key: string, fallback?: string, params?: Record<string, string | number>) => string\n\ntype QuickCreatePayload = {\n id: string\n kind: 'person' | 'company'\n email?: string | null\n label: string\n subtitle?: string | null\n}\n\ntype CustomerQuickCreateProps = {\n t: Translator\n onCreated: (payload: QuickCreatePayload) => void\n}\n\nfunction CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [dialog, setDialog] = React.useState<'person' | 'company' | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n const { organizationId } = useOrganizationScopeDetail()\n const personSchema = React.useMemo(() => createPersonFormSchema(), [])\n const personFields = React.useMemo(() => createPersonFormFields(t), [t])\n const personGroups = React.useMemo(() => createPersonFormGroups(t), [t])\n const companySchema = React.useMemo(() => createCompanyFormSchema(), [])\n const companyFields = React.useMemo(() => createCompanyFormFields(t), [t])\n const companyGroups = React.useMemo(() => createCompanyFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!menuOpen) return\n const handleClick = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setMenuOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setFormError(null)\n setSaving(false)\n }, [])\n\n const handlePersonCreate = React.useCallback(\n async (values: PersonFormValues) => {\n setSaving(true)\n try {\n const payload = buildPersonPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.people.form.displayName.placeholder', 'New person')\n flash(t('sales.documents.form.customer.quick.personSuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'person',\n email: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n label: displayName,\n subtitle: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.person', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const handleCompanyCreate = React.useCallback(\n async (values: CompanyFormValues) => {\n setSaving(true)\n try {\n const payload = buildCompanyPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/companies', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.companies.form.displayName.placeholder', 'New company')\n const email = typeof values.primaryEmail === 'string' ? values.primaryEmail : null\n const domain =\n typeof values.domain === 'string' && values.domain.trim().length ? values.domain.trim() : null\n flash(t('sales.documents.form.customer.quick.companySuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'company',\n email,\n label: displayName,\n subtitle: domain || email || null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.company', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const renderMenu = () => (\n <div className=\"absolute right-0 z-30 mt-2 w-48 rounded border bg-popover p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('person')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <UserRound className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addPerson', 'Create person')}\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('company')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addCompany', 'Create company')}\n </button>\n </div>\n )\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"gap-2\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-expanded={menuOpen}\n >\n <Plus className=\"h-4 w-4\" />\n {t('sales.documents.form.customer.create', 'Create customer')}\n </Button>\n {menuOpen ? renderMenu() : null}\n\n <Dialog open={dialog === 'person'} onOpenChange={(open) => (open ? setDialog('person') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addPerson', 'Create person')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a person without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<PersonFormValues>\n embedded\n fields={personFields}\n groups={personGroups}\n schema={personSchema}\n initialValues={{ addresses: [] as PersonFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handlePersonCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog === 'company'} onOpenChange={(open) => (open ? setDialog('company') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addCompany', 'Create company')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a company without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<CompanyFormValues>\n embedded\n fields={companyFields}\n groups={companyGroups}\n schema={companySchema}\n initialValues={{ addresses: [] as CompanyFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handleCompanyCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction normalizeAddressDraft(draft?: AddressDraft | null): Record<string, unknown> | null {\n if (!draft) return null\n const normalized: Record<string, unknown> = {}\n const assign = (key: keyof AddressDraft, target: string) => {\n const value = draft[key]\n if (typeof value === 'string' && value.trim().length) normalized[target] = value.trim()\n if (typeof value === 'boolean') normalized[target] = value\n }\n assign('name', 'name')\n assign('purpose', 'purpose')\n assign('companyName', 'companyName')\n assign('addressLine1', 'addressLine1')\n assign('addressLine2', 'addressLine2')\n assign('buildingNumber', 'buildingNumber')\n assign('flatNumber', 'flatNumber')\n assign('city', 'city')\n assign('region', 'region')\n assign('postalCode', 'postalCode')\n assign('country', 'country')\n assign('isPrimary', 'isPrimary')\n return Object.keys(normalized).length ? normalized : null\n}\n\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const [customers, setCustomers] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [channels, setChannels] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<AddressOption[]>([])\n const [addressesLoading, setAddressesLoading] = React.useState(false)\n const [addressesError, setAddressesError] = React.useState<string | null>(null)\n const [addressFormat, setAddressFormat] = React.useState<AddressFormatStrategy>('line_first')\n const [defaultCurrency, setDefaultCurrency] = React.useState<string>('USD')\n const addressRequestRef = React.useRef(0)\n const addressAbortRef = React.useRef<AbortController | null>(null)\n const addressTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n const currencyLabels = React.useMemo<DictionarySelectLabels>(() => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n addPrompt: t('sales.documents.form.currency.prompt', 'Currency code'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }), [t])\n const { data: currencyDictionary, refetch: refetchCurrencyDictionary } = useCurrencyDictionary()\n\n const fetchCurrencyOptions = React.useCallback(async (): Promise<DictionaryOption[]> => {\n try {\n const source = currencyDictionary ?? (await refetchCurrencyDictionary())\n if (source && Array.isArray(source.entries)) {\n return source.entries.map((entry) => ({\n value: entry.value,\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }\n return []\n } catch (err) {\n console.error('sales.documents.currency', err)\n return []\n }\n }, [currencyDictionary, refetchCurrencyDictionary])\n\n const loadCustomers = React.useCallback(async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomers(merged)\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n }, [t])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customers.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomers((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customers],\n )\n\n const loadChannels = React.useCallback(async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) setChannels(options)\n return options\n } else {\n setChannels([])\n return []\n }\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n setChannels([])\n return []\n } finally {\n setChannelLoading(false)\n }\n }, [])\n\n const loadDefaultCurrency = React.useCallback(async () => {\n try {\n const call = await apiCall<{ items?: Array<{ currency_code?: string | null }> }>(\n '/api/catalog/price-kinds?isPromotion=false&isActive=true&pageSize=1'\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const code = call.result.items[0]?.currency_code\n if (typeof code === 'string' && code.trim().length) {\n setDefaultCurrency(code.trim().toUpperCase())\n }\n }\n } catch (err) {\n console.error('sales.documents.loadDefaultCurrency', err)\n }\n }, [])\n\n const loadAddresses = React.useCallback(async (customerId?: string | null): Promise<AddressOption[]> => {\n addressRequestRef.current += 1\n const requestId = addressRequestRef.current\n\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n\n if (!customerId) {\n setAddressesError(null)\n setAddressOptions([])\n setAddressesLoading(false)\n return []\n }\n setAddressesLoading(true)\n setAddressesError(null)\n setAddressOptions([])\n const controller = new AbortController()\n addressAbortRef.current = controller\n addressTimeoutRef.current = setTimeout(() => controller.abort(), 12_000)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50', entityId: customerId })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/customers/addresses?${params.toString()}`,\n { signal: controller.signal },\n { fallback: { items: [] } }\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items.reduce<AddressOption[]>((acc, item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return acc\n const value: AddressValue = {\n addressLine1: typeof item.address_line1 === 'string' ? item.address_line1 : null,\n addressLine2: typeof item.address_line2 === 'string' ? item.address_line2 : null,\n buildingNumber: typeof item.building_number === 'string' ? item.building_number : null,\n flatNumber: typeof item.flat_number === 'string' ? item.flat_number : null,\n city: typeof item.city === 'string' ? item.city : null,\n region: typeof item.region === 'string' ? item.region : null,\n postalCode: typeof item.postal_code === 'string' ? item.postal_code : null,\n country: typeof item.country === 'string' ? item.country : null,\n companyName: typeof item.company_name === 'string' ? item.company_name : null,\n }\n const name = typeof item.name === 'string' ? item.name.trim() : ''\n const summary = formatAddressString(value, addressFormat)\n const label = name || summary || id\n const isPrimary = item.is_primary === true\n acc.push({ id, label, summary, value, name: name || null, isPrimary })\n return acc\n }, [])\n if (addressRequestRef.current === requestId) {\n setAddressOptions(options)\n }\n return options\n } else {\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } catch (err) {\n if ((err as DOMException)?.name !== 'AbortError') {\n console.error('sales.documents.loadAddresses', err)\n }\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n if ((err as DOMException)?.name !== 'AbortError') {\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } finally {\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current === controller) {\n addressAbortRef.current = null\n }\n if (addressRequestRef.current === requestId) {\n setAddressesLoading(false)\n }\n }\n return []\n }, [addressFormat, t])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n loadChannels().catch(() => {})\n loadDefaultCurrency().catch(() => {})\n }, [loadChannels, loadCustomers, loadDefaultCurrency])\n\n React.useEffect(\n () => () => {\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n },\n [],\n )\n\n React.useEffect(() => {\n setAddressOptions((prev) =>\n prev.map((entry) => {\n const summary = formatAddressString(entry.value, addressFormat)\n const label = (entry.name && entry.name.trim().length ? entry.name : '') || summary || entry.id\n return { ...entry, summary, label }\n }),\n )\n }, [addressFormat])\n\n React.useEffect(() => {\n let cancelled = false\n async function fetchAddressFormat() {\n try {\n const call = await apiCall<{ addressFormat?: string }>('/api/customers/settings/address-format')\n const format = typeof call.result?.addressFormat === 'string' ? call.result.addressFormat : null\n if (!cancelled && (format === 'street_first' || format === 'line_first')) {\n setAddressFormat(format)\n }\n } catch (err) {\n console.error('sales.documents.addressFormat', err)\n } finally {\n }\n }\n fetchAddressFormat().catch(() => {})\n return () => {\n cancelled = true\n }\n }, [])\n\n const resetAddressFormState = React.useCallback(\n (updateValue: (key: string, value: unknown) => void) => {\n updateValue('shippingAddressId', null)\n updateValue('billingAddressId', null)\n updateValue('shippingAddressDraft', undefined)\n updateValue('billingAddressDraft', undefined)\n updateValue('useCustomShipping', false)\n updateValue('useCustomBilling', false)\n updateValue('saveShippingAddress', false)\n updateValue('saveBillingAddress', false)\n updateValue('sameAsShipping', true)\n },\n [],\n )\n\n function DocumentNumberField({ value, setValue, values }: CrudCustomFieldRenderProps) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const kind: DocumentKind = formValues.documentKind === 'order' ? 'order' : 'quote'\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const autoValueRef = React.useRef<string | null>(null)\n const lastKindRef = React.useRef<DocumentKind | null>(null)\n\n const requestNumber = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const call = await apiCall<{ number?: string; error?: string }>('/api/sales/document-numbers', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n const nextNumber = typeof call.result?.number === 'string' ? call.result.number : null\n if (call.ok && nextNumber) {\n autoValueRef.current = nextNumber\n lastKindRef.current = kind\n setValue(nextNumber)\n } else {\n setError(call.result?.error || t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n }\n } catch (err) {\n console.error('sales.documents.generateNumber', err)\n setError(t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n } finally {\n setLoading(false)\n }\n }, [kind, setValue, t])\n\n React.useEffect(() => {\n const current = typeof value === 'string' ? value.trim() : ''\n if (!current.length && !lastKindRef.current) {\n void requestNumber()\n } else {\n lastKindRef.current = kind\n }\n }, [kind, requestNumber, value])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex w-full flex-col gap-2 md:flex-row md:items-center md:gap-3\">\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n disabled={loading}\n spellCheck={false}\n className=\"w-full md:flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" onClick={requestNumber} disabled={loading}>\n {loading\n ? t('sales.documents.form.numberLoading', 'Generating\u2026')\n : t('sales.documents.form.numberRefresh', 'Generate')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.form.numberHintOrder', 'Format applies to orders and uses the configured counter.')\n : t('sales.documents.form.numberHintQuote', 'Format applies to quotes and uses the configured counter.')}\n </p>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n }\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'documentKind',\n label: '',\n type: 'custom',\n required: false,\n component: ({ value, setValue }) => {\n const current = value === 'order' ? 'order' : 'quote'\n const label = t('sales.documents.form.kind', 'Document type')\n return (\n <div className=\"space-y-2 pt-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">{label}</div>\n <div className=\"inline-flex rounded-lg border bg-background p-1 shadow-sm\">\n {(['quote', 'order'] as DocumentKind[]).map((kind) => (\n <Button\n key={kind}\n type=\"button\"\n variant={current === kind ? 'default' : 'ghost'}\n onClick={() => setValue(kind)}\n >\n {t(`sales.documents.form.kind.${kind}`, kind.charAt(0).toUpperCase() + kind.slice(1))}\n </Button>\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'sales.documents.form.kind.hint',\n \"Please select which kind of sales document you want to create. When creating Quotes - it's kind of Shopping cart or Request for negotiation and could be converted to regular order later\",\n )}\n </p>\n </div>\n )\n },\n },\n {\n id: 'documentNumber',\n label: t('sales.documents.form.number', 'Document number'),\n type: 'custom',\n required: true,\n component: DocumentNumberField,\n },\n {\n id: 'currencyCode',\n label: t('sales.documents.form.currency', 'Currency'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? '')}\n fetchOptions={fetchCurrencyOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={currencyLabels}\n />\n ),\n },\n {\n id: 'channelId',\n label: t('sales.documents.form.channel', 'Sales channel'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n fetchItems={async (query) => {\n const options = await loadChannels(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'shippingAddressSection',\n label: '',\n type: 'custom',\n component: ({ values, setFormValue }) => {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomShipping === true\n const selectedId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : ''\n const draft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const customerId = typeof formValues.customerEntityId === 'string' ? formValues.customerEntityId : null\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.shipping.title', 'Shipping address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {customerRequired\n ? t('sales.documents.form.address.customerRequired', 'Select customer first or define custom address')\n : t('sales.documents.form.shipping.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomShipping', checked)}\n />\n <span>{t('sales.documents.form.shipping.custom', 'Define new address')}</span>\n </label>\n </div>\n {!useCustom ? (\n <select\n className=\"w-full rounded border px-2 py-2 text-sm\"\n value={selectedId}\n onChange={(evt) => updateValue('shippingAddressId', evt.target.value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <option value=\"\">\n {addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')}\n </option>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <option key={addr.id} value={addr.id}>{optionLabel}</option>\n )\n })}\n </select>\n ) : null}\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('shippingAddressDraft', next)}\n hidePrimaryToggle\n />\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Switch\n checked={formValues.saveShippingAddress === true}\n onCheckedChange={(checked) => updateValue('saveShippingAddress', checked)}\n />\n {t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n </label>\n </div>\n ) : null}\n {addressesError && customerId ? (\n <div className=\"flex items-start justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n <span className=\"flex-1\">{addressesError}</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => loadAddresses(customerId)}\n disabled={addressesLoading}\n className=\"shrink-0\"\n >\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n </div>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'billingAddressSection',\n label: '',\n type: 'custom',\n component: function BillingAddressSectionField({ values, setFormValue }) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomBilling === true\n const selectedId = typeof formValues.billingAddressId === 'string' ? formValues.billingAddressId : ''\n const draft = (formValues.billingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const sameAsShipping = formValues.sameAsShipping !== false\n const shippingId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : null\n const shippingDraft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const shippingDraftKey = JSON.stringify(shippingDraft)\n const billingDraftKey = JSON.stringify(draft)\n const useCustomShipping = formValues.useCustomShipping === true\n\n React.useEffect(() => {\n if (!sameAsShipping) return\n if ((formValues.billingAddressId ?? null) !== shippingId) {\n updateValue('billingAddressId', shippingId)\n }\n if (useCustomShipping !== (formValues.useCustomBilling === true)) {\n updateValue('useCustomBilling', useCustomShipping)\n }\n if (useCustomShipping && shippingDraftKey !== billingDraftKey) {\n updateValue('billingAddressDraft', shippingDraft)\n }\n }, [\n billingDraftKey,\n sameAsShipping,\n updateValue,\n shippingDraft,\n shippingDraftKey,\n shippingId,\n useCustomShipping,\n formValues.billingAddressId,\n formValues.useCustomBilling,\n ])\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.billing.title', 'Billing address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {sameAsShipping\n ? t('sales.documents.form.address.sameAsShippingHint', 'Billing will mirror the shipping address. Uncheck to edit.')\n : t('sales.documents.form.billing.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={sameAsShipping}\n onCheckedChange={(checked) => {\n updateValue('sameAsShipping', checked)\n if (checked) {\n updateValue('useCustomBilling', useCustomShipping)\n updateValue('billingAddressId', shippingId)\n updateValue('billingAddressDraft', shippingDraft)\n }\n }}\n />\n <span>{t('sales.documents.form.address.sameAsShipping', 'Same as shipping')}</span>\n </label>\n </div>\n\n {!sameAsShipping ? (\n <>\n {!useCustom ? (\n <select\n className=\"w-full rounded border px-2 py-2 text-sm\"\n value={selectedId}\n onChange={(evt) => updateValue('billingAddressId', evt.target.value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <option value=\"\">\n {addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')}\n </option>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <option key={addr.id} value={addr.id}>{optionLabel}</option>\n )\n })}\n </select>\n ) : null}\n\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomBilling', checked)}\n disabled={false}\n />\n <span>{t('sales.documents.form.shipping.custom', 'Define new address')}</span>\n </label>\n\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('billingAddressDraft', next)}\n hidePrimaryToggle\n />\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Switch\n checked={formValues.saveBillingAddress === true}\n onCheckedChange={(checked) => updateValue('saveBillingAddress', checked)}\n />\n {t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n </label>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'infoNote',\n label: '',\n type: 'custom',\n component: () => (\n <div className=\"rounded-lg border bg-muted/40 p-3 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </div>\n ),\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n currencyLabels,\n fetchCurrencyOptions,\n loadAddresses,\n loadChannels,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'docType', title: '', column: 1, fields: ['documentKind', 'documentNumber'] },\n {\n id: 'customer',\n title: '',\n column: 1,\n fields: [],\n component: function CustomerGroupComponent({ values, setValue }) {\n const emailValue = typeof values.customerEmail === 'string' ? values.customerEmail : ''\n const { duplicate, checking } = useEmailDuplicateCheck(emailValue, {\n disabled: false,\n debounceMs: 400,\n matchMode: 'prefix',\n })\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-3\">\n <LookupSelect\n value={typeof values.customerEntityId === 'string' ? values.customerEntityId : null}\n onChange={(next) => {\n if (next !== values.customerEntityId) {\n resetAddressFormState(setValue)\n }\n setValue('customerEntityId', next)\n loadAddresses(next).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (next) {\n const match = customers.find((entry) => entry.id === next)\n const possibleEmail =\n typeof match?.primaryEmail === 'string' && match.primaryEmail.length\n ? match.primaryEmail\n : null\n if (possibleEmail) {\n setValue('customerEmail', possibleEmail)\n } else {\n fetchCustomerEmail(next, match?.kind)\n .then((email) => {\n if (email) setValue('customerEmail', email)\n })\n .catch(() => {})\n }\n }\n }}\n fetchItems={async (query) => {\n const options = await loadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n actionSlot={\n <CustomerQuickCreate\n t={t}\n onCreated={({ id, email, label, kind, subtitle }) => {\n // Seed the search box with the new customer's display name so it renders immediately\n customerQuerySetter.current?.(label)\n setCustomers((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: subtitle ?? undefined,\n kind,\n primaryEmail: email ?? null,\n }\n return [next, ...prev]\n })\n setValue('customerEntityId', id)\n resetAddressFormState(setValue)\n loadAddresses(id).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (email && !values.customerEmail) {\n setValue('customerEmail', email)\n }\n }}\n />\n }\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) => t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })}\n />\n </div>\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n type=\"email\"\n className=\"w-full rounded border pl-8 pr-2 py-2 text-sm\"\n value={emailValue}\n onChange={(event) => setValue('customerEmail', event.target.value)}\n placeholder={t('sales.documents.form.email.placeholder', 'Email used for the document')}\n spellCheck={false}\n />\n </div>\n {duplicate ? (\n <div className=\"flex items-center justify-between rounded border bg-muted px-3 py-2 text-xs text-muted-foreground\">\n <span>\n {t('customers.people.form.emailDuplicateNotice', undefined, { name: duplicate.displayName })}\n </span>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className=\"px-4\"\n type=\"button\"\n disabled={values.customerEntityId === duplicate.id}\n aria-disabled={values.customerEntityId === duplicate.id}\n onClick={() => {\n setValue('customerEntityId', duplicate.id)\n resetAddressFormState(setValue)\n loadAddresses(duplicate.id)\n }}\n >\n {values.customerEntityId === duplicate.id\n ? t('sales.documents.form.email.alreadySelected', 'Selected customer')\n : t('sales.documents.form.email.selectCustomer', 'Select customer')}\n </Button>\n </div>\n ) : null}\n {!duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.form.emailChecking')}</p>\n ) : null}\n </div>\n </div>\n )\n },\n },\n { id: 'channels-comments', title: '', column: 1, fields: ['channelId', 'comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'shipping', title: '', column: 2, fields: ['shippingAddressSection'] },\n { id: 'billing', title: '', column: 2, fields: ['billingAddressSection'] },\n { id: 'custom', title: t('sales.documents.form.customFields', 'Custom fields'), column: 2, kind: 'customFields' },\n ], [\n customers,\n fetchCustomerEmail,\n loadAddresses,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const initialValues = React.useMemo<Partial<SalesDocumentFormValues>>(\n () => ({\n documentKind: initialKind === 'order' ? 'order' : 'quote',\n documentNumber: '',\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n channelId: inboxPreFill?.channelId || undefined,\n customerEntityId: inboxPreFill?.customerEntityId || undefined,\n comments: inboxPreFill?.comments || undefined,\n useCustomShipping: false,\n useCustomBilling: false,\n sameAsShipping: true,\n }),\n [initialKind, inboxPreFill, defaultCurrency]\n )\n\n // When inboxPreFill provides a customer, load their addresses on mount\n React.useEffect(() => {\n if (inboxPreFill?.customerEntityId) {\n loadAddresses(inboxPreFill.customerEntityId)\n }\n }, [inboxPreFill?.customerEntityId, loadAddresses])\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const safeValues = values ?? {}\n const customFields = collectCustomFieldValues(safeValues)\n const base = Object.fromEntries(\n Object.entries(safeValues).filter(([key]) => !key.startsWith('cf_') && !key.startsWith('cf:'))\n ) as SalesDocumentFormValues\n const documentKind: DocumentKind = base.documentKind === 'order' ? 'order' : 'quote'\n const payload: Record<string, unknown> = {\n currencyCode: typeof base.currencyCode === 'string' && base.currencyCode.trim().length\n ? base.currencyCode.trim().toUpperCase()\n : undefined,\n customerEntityId: base.customerEntityId || undefined,\n comments: base.comments ?? undefined,\n metadata: base.customerEmail ? { customerEmail: base.customerEmail } : undefined,\n }\n payload.channelId = base.channelId || undefined\n const documentNumber = typeof base.documentNumber === 'string' ? base.documentNumber.trim() : ''\n if (!documentNumber) {\n throw createCrudFormError(t('sales.documents.form.errors.numberRequired', 'Document number is required.'))\n }\n if (documentKind === 'order') {\n payload.orderNumber = documentNumber\n } else {\n payload.quoteNumber = documentNumber\n }\n const shippingSnapshot = base.useCustomShipping ? normalizeAddressDraft(base.shippingAddressDraft) : null\n let billingSnapshot = base.useCustomBilling ? normalizeAddressDraft(base.billingAddressDraft) : null\n const sameAsShipping = base.sameAsShipping !== false\n if (sameAsShipping) {\n if (shippingSnapshot) {\n billingSnapshot = shippingSnapshot\n } else if (!base.useCustomShipping) {\n payload.billingAddressId = base.shippingAddressId || undefined\n }\n }\n if (shippingSnapshot) {\n payload.shippingAddressSnapshot = shippingSnapshot\n payload.shippingAddressId = undefined\n }\n if (billingSnapshot) {\n payload.billingAddressSnapshot = billingSnapshot\n payload.billingAddressId = undefined\n }\n if (!base.useCustomShipping) payload.shippingAddressId = base.shippingAddressId || undefined\n if (!base.useCustomBilling && !sameAsShipping) payload.billingAddressId = base.billingAddressId || undefined\n\n try {\n let shippingId = payload.shippingAddressId as string | undefined\n let billingId = payload.billingAddressId as string | undefined\n if (base.customerEntityId && shippingSnapshot && base.saveShippingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: shippingSnapshot.addressLine1 ?? shippingSnapshot.name ?? 'Address',\n name: shippingSnapshot.name ?? undefined,\n addressLine2: shippingSnapshot.addressLine2 ?? undefined,\n buildingNumber: shippingSnapshot.buildingNumber ?? undefined,\n flatNumber: shippingSnapshot.flatNumber ?? undefined,\n city: shippingSnapshot.city ?? undefined,\n region: shippingSnapshot.region ?? undefined,\n postalCode: shippingSnapshot.postalCode ?? undefined,\n country: shippingSnapshot.country ?? undefined,\n purpose: shippingSnapshot.purpose ?? undefined,\n isPrimary: shippingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) shippingId = res.result.id\n }\n if (base.customerEntityId && billingSnapshot && base.saveBillingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: billingSnapshot.addressLine1 ?? billingSnapshot.name ?? 'Address',\n name: billingSnapshot.name ?? undefined,\n addressLine2: billingSnapshot.addressLine2 ?? undefined,\n buildingNumber: billingSnapshot.buildingNumber ?? undefined,\n flatNumber: billingSnapshot.flatNumber ?? undefined,\n city: billingSnapshot.city ?? undefined,\n region: billingSnapshot.region ?? undefined,\n postalCode: billingSnapshot.postalCode ?? undefined,\n country: billingSnapshot.country ?? undefined,\n purpose: billingSnapshot.purpose ?? undefined,\n isPrimary: billingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) billingId = res.result.id\n }\n if (!base.useCustomShipping && shippingId) payload.shippingAddressId = shippingId\n if (!base.useCustomBilling && !sameAsShipping && billingId) payload.billingAddressId = billingId\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const endpoint = documentKind === 'order' ? 'sales/orders' : 'sales/quotes'\n const { result } = await createCrud<{ id?: string; orderId?: string; quoteId?: string }>(endpoint, payload, {\n errorMessage: t('sales.documents.form.errors.submit', 'Failed to create document.'),\n })\n const newId =\n (result && typeof result.id === 'string' && result.id) ||\n (result && typeof result.orderId === 'string' && result.orderId) ||\n (result && typeof result.quoteId === 'string' && result.quoteId) ||\n null\n if (!newId) {\n throw createCrudFormError(t('sales.documents.form.errors.id', 'Document id missing after create.'))\n }\n flash(t('sales.documents.form.success', 'Sales document created.'), 'success')\n onCreated({ id: newId, kind: documentKind })\n } catch (err) {\n if (err instanceof Error) throw err\n throw createCrudFormError(t('sales.documents.form.errors.submit', 'Failed to create document.'))\n }\n },\n [onCreated, t],\n )\n\n const cancelHref = initialKind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n\n return (\n <CrudForm<SalesDocumentFormValues>\n title={t('sales.documents.form.title', 'Create sales document')}\n backHref={cancelHref}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n entityIds={[E.sales.sales_quote, E.sales.sales_order]}\n submitLabel={t('sales.documents.form.submit', 'Create')}\n cancelHref={cancelHref}\n onSubmit={handleSubmit}\n />\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport { createCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryEntrySelect,\n type DictionaryOption,\n type DictionarySelectLabels,\n} from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { Building2, Mail, Plus, Store, UserRound } from 'lucide-react'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport {\n buildCompanyPayload,\n buildPersonPayload,\n createCompanyFormFields,\n createCompanyFormGroups,\n createCompanyFormSchema,\n createPersonFormFields,\n createPersonFormGroups,\n createPersonFormSchema,\n type CompanyFormValues,\n type PersonFormValues,\n} from '@open-mercato/core/modules/customers/components/formConfig'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n formatAddressString,\n type AddressFormatStrategy,\n type AddressValue,\n} from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'\n\ntype DocumentKind = 'quote' | 'order'\n\ntype AddressDraft = AddressEditorDraft\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = { id: string; label: string }\n\ntype AddressOption = {\n id: string\n label: string\n summary: string\n name?: string | null\n isPrimary: boolean\n value: AddressValue\n}\n\nexport type SalesDocumentFormValues = {\n documentKind: DocumentKind\n documentNumber?: string\n currencyCode: string\n channelId?: string | null\n customerEntityId?: string | null\n customerEmail?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n useCustomShipping?: boolean\n useCustomBilling?: boolean\n sameAsShipping?: boolean\n saveShippingAddress?: boolean\n saveBillingAddress?: boolean\n shippingAddressDraft?: AddressDraft\n billingAddressDraft?: AddressDraft\n comments?: string | null\n} & Record<string, unknown>\n\ntype InboxPreFill = {\n customerEntityId?: string\n currencyCode?: string\n channelId?: string\n comments?: string\n lineItems?: Record<string, unknown>[]\n}\n\ntype SalesDocumentFormProps = {\n onCreated: (params: { id: string; kind: DocumentKind }) => void\n isSubmitting?: boolean\n initialKind?: DocumentKind\n inboxPreFill?: InboxPreFill\n}\n\ntype Translator = (key: string, fallback?: string, params?: Record<string, string | number>) => string\n\ntype QuickCreatePayload = {\n id: string\n kind: 'person' | 'company'\n email?: string | null\n label: string\n subtitle?: string | null\n}\n\ntype CustomerQuickCreateProps = {\n t: Translator\n onCreated: (payload: QuickCreatePayload) => void\n}\n\nfunction CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [dialog, setDialog] = React.useState<'person' | 'company' | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n const { organizationId } = useOrganizationScopeDetail()\n const personSchema = React.useMemo(() => createPersonFormSchema(), [])\n const personFields = React.useMemo(() => createPersonFormFields(t), [t])\n const personGroups = React.useMemo(() => createPersonFormGroups(t), [t])\n const companySchema = React.useMemo(() => createCompanyFormSchema(), [])\n const companyFields = React.useMemo(() => createCompanyFormFields(t), [t])\n const companyGroups = React.useMemo(() => createCompanyFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!menuOpen) return\n const handleClick = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setMenuOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setFormError(null)\n setSaving(false)\n }, [])\n\n const handlePersonCreate = React.useCallback(\n async (values: PersonFormValues) => {\n setSaving(true)\n try {\n const payload = buildPersonPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.people.form.displayName.placeholder', 'New person')\n flash(t('sales.documents.form.customer.quick.personSuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'person',\n email: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n label: displayName,\n subtitle: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.person', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const handleCompanyCreate = React.useCallback(\n async (values: CompanyFormValues) => {\n setSaving(true)\n try {\n const payload = buildCompanyPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/companies', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.companies.form.displayName.placeholder', 'New company')\n const email = typeof values.primaryEmail === 'string' ? values.primaryEmail : null\n const domain =\n typeof values.domain === 'string' && values.domain.trim().length ? values.domain.trim() : null\n flash(t('sales.documents.form.customer.quick.companySuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'company',\n email,\n label: displayName,\n subtitle: domain || email || null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.company', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const renderMenu = () => (\n <div className=\"absolute right-0 z-dropdown mt-2 w-48 rounded border bg-popover p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('person')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <UserRound className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addPerson', 'Create person')}\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('company')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addCompany', 'Create company')}\n </button>\n </div>\n )\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"gap-2\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-expanded={menuOpen}\n >\n <Plus className=\"h-4 w-4\" />\n {t('sales.documents.form.customer.create', 'Create customer')}\n </Button>\n {menuOpen ? renderMenu() : null}\n\n <Dialog open={dialog === 'person'} onOpenChange={(open) => (open ? setDialog('person') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addPerson', 'Create person')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a person without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<PersonFormValues>\n embedded\n fields={personFields}\n groups={personGroups}\n schema={personSchema}\n initialValues={{ addresses: [] as PersonFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handlePersonCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog === 'company'} onOpenChange={(open) => (open ? setDialog('company') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addCompany', 'Create company')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a company without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<CompanyFormValues>\n embedded\n fields={companyFields}\n groups={companyGroups}\n schema={companySchema}\n initialValues={{ addresses: [] as CompanyFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handleCompanyCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction normalizeAddressDraft(draft?: AddressDraft | null): Record<string, unknown> | null {\n if (!draft) return null\n const normalized: Record<string, unknown> = {}\n const assign = (key: keyof AddressDraft, target: string) => {\n const value = draft[key]\n if (typeof value === 'string' && value.trim().length) normalized[target] = value.trim()\n if (typeof value === 'boolean') normalized[target] = value\n }\n assign('name', 'name')\n assign('purpose', 'purpose')\n assign('companyName', 'companyName')\n assign('addressLine1', 'addressLine1')\n assign('addressLine2', 'addressLine2')\n assign('buildingNumber', 'buildingNumber')\n assign('flatNumber', 'flatNumber')\n assign('city', 'city')\n assign('region', 'region')\n assign('postalCode', 'postalCode')\n assign('country', 'country')\n assign('isPrimary', 'isPrimary')\n return Object.keys(normalized).length ? normalized : null\n}\n\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const [customers, setCustomers] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [channels, setChannels] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<AddressOption[]>([])\n const [addressesLoading, setAddressesLoading] = React.useState(false)\n const [addressesError, setAddressesError] = React.useState<string | null>(null)\n const [addressFormat, setAddressFormat] = React.useState<AddressFormatStrategy>('line_first')\n const [defaultCurrency, setDefaultCurrency] = React.useState<string>('USD')\n const addressRequestRef = React.useRef(0)\n const addressAbortRef = React.useRef<AbortController | null>(null)\n const addressTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n const currencyLabels = React.useMemo<DictionarySelectLabels>(() => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n addPrompt: t('sales.documents.form.currency.prompt', 'Currency code'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }), [t])\n const { data: currencyDictionary, refetch: refetchCurrencyDictionary } = useCurrencyDictionary()\n\n const fetchCurrencyOptions = React.useCallback(async (): Promise<DictionaryOption[]> => {\n try {\n const source = currencyDictionary ?? (await refetchCurrencyDictionary())\n if (source && Array.isArray(source.entries)) {\n return source.entries.map((entry) => ({\n value: entry.value,\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }\n return []\n } catch (err) {\n console.error('sales.documents.currency', err)\n return []\n }\n }, [currencyDictionary, refetchCurrencyDictionary])\n\n const loadCustomers = React.useCallback(async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomers(merged)\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n }, [t])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customers.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomers((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customers],\n )\n\n const loadChannels = React.useCallback(async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) setChannels(options)\n return options\n } else {\n setChannels([])\n return []\n }\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n setChannels([])\n return []\n } finally {\n setChannelLoading(false)\n }\n }, [])\n\n const loadDefaultCurrency = React.useCallback(async () => {\n try {\n const call = await apiCall<{ items?: Array<{ currency_code?: string | null }> }>(\n '/api/catalog/price-kinds?isPromotion=false&isActive=true&pageSize=1'\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const code = call.result.items[0]?.currency_code\n if (typeof code === 'string' && code.trim().length) {\n setDefaultCurrency(code.trim().toUpperCase())\n }\n }\n } catch (err) {\n console.error('sales.documents.loadDefaultCurrency', err)\n }\n }, [])\n\n const loadAddresses = React.useCallback(async (customerId?: string | null): Promise<AddressOption[]> => {\n addressRequestRef.current += 1\n const requestId = addressRequestRef.current\n\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n\n if (!customerId) {\n setAddressesError(null)\n setAddressOptions([])\n setAddressesLoading(false)\n return []\n }\n setAddressesLoading(true)\n setAddressesError(null)\n setAddressOptions([])\n const controller = new AbortController()\n addressAbortRef.current = controller\n addressTimeoutRef.current = setTimeout(() => controller.abort(), 12_000)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50', entityId: customerId })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/customers/addresses?${params.toString()}`,\n { signal: controller.signal },\n { fallback: { items: [] } }\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items.reduce<AddressOption[]>((acc, item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return acc\n const value: AddressValue = {\n addressLine1: typeof item.address_line1 === 'string' ? item.address_line1 : null,\n addressLine2: typeof item.address_line2 === 'string' ? item.address_line2 : null,\n buildingNumber: typeof item.building_number === 'string' ? item.building_number : null,\n flatNumber: typeof item.flat_number === 'string' ? item.flat_number : null,\n city: typeof item.city === 'string' ? item.city : null,\n region: typeof item.region === 'string' ? item.region : null,\n postalCode: typeof item.postal_code === 'string' ? item.postal_code : null,\n country: typeof item.country === 'string' ? item.country : null,\n companyName: typeof item.company_name === 'string' ? item.company_name : null,\n }\n const name = typeof item.name === 'string' ? item.name.trim() : ''\n const summary = formatAddressString(value, addressFormat)\n const label = name || summary || id\n const isPrimary = item.is_primary === true\n acc.push({ id, label, summary, value, name: name || null, isPrimary })\n return acc\n }, [])\n if (addressRequestRef.current === requestId) {\n setAddressOptions(options)\n }\n return options\n } else {\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } catch (err) {\n if ((err as DOMException)?.name !== 'AbortError') {\n console.error('sales.documents.loadAddresses', err)\n }\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n if ((err as DOMException)?.name !== 'AbortError') {\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } finally {\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current === controller) {\n addressAbortRef.current = null\n }\n if (addressRequestRef.current === requestId) {\n setAddressesLoading(false)\n }\n }\n return []\n }, [addressFormat, t])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n loadChannels().catch(() => {})\n loadDefaultCurrency().catch(() => {})\n }, [loadChannels, loadCustomers, loadDefaultCurrency])\n\n React.useEffect(\n () => () => {\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n },\n [],\n )\n\n React.useEffect(() => {\n setAddressOptions((prev) =>\n prev.map((entry) => {\n const summary = formatAddressString(entry.value, addressFormat)\n const label = (entry.name && entry.name.trim().length ? entry.name : '') || summary || entry.id\n return { ...entry, summary, label }\n }),\n )\n }, [addressFormat])\n\n React.useEffect(() => {\n let cancelled = false\n async function fetchAddressFormat() {\n try {\n const call = await apiCall<{ addressFormat?: string }>('/api/customers/settings/address-format')\n const format = typeof call.result?.addressFormat === 'string' ? call.result.addressFormat : null\n if (!cancelled && (format === 'street_first' || format === 'line_first')) {\n setAddressFormat(format)\n }\n } catch (err) {\n console.error('sales.documents.addressFormat', err)\n } finally {\n }\n }\n fetchAddressFormat().catch(() => {})\n return () => {\n cancelled = true\n }\n }, [])\n\n const resetAddressFormState = React.useCallback(\n (updateValue: (key: string, value: unknown) => void) => {\n updateValue('shippingAddressId', null)\n updateValue('billingAddressId', null)\n updateValue('shippingAddressDraft', undefined)\n updateValue('billingAddressDraft', undefined)\n updateValue('useCustomShipping', false)\n updateValue('useCustomBilling', false)\n updateValue('saveShippingAddress', false)\n updateValue('saveBillingAddress', false)\n updateValue('sameAsShipping', true)\n },\n [],\n )\n\n function DocumentNumberField({ value, setValue, values }: CrudCustomFieldRenderProps) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const kind: DocumentKind = formValues.documentKind === 'order' ? 'order' : 'quote'\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const autoValueRef = React.useRef<string | null>(null)\n const lastKindRef = React.useRef<DocumentKind | null>(null)\n\n const requestNumber = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const call = await apiCall<{ number?: string; error?: string }>('/api/sales/document-numbers', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n const nextNumber = typeof call.result?.number === 'string' ? call.result.number : null\n if (call.ok && nextNumber) {\n autoValueRef.current = nextNumber\n lastKindRef.current = kind\n setValue(nextNumber)\n } else {\n setError(call.result?.error || t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n }\n } catch (err) {\n console.error('sales.documents.generateNumber', err)\n setError(t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n } finally {\n setLoading(false)\n }\n }, [kind, setValue, t])\n\n React.useEffect(() => {\n const current = typeof value === 'string' ? value.trim() : ''\n if (!current.length && !lastKindRef.current) {\n void requestNumber()\n } else {\n lastKindRef.current = kind\n }\n }, [kind, requestNumber, value])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex w-full flex-col gap-2 md:flex-row md:items-center md:gap-3\">\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n disabled={loading}\n spellCheck={false}\n className=\"w-full md:flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" onClick={requestNumber} disabled={loading}>\n {loading\n ? t('sales.documents.form.numberLoading', 'Generating\u2026')\n : t('sales.documents.form.numberRefresh', 'Generate')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.form.numberHintOrder', 'Format applies to orders and uses the configured counter.')\n : t('sales.documents.form.numberHintQuote', 'Format applies to quotes and uses the configured counter.')}\n </p>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n }\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'documentKind',\n label: '',\n type: 'custom',\n required: false,\n component: ({ value, setValue }) => {\n const current = value === 'order' ? 'order' : 'quote'\n const label = t('sales.documents.form.kind', 'Document type')\n return (\n <div className=\"space-y-2 pt-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">{label}</div>\n <div className=\"inline-flex rounded-lg border bg-background p-1 shadow-sm\">\n {(['quote', 'order'] as DocumentKind[]).map((kind) => (\n <Button\n key={kind}\n type=\"button\"\n variant={current === kind ? 'default' : 'ghost'}\n onClick={() => setValue(kind)}\n >\n {t(`sales.documents.form.kind.${kind}`, kind.charAt(0).toUpperCase() + kind.slice(1))}\n </Button>\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'sales.documents.form.kind.hint',\n \"Please select which kind of sales document you want to create. When creating Quotes - it's kind of Shopping cart or Request for negotiation and could be converted to regular order later\",\n )}\n </p>\n </div>\n )\n },\n },\n {\n id: 'documentNumber',\n label: t('sales.documents.form.number', 'Document number'),\n type: 'custom',\n required: true,\n component: DocumentNumberField,\n },\n {\n id: 'currencyCode',\n label: t('sales.documents.form.currency', 'Currency'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? '')}\n fetchOptions={fetchCurrencyOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={currencyLabels}\n />\n ),\n },\n {\n id: 'channelId',\n label: t('sales.documents.form.channel', 'Sales channel'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n fetchItems={async (query) => {\n const options = await loadChannels(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'shippingAddressSection',\n label: '',\n type: 'custom',\n component: ({ values, setFormValue }) => {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomShipping === true\n const selectedId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : ''\n const draft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const customerId = typeof formValues.customerEntityId === 'string' ? formValues.customerEntityId : null\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.shipping.title', 'Shipping address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {customerRequired\n ? t('sales.documents.form.address.customerRequired', 'Select customer first or define custom address')\n : t('sales.documents.form.shipping.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomShipping', checked)}\n />\n <span>{t('sales.documents.form.shipping.custom', 'Define new address')}</span>\n </label>\n </div>\n {!useCustom ? (\n <select\n className=\"w-full rounded border px-2 py-2 text-sm\"\n value={selectedId}\n onChange={(evt) => updateValue('shippingAddressId', evt.target.value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <option value=\"\">\n {addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')}\n </option>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <option key={addr.id} value={addr.id}>{optionLabel}</option>\n )\n })}\n </select>\n ) : null}\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('shippingAddressDraft', next)}\n hidePrimaryToggle\n />\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Switch\n checked={formValues.saveShippingAddress === true}\n onCheckedChange={(checked) => updateValue('saveShippingAddress', checked)}\n />\n {t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n </label>\n </div>\n ) : null}\n {addressesError && customerId ? (\n <div className=\"flex items-start justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n <span className=\"flex-1\">{addressesError}</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => loadAddresses(customerId)}\n disabled={addressesLoading}\n className=\"shrink-0\"\n >\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n </div>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'billingAddressSection',\n label: '',\n type: 'custom',\n component: function BillingAddressSectionField({ values, setFormValue }) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomBilling === true\n const selectedId = typeof formValues.billingAddressId === 'string' ? formValues.billingAddressId : ''\n const draft = (formValues.billingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const sameAsShipping = formValues.sameAsShipping !== false\n const shippingId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : null\n const shippingDraft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const shippingDraftKey = JSON.stringify(shippingDraft)\n const billingDraftKey = JSON.stringify(draft)\n const useCustomShipping = formValues.useCustomShipping === true\n\n React.useEffect(() => {\n if (!sameAsShipping) return\n if ((formValues.billingAddressId ?? null) !== shippingId) {\n updateValue('billingAddressId', shippingId)\n }\n if (useCustomShipping !== (formValues.useCustomBilling === true)) {\n updateValue('useCustomBilling', useCustomShipping)\n }\n if (useCustomShipping && shippingDraftKey !== billingDraftKey) {\n updateValue('billingAddressDraft', shippingDraft)\n }\n }, [\n billingDraftKey,\n sameAsShipping,\n updateValue,\n shippingDraft,\n shippingDraftKey,\n shippingId,\n useCustomShipping,\n formValues.billingAddressId,\n formValues.useCustomBilling,\n ])\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.billing.title', 'Billing address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {sameAsShipping\n ? t('sales.documents.form.address.sameAsShippingHint', 'Billing will mirror the shipping address. Uncheck to edit.')\n : t('sales.documents.form.billing.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={sameAsShipping}\n onCheckedChange={(checked) => {\n updateValue('sameAsShipping', checked)\n if (checked) {\n updateValue('useCustomBilling', useCustomShipping)\n updateValue('billingAddressId', shippingId)\n updateValue('billingAddressDraft', shippingDraft)\n }\n }}\n />\n <span>{t('sales.documents.form.address.sameAsShipping', 'Same as shipping')}</span>\n </label>\n </div>\n\n {!sameAsShipping ? (\n <>\n {!useCustom ? (\n <select\n className=\"w-full rounded border px-2 py-2 text-sm\"\n value={selectedId}\n onChange={(evt) => updateValue('billingAddressId', evt.target.value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <option value=\"\">\n {addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')}\n </option>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <option key={addr.id} value={addr.id}>{optionLabel}</option>\n )\n })}\n </select>\n ) : null}\n\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomBilling', checked)}\n disabled={false}\n />\n <span>{t('sales.documents.form.shipping.custom', 'Define new address')}</span>\n </label>\n\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('billingAddressDraft', next)}\n hidePrimaryToggle\n />\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Switch\n checked={formValues.saveBillingAddress === true}\n onCheckedChange={(checked) => updateValue('saveBillingAddress', checked)}\n />\n {t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n </label>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'infoNote',\n label: '',\n type: 'custom',\n component: () => (\n <div className=\"rounded-lg border bg-muted/50 p-3 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </div>\n ),\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n currencyLabels,\n fetchCurrencyOptions,\n loadAddresses,\n loadChannels,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'docType', title: '', column: 1, fields: ['documentKind', 'documentNumber'] },\n {\n id: 'customer',\n title: '',\n column: 1,\n fields: [],\n component: function CustomerGroupComponent({ values, setValue }) {\n const emailValue = typeof values.customerEmail === 'string' ? values.customerEmail : ''\n const { duplicate, checking } = useEmailDuplicateCheck(emailValue, {\n disabled: false,\n debounceMs: 400,\n matchMode: 'prefix',\n })\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-3\">\n <LookupSelect\n value={typeof values.customerEntityId === 'string' ? values.customerEntityId : null}\n onChange={(next) => {\n if (next !== values.customerEntityId) {\n resetAddressFormState(setValue)\n }\n setValue('customerEntityId', next)\n loadAddresses(next).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (next) {\n const match = customers.find((entry) => entry.id === next)\n const possibleEmail =\n typeof match?.primaryEmail === 'string' && match.primaryEmail.length\n ? match.primaryEmail\n : null\n if (possibleEmail) {\n setValue('customerEmail', possibleEmail)\n } else {\n fetchCustomerEmail(next, match?.kind)\n .then((email) => {\n if (email) setValue('customerEmail', email)\n })\n .catch(() => {})\n }\n }\n }}\n fetchItems={async (query) => {\n const options = await loadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n actionSlot={\n <CustomerQuickCreate\n t={t}\n onCreated={({ id, email, label, kind, subtitle }) => {\n // Seed the search box with the new customer's display name so it renders immediately\n customerQuerySetter.current?.(label)\n setCustomers((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: subtitle ?? undefined,\n kind,\n primaryEmail: email ?? null,\n }\n return [next, ...prev]\n })\n setValue('customerEntityId', id)\n resetAddressFormState(setValue)\n loadAddresses(id).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (email && !values.customerEmail) {\n setValue('customerEmail', email)\n }\n }}\n />\n }\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) => t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })}\n />\n </div>\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n type=\"email\"\n className=\"w-full rounded border pl-8 pr-2 py-2 text-sm\"\n value={emailValue}\n onChange={(event) => setValue('customerEmail', event.target.value)}\n placeholder={t('sales.documents.form.email.placeholder', 'Email used for the document')}\n spellCheck={false}\n />\n </div>\n {duplicate ? (\n <div className=\"flex items-center justify-between rounded border bg-muted px-3 py-2 text-xs text-muted-foreground\">\n <span>\n {t('customers.people.form.emailDuplicateNotice', undefined, { name: duplicate.displayName })}\n </span>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className=\"px-4\"\n type=\"button\"\n disabled={values.customerEntityId === duplicate.id}\n aria-disabled={values.customerEntityId === duplicate.id}\n onClick={() => {\n setValue('customerEntityId', duplicate.id)\n resetAddressFormState(setValue)\n loadAddresses(duplicate.id)\n }}\n >\n {values.customerEntityId === duplicate.id\n ? t('sales.documents.form.email.alreadySelected', 'Selected customer')\n : t('sales.documents.form.email.selectCustomer', 'Select customer')}\n </Button>\n </div>\n ) : null}\n {!duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.form.emailChecking')}</p>\n ) : null}\n </div>\n </div>\n )\n },\n },\n { id: 'channels-comments', title: '', column: 1, fields: ['channelId', 'comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'shipping', title: '', column: 2, fields: ['shippingAddressSection'] },\n { id: 'billing', title: '', column: 2, fields: ['billingAddressSection'] },\n { id: 'custom', title: t('sales.documents.form.customFields', 'Custom fields'), column: 2, kind: 'customFields' },\n ], [\n customers,\n fetchCustomerEmail,\n loadAddresses,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const initialValues = React.useMemo<Partial<SalesDocumentFormValues>>(\n () => ({\n documentKind: initialKind === 'order' ? 'order' : 'quote',\n documentNumber: '',\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n channelId: inboxPreFill?.channelId || undefined,\n customerEntityId: inboxPreFill?.customerEntityId || undefined,\n comments: inboxPreFill?.comments || undefined,\n useCustomShipping: false,\n useCustomBilling: false,\n sameAsShipping: true,\n }),\n [initialKind, inboxPreFill, defaultCurrency]\n )\n\n // When inboxPreFill provides a customer, load their addresses on mount\n React.useEffect(() => {\n if (inboxPreFill?.customerEntityId) {\n loadAddresses(inboxPreFill.customerEntityId)\n }\n }, [inboxPreFill?.customerEntityId, loadAddresses])\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const safeValues = values ?? {}\n const customFields = collectCustomFieldValues(safeValues)\n const base = Object.fromEntries(\n Object.entries(safeValues).filter(([key]) => !key.startsWith('cf_') && !key.startsWith('cf:'))\n ) as SalesDocumentFormValues\n const documentKind: DocumentKind = base.documentKind === 'order' ? 'order' : 'quote'\n const payload: Record<string, unknown> = {\n currencyCode: typeof base.currencyCode === 'string' && base.currencyCode.trim().length\n ? base.currencyCode.trim().toUpperCase()\n : undefined,\n customerEntityId: base.customerEntityId || undefined,\n comments: base.comments ?? undefined,\n metadata: base.customerEmail ? { customerEmail: base.customerEmail } : undefined,\n }\n payload.channelId = base.channelId || undefined\n const documentNumber = typeof base.documentNumber === 'string' ? base.documentNumber.trim() : ''\n if (!documentNumber) {\n throw createCrudFormError(t('sales.documents.form.errors.numberRequired', 'Document number is required.'))\n }\n if (documentKind === 'order') {\n payload.orderNumber = documentNumber\n } else {\n payload.quoteNumber = documentNumber\n }\n const shippingSnapshot = base.useCustomShipping ? normalizeAddressDraft(base.shippingAddressDraft) : null\n let billingSnapshot = base.useCustomBilling ? normalizeAddressDraft(base.billingAddressDraft) : null\n const sameAsShipping = base.sameAsShipping !== false\n if (sameAsShipping) {\n if (shippingSnapshot) {\n billingSnapshot = shippingSnapshot\n } else if (!base.useCustomShipping) {\n payload.billingAddressId = base.shippingAddressId || undefined\n }\n }\n if (shippingSnapshot) {\n payload.shippingAddressSnapshot = shippingSnapshot\n payload.shippingAddressId = undefined\n }\n if (billingSnapshot) {\n payload.billingAddressSnapshot = billingSnapshot\n payload.billingAddressId = undefined\n }\n if (!base.useCustomShipping) payload.shippingAddressId = base.shippingAddressId || undefined\n if (!base.useCustomBilling && !sameAsShipping) payload.billingAddressId = base.billingAddressId || undefined\n\n try {\n let shippingId = payload.shippingAddressId as string | undefined\n let billingId = payload.billingAddressId as string | undefined\n if (base.customerEntityId && shippingSnapshot && base.saveShippingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: shippingSnapshot.addressLine1 ?? shippingSnapshot.name ?? 'Address',\n name: shippingSnapshot.name ?? undefined,\n addressLine2: shippingSnapshot.addressLine2 ?? undefined,\n buildingNumber: shippingSnapshot.buildingNumber ?? undefined,\n flatNumber: shippingSnapshot.flatNumber ?? undefined,\n city: shippingSnapshot.city ?? undefined,\n region: shippingSnapshot.region ?? undefined,\n postalCode: shippingSnapshot.postalCode ?? undefined,\n country: shippingSnapshot.country ?? undefined,\n purpose: shippingSnapshot.purpose ?? undefined,\n isPrimary: shippingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) shippingId = res.result.id\n }\n if (base.customerEntityId && billingSnapshot && base.saveBillingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: billingSnapshot.addressLine1 ?? billingSnapshot.name ?? 'Address',\n name: billingSnapshot.name ?? undefined,\n addressLine2: billingSnapshot.addressLine2 ?? undefined,\n buildingNumber: billingSnapshot.buildingNumber ?? undefined,\n flatNumber: billingSnapshot.flatNumber ?? undefined,\n city: billingSnapshot.city ?? undefined,\n region: billingSnapshot.region ?? undefined,\n postalCode: billingSnapshot.postalCode ?? undefined,\n country: billingSnapshot.country ?? undefined,\n purpose: billingSnapshot.purpose ?? undefined,\n isPrimary: billingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) billingId = res.result.id\n }\n if (!base.useCustomShipping && shippingId) payload.shippingAddressId = shippingId\n if (!base.useCustomBilling && !sameAsShipping && billingId) payload.billingAddressId = billingId\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const endpoint = documentKind === 'order' ? 'sales/orders' : 'sales/quotes'\n const { result } = await createCrud<{ id?: string; orderId?: string; quoteId?: string }>(endpoint, payload, {\n errorMessage: t('sales.documents.form.errors.submit', 'Failed to create document.'),\n })\n const newId =\n (result && typeof result.id === 'string' && result.id) ||\n (result && typeof result.orderId === 'string' && result.orderId) ||\n (result && typeof result.quoteId === 'string' && result.quoteId) ||\n null\n if (!newId) {\n throw createCrudFormError(t('sales.documents.form.errors.id', 'Document id missing after create.'))\n }\n flash(t('sales.documents.form.success', 'Sales document created.'), 'success')\n onCreated({ id: newId, kind: documentKind })\n } catch (err) {\n if (err instanceof Error) throw err\n throw createCrudFormError(t('sales.documents.form.errors.submit', 'Failed to create document.'))\n }\n },\n [onCreated, t],\n )\n\n const cancelHref = initialKind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n\n return (\n <CrudForm<SalesDocumentFormValues>\n title={t('sales.documents.form.title', 'Create sales document')}\n backHref={cancelHref}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n entityIds={[E.sales.sales_quote, E.sales.sales_order]}\n submitLabel={t('sales.documents.form.submit', 'Create')}\n cancelHref={cancelHref}\n onSubmit={handleSubmit}\n />\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["item"]
7
7
  }
@@ -98,7 +98,7 @@ const SalesNewOrdersWidget = ({
98
98
  type: "number",
99
99
  min: 1,
100
100
  max: 20,
101
- className: "w-24 rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary",
101
+ className: "w-24 rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
102
102
  value: hydrated.pageSize,
103
103
  onChange: (event) => {
104
104
  const next = Number(event.target.value);
@@ -119,7 +119,7 @@ const SalesNewOrdersWidget = ({
119
119
  onChange: (event) => {
120
120
  onSettingsChange?.({ ...hydrated, datePeriod: event.target.value });
121
121
  },
122
- className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary",
122
+ className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
123
123
  children: [
124
124
  /* @__PURE__ */ jsx("option", { value: "last24h", children: translate("sales.widgets.newOrders.settings.last24h", "Last 24 hours") }),
125
125
  /* @__PURE__ */ jsx("option", { value: "last7d", children: translate("sales.widgets.newOrders.settings.last7d", "Last 7 days") }),
@@ -143,7 +143,7 @@ const SalesNewOrdersWidget = ({
143
143
  },
144
144
  onFocus: openNativeDatePicker,
145
145
  onClick: openNativeDatePicker,
146
- className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary"
146
+ className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
147
147
  }
148
148
  )
149
149
  ] }),
@@ -160,7 +160,7 @@ const SalesNewOrdersWidget = ({
160
160
  },
161
161
  onFocus: openNativeDatePicker,
162
162
  onClick: openNativeDatePicker,
163
- className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary"
163
+ className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
164
164
  }
165
165
  )
166
166
  ] })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx"],
4
- "sourcesContent": ["\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport Link from 'next/link'\r\nimport type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'\r\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\r\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\r\nimport { Badge } from '@open-mercato/ui/primitives/badge'\r\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\r\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\r\nimport { DEFAULT_SETTINGS, hydrateSalesNewOrdersSettings, type DatePeriodOption, type SalesNewOrdersSettings } from './config'\r\nimport { readString, toDateInputValue, openNativeDatePicker, formatAmount } from '../shared'\r\n\r\ntype NewOrderItem = {\r\n id: string\r\n orderNumber: string\r\n status: string | null\r\n customerName: string | null\r\n customerEntityId: string | null\r\n netAmount: string\r\n grossAmount: string\r\n currency: string | null\r\n createdAt: string\r\n}\r\n\r\ntype NewOrdersApiPayload = {\r\n items?: unknown[]\r\n error?: string\r\n}\r\n\r\nfunction parseNewOrderItems(payload: NewOrdersApiPayload | null): NewOrderItem[] {\r\n const rawItems = Array.isArray(payload?.items) ? payload?.items : []\r\n return rawItems\r\n .map((item) => {\r\n if (!item || typeof item !== 'object') return null\r\n const data = item as Record<string, unknown>\r\n const id = readString(data.id)\r\n const orderNumber = readString(data.orderNumber)\r\n const createdAt = readString(data.createdAt)\r\n if (!id || !orderNumber || !createdAt) return null\r\n return {\r\n id,\r\n orderNumber,\r\n status: readString(data.status),\r\n customerName: readString(data.customerName),\r\n customerEntityId: readString(data.customerEntityId),\r\n netAmount: readString(data.netAmount) ?? '0',\r\n grossAmount: readString(data.grossAmount) ?? '0',\r\n currency: readString(data.currency),\r\n createdAt,\r\n }\r\n })\r\n .filter((item): item is NewOrderItem => !!item)\r\n}\r\n\r\nasync function loadNewOrders(settings: SalesNewOrdersSettings): Promise<NewOrderItem[]> {\r\n const params = new URLSearchParams({\r\n limit: String(settings.pageSize),\r\n datePeriod: settings.datePeriod,\r\n })\r\n if (settings.datePeriod === 'custom') {\r\n if (settings.customFrom) params.set('customFrom', settings.customFrom)\r\n if (settings.customTo) params.set('customTo', settings.customTo)\r\n }\r\n\r\n const call = await apiCall<NewOrdersApiPayload>(`/api/sales/dashboard/widgets/new-orders?${params.toString()}`)\r\n if (!call.ok) {\r\n const message =\r\n typeof (call.result as Record<string, unknown> | null)?.error === 'string'\r\n ? ((call.result as Record<string, unknown>).error as string)\r\n : `Request failed with status ${call.status}`\r\n throw new Error(message)\r\n }\r\n return parseNewOrderItems(call.result ?? null)\r\n}\r\n\r\nfunction resolveDetailHref(item: NewOrderItem): string | null {\r\n return item.id ? `/backend/sales/orders/${encodeURIComponent(item.id)}` : null\r\n}\r\n\r\n\r\nconst SalesNewOrdersWidget: React.FC<DashboardWidgetComponentProps<SalesNewOrdersSettings>> = ({\r\n mode,\r\n settings = DEFAULT_SETTINGS,\r\n onSettingsChange,\r\n refreshToken,\r\n onRefreshStateChange,\r\n}) => {\r\n const translate = useT()\r\n const hydrated = React.useMemo(() => hydrateSalesNewOrdersSettings(settings), [settings])\r\n const [items, setItems] = React.useState<NewOrderItem[]>([])\r\n const [loading, setLoading] = React.useState(true)\r\n const [error, setError] = React.useState<string | null>(null)\r\n const [locale, setLocale] = React.useState<string | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n if (typeof navigator !== 'undefined') {\r\n setLocale(navigator.language)\r\n }\r\n }, [])\r\n\r\n const refresh = React.useCallback(async () => {\r\n onRefreshStateChange?.(true)\r\n setLoading(true)\r\n setError(null)\r\n try {\r\n const data = await loadNewOrders(hydrated)\r\n setItems(data)\r\n } catch (err) {\r\n console.error('Failed to load new orders widget data', err)\r\n setError(translate('sales.widgets.newOrders.error', 'Failed to load orders'))\r\n } finally {\r\n setLoading(false)\r\n onRefreshStateChange?.(false)\r\n }\r\n }, [hydrated, onRefreshStateChange, translate])\r\n\r\n React.useEffect(() => {\r\n refresh().catch(() => {})\r\n }, [refresh, refreshToken])\r\n\r\n if (mode === 'settings') {\r\n return (\r\n <div className=\"space-y-4 text-sm\">\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-page-size\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.pageSize', 'Number of Orders')}\r\n </label>\r\n <input\r\n id=\"sales-new-orders-page-size\"\r\n type=\"number\"\r\n min={1}\r\n max={20}\r\n className=\"w-24 rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary\"\r\n value={hydrated.pageSize}\r\n onChange={(event) => {\r\n const next = Number(event.target.value)\r\n if (!Number.isFinite(next)) return\r\n const clamped = Math.min(20, Math.max(1, Math.floor(next)))\r\n onSettingsChange?.({ ...hydrated, pageSize: clamped })\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-date-period\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.datePeriod', 'Date Period')}\r\n </label>\r\n <select\r\n id=\"sales-new-orders-date-period\"\r\n value={hydrated.datePeriod}\r\n onChange={(event) => {\r\n onSettingsChange?.({ ...hydrated, datePeriod: event.target.value as DatePeriodOption })\r\n }}\r\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary\"\r\n >\r\n <option value=\"last24h\">{translate('sales.widgets.newOrders.settings.last24h', 'Last 24 hours')}</option>\r\n <option value=\"last7d\">{translate('sales.widgets.newOrders.settings.last7d', 'Last 7 days')}</option>\r\n <option value=\"last30d\">{translate('sales.widgets.newOrders.settings.last30d', 'Last 30 days')}</option>\r\n <option value=\"custom\">{translate('sales.widgets.newOrders.settings.custom', 'Custom range')}</option>\r\n </select>\r\n </div>\r\n\r\n {hydrated.datePeriod === 'custom' ? (\r\n <div className=\"grid gap-3\">\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-custom-from\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.customFrom', 'From')}\r\n </label>\r\n <input\r\n id=\"sales-new-orders-custom-from\"\r\n type=\"date\"\r\n value={toDateInputValue(hydrated.customFrom)}\r\n onChange={(event) => {\r\n onSettingsChange?.({ ...hydrated, customFrom: event.target.value })\r\n }}\r\n onFocus={openNativeDatePicker}\r\n onClick={openNativeDatePicker}\r\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary\"\r\n />\r\n </div>\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-custom-to\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.customTo', 'To')}\r\n </label>\r\n <input\r\n id=\"sales-new-orders-custom-to\"\r\n type=\"date\"\r\n value={toDateInputValue(hydrated.customTo)}\r\n onChange={(event) => {\r\n onSettingsChange?.({ ...hydrated, customTo: event.target.value })\r\n }}\r\n onFocus={openNativeDatePicker}\r\n onClick={openNativeDatePicker}\r\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary\"\r\n />\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n }\r\n\r\n if (error) {\r\n return <p className=\"text-sm text-destructive\">{error}</p>\r\n }\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-32 items-center justify-center\">\r\n <Spinner className=\"h-6 w-6 text-muted-foreground\" />\r\n </div>\r\n )\r\n }\r\n\r\n if (!items.length) {\r\n return <p className=\"text-sm text-muted-foreground\">{translate('sales.widgets.newOrders.empty', 'No orders found')}</p>\r\n }\r\n\r\n return (\r\n <ul className=\"space-y-3\">\r\n {items.map((item) => {\r\n const detailHref = resolveDetailHref(item)\r\n const amountLabel = formatAmount(item.grossAmount, item.currency, locale)\r\n const createdLabel = formatRelativeTime(item.createdAt) ?? ''\r\n return (\r\n <li key={item.id} className=\"rounded-md border p-3\">\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {detailHref ? (\r\n <Link href={detailHref} className=\"text-sm font-semibold text-foreground hover:underline\">\r\n {item.orderNumber}\r\n </Link>\r\n ) : (\r\n <span className=\"text-sm font-semibold text-foreground\">{item.orderNumber}</span>\r\n )}\r\n {item.status ? (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {item.status}\r\n </Badge>\r\n ) : null}\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {item.customerName ?? translate('sales.widgets.newOrders.noCustomer', 'No customer')}\r\n </p>\r\n <p className=\"text-xs text-muted-foreground\">{createdLabel}</p>\r\n </div>\r\n <div className=\"text-right\">\r\n <p className=\"text-sm font-semibold\">{amountLabel}</p>\r\n </div>\r\n </div>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n}\r\n\r\nexport default SalesNewOrdersWidget\r\n"],
4
+ "sourcesContent": ["\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport Link from 'next/link'\r\nimport type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'\r\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\r\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\r\nimport { Badge } from '@open-mercato/ui/primitives/badge'\r\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\r\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\r\nimport { DEFAULT_SETTINGS, hydrateSalesNewOrdersSettings, type DatePeriodOption, type SalesNewOrdersSettings } from './config'\r\nimport { readString, toDateInputValue, openNativeDatePicker, formatAmount } from '../shared'\r\n\r\ntype NewOrderItem = {\r\n id: string\r\n orderNumber: string\r\n status: string | null\r\n customerName: string | null\r\n customerEntityId: string | null\r\n netAmount: string\r\n grossAmount: string\r\n currency: string | null\r\n createdAt: string\r\n}\r\n\r\ntype NewOrdersApiPayload = {\r\n items?: unknown[]\r\n error?: string\r\n}\r\n\r\nfunction parseNewOrderItems(payload: NewOrdersApiPayload | null): NewOrderItem[] {\r\n const rawItems = Array.isArray(payload?.items) ? payload?.items : []\r\n return rawItems\r\n .map((item) => {\r\n if (!item || typeof item !== 'object') return null\r\n const data = item as Record<string, unknown>\r\n const id = readString(data.id)\r\n const orderNumber = readString(data.orderNumber)\r\n const createdAt = readString(data.createdAt)\r\n if (!id || !orderNumber || !createdAt) return null\r\n return {\r\n id,\r\n orderNumber,\r\n status: readString(data.status),\r\n customerName: readString(data.customerName),\r\n customerEntityId: readString(data.customerEntityId),\r\n netAmount: readString(data.netAmount) ?? '0',\r\n grossAmount: readString(data.grossAmount) ?? '0',\r\n currency: readString(data.currency),\r\n createdAt,\r\n }\r\n })\r\n .filter((item): item is NewOrderItem => !!item)\r\n}\r\n\r\nasync function loadNewOrders(settings: SalesNewOrdersSettings): Promise<NewOrderItem[]> {\r\n const params = new URLSearchParams({\r\n limit: String(settings.pageSize),\r\n datePeriod: settings.datePeriod,\r\n })\r\n if (settings.datePeriod === 'custom') {\r\n if (settings.customFrom) params.set('customFrom', settings.customFrom)\r\n if (settings.customTo) params.set('customTo', settings.customTo)\r\n }\r\n\r\n const call = await apiCall<NewOrdersApiPayload>(`/api/sales/dashboard/widgets/new-orders?${params.toString()}`)\r\n if (!call.ok) {\r\n const message =\r\n typeof (call.result as Record<string, unknown> | null)?.error === 'string'\r\n ? ((call.result as Record<string, unknown>).error as string)\r\n : `Request failed with status ${call.status}`\r\n throw new Error(message)\r\n }\r\n return parseNewOrderItems(call.result ?? null)\r\n}\r\n\r\nfunction resolveDetailHref(item: NewOrderItem): string | null {\r\n return item.id ? `/backend/sales/orders/${encodeURIComponent(item.id)}` : null\r\n}\r\n\r\n\r\nconst SalesNewOrdersWidget: React.FC<DashboardWidgetComponentProps<SalesNewOrdersSettings>> = ({\r\n mode,\r\n settings = DEFAULT_SETTINGS,\r\n onSettingsChange,\r\n refreshToken,\r\n onRefreshStateChange,\r\n}) => {\r\n const translate = useT()\r\n const hydrated = React.useMemo(() => hydrateSalesNewOrdersSettings(settings), [settings])\r\n const [items, setItems] = React.useState<NewOrderItem[]>([])\r\n const [loading, setLoading] = React.useState(true)\r\n const [error, setError] = React.useState<string | null>(null)\r\n const [locale, setLocale] = React.useState<string | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n if (typeof navigator !== 'undefined') {\r\n setLocale(navigator.language)\r\n }\r\n }, [])\r\n\r\n const refresh = React.useCallback(async () => {\r\n onRefreshStateChange?.(true)\r\n setLoading(true)\r\n setError(null)\r\n try {\r\n const data = await loadNewOrders(hydrated)\r\n setItems(data)\r\n } catch (err) {\r\n console.error('Failed to load new orders widget data', err)\r\n setError(translate('sales.widgets.newOrders.error', 'Failed to load orders'))\r\n } finally {\r\n setLoading(false)\r\n onRefreshStateChange?.(false)\r\n }\r\n }, [hydrated, onRefreshStateChange, translate])\r\n\r\n React.useEffect(() => {\r\n refresh().catch(() => {})\r\n }, [refresh, refreshToken])\r\n\r\n if (mode === 'settings') {\r\n return (\r\n <div className=\"space-y-4 text-sm\">\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-page-size\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.pageSize', 'Number of Orders')}\r\n </label>\r\n <input\r\n id=\"sales-new-orders-page-size\"\r\n type=\"number\"\r\n min={1}\r\n max={20}\r\n className=\"w-24 rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n value={hydrated.pageSize}\r\n onChange={(event) => {\r\n const next = Number(event.target.value)\r\n if (!Number.isFinite(next)) return\r\n const clamped = Math.min(20, Math.max(1, Math.floor(next)))\r\n onSettingsChange?.({ ...hydrated, pageSize: clamped })\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-date-period\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.datePeriod', 'Date Period')}\r\n </label>\r\n <select\r\n id=\"sales-new-orders-date-period\"\r\n value={hydrated.datePeriod}\r\n onChange={(event) => {\r\n onSettingsChange?.({ ...hydrated, datePeriod: event.target.value as DatePeriodOption })\r\n }}\r\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n >\r\n <option value=\"last24h\">{translate('sales.widgets.newOrders.settings.last24h', 'Last 24 hours')}</option>\r\n <option value=\"last7d\">{translate('sales.widgets.newOrders.settings.last7d', 'Last 7 days')}</option>\r\n <option value=\"last30d\">{translate('sales.widgets.newOrders.settings.last30d', 'Last 30 days')}</option>\r\n <option value=\"custom\">{translate('sales.widgets.newOrders.settings.custom', 'Custom range')}</option>\r\n </select>\r\n </div>\r\n\r\n {hydrated.datePeriod === 'custom' ? (\r\n <div className=\"grid gap-3\">\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-custom-from\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.customFrom', 'From')}\r\n </label>\r\n <input\r\n id=\"sales-new-orders-custom-from\"\r\n type=\"date\"\r\n value={toDateInputValue(hydrated.customFrom)}\r\n onChange={(event) => {\r\n onSettingsChange?.({ ...hydrated, customFrom: event.target.value })\r\n }}\r\n onFocus={openNativeDatePicker}\r\n onClick={openNativeDatePicker}\r\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n />\r\n </div>\r\n <div className=\"space-y-1.5\">\r\n <label htmlFor=\"sales-new-orders-custom-to\" className=\"text-xs font-semibold uppercase text-muted-foreground\">\r\n {translate('sales.widgets.newOrders.settings.customTo', 'To')}\r\n </label>\r\n <input\r\n id=\"sales-new-orders-custom-to\"\r\n type=\"date\"\r\n value={toDateInputValue(hydrated.customTo)}\r\n onChange={(event) => {\r\n onSettingsChange?.({ ...hydrated, customTo: event.target.value })\r\n }}\r\n onFocus={openNativeDatePicker}\r\n onClick={openNativeDatePicker}\r\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n />\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n }\r\n\r\n if (error) {\r\n return <p className=\"text-sm text-destructive\">{error}</p>\r\n }\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-32 items-center justify-center\">\r\n <Spinner className=\"h-6 w-6 text-muted-foreground\" />\r\n </div>\r\n )\r\n }\r\n\r\n if (!items.length) {\r\n return <p className=\"text-sm text-muted-foreground\">{translate('sales.widgets.newOrders.empty', 'No orders found')}</p>\r\n }\r\n\r\n return (\r\n <ul className=\"space-y-3\">\r\n {items.map((item) => {\r\n const detailHref = resolveDetailHref(item)\r\n const amountLabel = formatAmount(item.grossAmount, item.currency, locale)\r\n const createdLabel = formatRelativeTime(item.createdAt) ?? ''\r\n return (\r\n <li key={item.id} className=\"rounded-md border p-3\">\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {detailHref ? (\r\n <Link href={detailHref} className=\"text-sm font-semibold text-foreground hover:underline\">\r\n {item.orderNumber}\r\n </Link>\r\n ) : (\r\n <span className=\"text-sm font-semibold text-foreground\">{item.orderNumber}</span>\r\n )}\r\n {item.status ? (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {item.status}\r\n </Badge>\r\n ) : null}\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {item.customerName ?? translate('sales.widgets.newOrders.noCustomer', 'No customer')}\r\n </p>\r\n <p className=\"text-xs text-muted-foreground\">{createdLabel}</p>\r\n </div>\r\n <div className=\"text-right\">\r\n <p className=\"text-sm font-semibold\">{amountLabel}</p>\r\n </div>\r\n </div>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n}\r\n\r\nexport default SalesNewOrdersWidget\r\n"],
5
5
  "mappings": ";AA4HQ,SACE,KADF;AA1HR,YAAY,WAAW;AACvB,OAAO,UAAU;AAEjB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,0BAA0B;AACnC,SAAS,YAAY;AACrB,SAAS,kBAAkB,qCAAyF;AACpH,SAAS,YAAY,kBAAkB,sBAAsB,oBAAoB;AAmBjF,SAAS,mBAAmB,SAAqD;AAC/E,QAAM,WAAW,MAAM,QAAQ,SAAS,KAAK,IAAI,SAAS,QAAQ,CAAC;AACnE,SAAO,SACJ,IAAI,CAAC,SAAS;AACb,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,UAAM,OAAO;AACb,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,UAAM,cAAc,WAAW,KAAK,WAAW;AAC/C,UAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAW,QAAO;AAC9C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,KAAK,MAAM;AAAA,MAC9B,cAAc,WAAW,KAAK,YAAY;AAAA,MAC1C,kBAAkB,WAAW,KAAK,gBAAgB;AAAA,MAClD,WAAW,WAAW,KAAK,SAAS,KAAK;AAAA,MACzC,aAAa,WAAW,KAAK,WAAW,KAAK;AAAA,MAC7C,UAAU,WAAW,KAAK,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAA+B,CAAC,CAAC,IAAI;AAClD;AAEA,eAAe,cAAc,UAA2D;AACtF,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,OAAO,OAAO,SAAS,QAAQ;AAAA,IAC/B,YAAY,SAAS;AAAA,EACvB,CAAC;AACD,MAAI,SAAS,eAAe,UAAU;AACpC,QAAI,SAAS,WAAY,QAAO,IAAI,cAAc,SAAS,UAAU;AACrE,QAAI,SAAS,SAAU,QAAO,IAAI,YAAY,SAAS,QAAQ;AAAA,EACjE;AAEA,QAAM,OAAO,MAAM,QAA6B,2CAA2C,OAAO,SAAS,CAAC,EAAE;AAC9G,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,UACJ,OAAQ,KAAK,QAA2C,UAAU,WAC5D,KAAK,OAAmC,QAC1C,8BAA8B,KAAK,MAAM;AAC/C,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,SAAO,mBAAmB,KAAK,UAAU,IAAI;AAC/C;AAEA,SAAS,kBAAkB,MAAmC;AAC5D,SAAO,KAAK,KAAK,yBAAyB,mBAAmB,KAAK,EAAE,CAAC,KAAK;AAC5E;AAGA,MAAM,uBAAwF,CAAC;AAAA,EAC7F;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,KAAK;AACvB,QAAM,WAAW,MAAM,QAAQ,MAAM,8BAA8B,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACxF,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAyB,CAAC,CAAC;AAC3D,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,IAAI;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAwB,IAAI;AAC5D,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAA6B,MAAS;AAExE,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO,cAAc,aAAa;AACpC,gBAAU,UAAU,QAAQ;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,MAAM,YAAY,YAAY;AAC5C,2BAAuB,IAAI;AAC3B,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,MAAM,cAAc,QAAQ;AACzC,eAAS,IAAI;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,MAAM,yCAAyC,GAAG;AAC1D,eAAS,UAAU,iCAAiC,uBAAuB,CAAC;AAAA,IAC9E,UAAE;AACA,iBAAW,KAAK;AAChB,6BAAuB,KAAK;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,UAAU,sBAAsB,SAAS,CAAC;AAE9C,QAAM,UAAU,MAAM;AACpB,YAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1B,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,MAAI,SAAS,YAAY;AACvB,WACE,qBAAC,SAAI,WAAU,qBACb;AAAA,2BAAC,SAAI,WAAU,eACb;AAAA,4BAAC,WAAM,SAAQ,8BAA6B,WAAU,yDACnD,oBAAU,6CAA6C,kBAAkB,GAC5E;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,UAAU;AACnB,oBAAM,OAAO,OAAO,MAAM,OAAO,KAAK;AACtC,kBAAI,CAAC,OAAO,SAAS,IAAI,EAAG;AAC5B,oBAAM,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;AAC1D,iCAAmB,EAAE,GAAG,UAAU,UAAU,QAAQ,CAAC;AAAA,YACvD;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,eACb;AAAA,4BAAC,WAAM,SAAQ,gCAA+B,WAAU,yDACrD,oBAAU,+CAA+C,aAAa,GACzE;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,UAAU;AACnB,iCAAmB,EAAE,GAAG,UAAU,YAAY,MAAM,OAAO,MAA0B,CAAC;AAAA,YACxF;AAAA,YACA,WAAU;AAAA,YAEV;AAAA,kCAAC,YAAO,OAAM,WAAW,oBAAU,4CAA4C,eAAe,GAAE;AAAA,cAChG,oBAAC,YAAO,OAAM,UAAU,oBAAU,2CAA2C,aAAa,GAAE;AAAA,cAC5F,oBAAC,YAAO,OAAM,WAAW,oBAAU,4CAA4C,cAAc,GAAE;AAAA,cAC/F,oBAAC,YAAO,OAAM,UAAU,oBAAU,2CAA2C,cAAc,GAAE;AAAA;AAAA;AAAA,QAC/F;AAAA,SACF;AAAA,MAEC,SAAS,eAAe,WACvB,qBAAC,SAAI,WAAU,cACb;AAAA,6BAAC,SAAI,WAAU,eACb;AAAA,8BAAC,WAAM,SAAQ,gCAA+B,WAAU,yDACrD,oBAAU,+CAA+C,MAAM,GAClE;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO,iBAAiB,SAAS,UAAU;AAAA,cAC3C,UAAU,CAAC,UAAU;AACnB,mCAAmB,EAAE,GAAG,UAAU,YAAY,MAAM,OAAO,MAAM,CAAC;AAAA,cACpE;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,cACT,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,eACb;AAAA,8BAAC,WAAM,SAAQ,8BAA6B,WAAU,yDACnD,oBAAU,6CAA6C,IAAI,GAC9D;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO,iBAAiB,SAAS,QAAQ;AAAA,cACzC,UAAU,CAAC,UAAU;AACnB,mCAAmB,EAAE,GAAG,UAAU,UAAU,MAAM,OAAO,MAAM,CAAC;AAAA,cAClE;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,cACT,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF,IACE;AAAA,OACN;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WAAO,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,EACxD;AAEA,MAAI,SAAS;AACX,WACE,oBAAC,SAAI,WAAU,yCACb,8BAAC,WAAQ,WAAU,iCAAgC,GACrD;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO,oBAAC,OAAE,WAAU,iCAAiC,oBAAU,iCAAiC,iBAAiB,GAAE;AAAA,EACrH;AAEA,SACE,oBAAC,QAAG,WAAU,aACX,gBAAM,IAAI,CAAC,SAAS;AACnB,UAAM,aAAa,kBAAkB,IAAI;AACzC,UAAM,cAAc,aAAa,KAAK,aAAa,KAAK,UAAU,MAAM;AACxE,UAAM,eAAe,mBAAmB,KAAK,SAAS,KAAK;AAC3D,WACE,oBAAC,QAAiB,WAAU,yBAC1B,+BAAC,SAAI,WAAU,0CACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,2BACZ;AAAA,uBACC,oBAAC,QAAK,MAAM,YAAY,WAAU,yDAC/B,eAAK,aACR,IAEA,oBAAC,UAAK,WAAU,yCAAyC,eAAK,aAAY;AAAA,UAE3E,KAAK,SACJ,oBAAC,SAAM,SAAQ,WAAU,WAAU,WAChC,eAAK,QACR,IACE;AAAA,WACN;AAAA,QACA,oBAAC,OAAE,WAAU,iCACV,eAAK,gBAAgB,UAAU,sCAAsC,aAAa,GACrF;AAAA,QACA,oBAAC,OAAE,WAAU,iCAAiC,wBAAa;AAAA,SAC7D;AAAA,MACA,oBAAC,SAAI,WAAU,cACb,8BAAC,OAAE,WAAU,yBAAyB,uBAAY,GACpD;AAAA,OACF,KAzBO,KAAK,EA0Bd;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,IAAO,wBAAQ;",
6
6
  "names": []
7
7
  }