@open-mercato/core 0.4.2-canary-15c0b23a3a → 0.4.2-canary-da2b080494

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 (433) hide show
  1. package/dist/generated/entities.ids.generated.js +1 -5
  2. package/dist/generated/entities.ids.generated.js.map +2 -2
  3. package/dist/generated/entity-fields-registry.js +0 -2
  4. package/dist/generated/entity-fields-registry.js.map +2 -2
  5. package/dist/modules/api_docs/frontend/docs/api/page.js +2 -3
  6. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  7. package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
  8. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  9. package/dist/modules/attachments/components/AttachmentLibrary.js +0 -4
  10. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  11. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
  12. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  13. package/dist/modules/auth/api/admin/nav.js +3 -4
  14. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  15. package/dist/modules/auth/api/reset/confirm.js +2 -25
  16. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  17. package/dist/modules/auth/api/reset.js +0 -23
  18. package/dist/modules/auth/api/reset.js.map +2 -2
  19. package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
  20. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  21. package/dist/modules/auth/api/users/route.js +2 -4
  22. package/dist/modules/auth/api/users/route.js.map +2 -2
  23. package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
  24. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  25. package/dist/modules/auth/backend/roles/page.js +3 -3
  26. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  27. package/dist/modules/auth/backend/users/[id]/edit/page.js +3 -18
  28. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  29. package/dist/modules/auth/backend/users/create/page.js +2 -15
  30. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  31. package/dist/modules/auth/backend/users/page.js +3 -3
  32. package/dist/modules/auth/backend/users/page.js.map +2 -2
  33. package/dist/modules/auth/cli.js +11 -25
  34. package/dist/modules/auth/cli.js.map +2 -2
  35. package/dist/modules/auth/commands/users.js +2 -59
  36. package/dist/modules/auth/commands/users.js.map +2 -2
  37. package/dist/modules/auth/data/validators.js +2 -4
  38. package/dist/modules/auth/data/validators.js.map +2 -2
  39. package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
  40. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  41. package/dist/modules/auth/lib/setup-app.js +0 -1
  42. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  43. package/dist/modules/auth/services/authService.js +3 -3
  44. package/dist/modules/auth/services/authService.js.map +2 -2
  45. package/dist/modules/business_rules/api/execute/route.js +1 -7
  46. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  47. package/dist/modules/business_rules/backend/rules/page.js +0 -4
  48. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  49. package/dist/modules/business_rules/backend/sets/page.js +0 -3
  50. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  51. package/dist/modules/business_rules/lib/rule-engine.js +3 -33
  52. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  53. package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
  54. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  55. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  56. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  57. package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
  58. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  59. package/dist/modules/configs/cli.js +0 -6
  60. package/dist/modules/configs/cli.js.map +2 -2
  61. package/dist/modules/configs/components/CachePanel.js +4 -4
  62. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  63. package/dist/modules/configs/lib/system-status.js +1 -48
  64. package/dist/modules/configs/lib/system-status.js.map +2 -2
  65. package/dist/modules/configs/lib/upgrade-actions.js +0 -18
  66. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  67. package/dist/modules/currencies/backend/currencies/page.js +0 -3
  68. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  69. package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
  70. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  71. package/dist/modules/customers/backend/customers/companies/page.js +0 -3
  72. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  73. package/dist/modules/customers/backend/customers/deals/page.js +0 -3
  74. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  75. package/dist/modules/customers/backend/customers/people/page.js +0 -3
  76. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  77. package/dist/modules/customers/commands/deals.js +0 -31
  78. package/dist/modules/customers/commands/deals.js.map +2 -2
  79. package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
  80. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  81. package/dist/modules/dashboards/cli.js +5 -44
  82. package/dist/modules/dashboards/cli.js.map +2 -2
  83. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
  84. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  85. package/dist/modules/dashboards/services/widgetDataService.js +3 -132
  86. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  87. package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
  88. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  89. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  90. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  91. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  92. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  93. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  94. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  95. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  96. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  97. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  98. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  99. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  100. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  101. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  102. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  103. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  104. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  105. package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
  106. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  107. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  108. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  109. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  110. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  111. package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
  112. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  113. package/dist/modules/sales/backend/sales/channels/page.js +0 -2
  114. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  115. package/dist/modules/sales/commands/documents.js +0 -53
  116. package/dist/modules/sales/commands/documents.js.map +2 -2
  117. package/dist/modules/sales/commands/payments.js +0 -26
  118. package/dist/modules/sales/commands/payments.js.map +2 -2
  119. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  120. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  121. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  122. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  123. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  124. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  125. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  126. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  127. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
  128. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  129. package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
  130. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  131. package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
  132. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  133. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
  134. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  135. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  136. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  137. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  138. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  139. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  140. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  141. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  142. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  143. package/dist/modules/staff/commands/leave-requests.js +0 -79
  144. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  145. package/dist/modules/workflows/backend/definitions/page.js +0 -5
  146. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  147. package/dist/modules/workflows/backend/instances/page.js +0 -3
  148. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  149. package/dist/modules/workflows/backend/tasks/page.js +0 -3
  150. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  151. package/dist/modules/workflows/lib/transition-handler.js +6 -14
  152. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  153. package/generated/entities.ids.generated.ts +1 -5
  154. package/generated/entity-fields-registry.ts +0 -2
  155. package/package.json +2 -2
  156. package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
  157. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  158. package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
  159. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
  160. package/src/modules/auth/README.md +1 -1
  161. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  162. package/src/modules/auth/api/admin/nav.ts +6 -10
  163. package/src/modules/auth/api/reset/confirm.ts +2 -25
  164. package/src/modules/auth/api/reset.ts +0 -23
  165. package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
  166. package/src/modules/auth/api/users/route.ts +2 -5
  167. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
  168. package/src/modules/auth/backend/roles/page.tsx +3 -3
  169. package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
  170. package/src/modules/auth/backend/users/create/page.tsx +2 -19
  171. package/src/modules/auth/backend/users/page.tsx +3 -3
  172. package/src/modules/auth/cli.ts +11 -38
  173. package/src/modules/auth/commands/users.ts +2 -73
  174. package/src/modules/auth/data/validators.ts +2 -5
  175. package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
  176. package/src/modules/auth/i18n/de.json +1 -43
  177. package/src/modules/auth/i18n/en.json +1 -43
  178. package/src/modules/auth/i18n/es.json +1 -43
  179. package/src/modules/auth/i18n/pl.json +1 -43
  180. package/src/modules/auth/lib/setup-app.ts +0 -1
  181. package/src/modules/auth/services/authService.ts +4 -4
  182. package/src/modules/business_rules/api/execute/route.ts +1 -8
  183. package/src/modules/business_rules/backend/rules/page.tsx +0 -4
  184. package/src/modules/business_rules/backend/sets/page.tsx +0 -3
  185. package/src/modules/business_rules/i18n/en.json +1 -3
  186. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
  187. package/src/modules/business_rules/lib/rule-engine.ts +3 -57
  188. package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
  189. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  190. package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
  191. package/src/modules/catalog/i18n/en.json +1 -3
  192. package/src/modules/configs/cli.ts +0 -6
  193. package/src/modules/configs/components/CachePanel.tsx +4 -4
  194. package/src/modules/configs/i18n/en.json +2 -12
  195. package/src/modules/configs/i18n/pl.json +2 -12
  196. package/src/modules/configs/lib/system-status.ts +1 -48
  197. package/src/modules/configs/lib/system-status.types.ts +0 -1
  198. package/src/modules/configs/lib/upgrade-actions.ts +0 -18
  199. package/src/modules/currencies/backend/currencies/page.tsx +0 -3
  200. package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
  201. package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
  202. package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
  203. package/src/modules/customers/backend/customers/people/page.tsx +0 -3
  204. package/src/modules/customers/commands/deals.ts +0 -39
  205. package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
  206. package/src/modules/customers/i18n/en.json +1 -5
  207. package/src/modules/dashboards/cli.ts +5 -55
  208. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
  209. package/src/modules/dashboards/services/widgetDataService.ts +4 -157
  210. package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
  211. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  212. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  213. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  214. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  215. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  216. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
  217. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  218. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  219. package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
  220. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  221. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  222. package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
  223. package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
  224. package/src/modules/sales/commands/documents.ts +0 -65
  225. package/src/modules/sales/commands/payments.ts +0 -33
  226. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  227. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  228. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  229. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  230. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
  231. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
  232. package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
  233. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
  234. package/src/modules/sales/i18n/de.json +0 -20
  235. package/src/modules/sales/i18n/en.json +1 -25
  236. package/src/modules/sales/i18n/es.json +0 -20
  237. package/src/modules/sales/i18n/pl.json +0 -20
  238. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  239. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  240. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  241. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  242. package/src/modules/staff/commands/leave-requests.ts +0 -94
  243. package/src/modules/staff/i18n/de.json +0 -4
  244. package/src/modules/staff/i18n/en.json +1 -9
  245. package/src/modules/staff/i18n/es.json +0 -4
  246. package/src/modules/staff/i18n/pl.json +0 -4
  247. package/src/modules/workflows/backend/definitions/page.tsx +0 -5
  248. package/src/modules/workflows/backend/instances/page.tsx +1 -4
  249. package/src/modules/workflows/backend/tasks/page.tsx +1 -4
  250. package/src/modules/workflows/i18n/en.json +1 -3
  251. package/src/modules/workflows/lib/transition-handler.ts +6 -18
  252. package/dist/generated/entities/notification/index.js +0 -57
  253. package/dist/generated/entities/notification/index.js.map +0 -7
  254. package/dist/modules/auth/api/profile/route.js +0 -157
  255. package/dist/modules/auth/api/profile/route.js.map +0 -7
  256. package/dist/modules/auth/backend/auth/profile/page.js +0 -141
  257. package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
  258. package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
  259. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
  260. package/dist/modules/auth/notifications.js +0 -112
  261. package/dist/modules/auth/notifications.js.map +0 -7
  262. package/dist/modules/business_rules/notifications.js +0 -28
  263. package/dist/modules/business_rules/notifications.js.map +0 -7
  264. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
  265. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
  266. package/dist/modules/catalog/notifications.js +0 -28
  267. package/dist/modules/catalog/notifications.js.map +0 -7
  268. package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
  269. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
  270. package/dist/modules/customers/notifications.js +0 -48
  271. package/dist/modules/customers/notifications.js.map +0 -7
  272. package/dist/modules/dashboards/lib/role-widgets.js +0 -58
  273. package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
  274. package/dist/modules/notifications/acl.js +0 -11
  275. package/dist/modules/notifications/acl.js.map +0 -7
  276. package/dist/modules/notifications/api/[id]/action/route.js +0 -74
  277. package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
  278. package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
  279. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
  280. package/dist/modules/notifications/api/[id]/read/route.js +0 -15
  281. package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
  282. package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
  283. package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
  284. package/dist/modules/notifications/api/batch/route.js +0 -17
  285. package/dist/modules/notifications/api/batch/route.js.map +0 -7
  286. package/dist/modules/notifications/api/feature/route.js +0 -17
  287. package/dist/modules/notifications/api/feature/route.js.map +0 -7
  288. package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
  289. package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
  290. package/dist/modules/notifications/api/openapi.js +0 -76
  291. package/dist/modules/notifications/api/openapi.js.map +0 -7
  292. package/dist/modules/notifications/api/role/route.js +0 -17
  293. package/dist/modules/notifications/api/role/route.js.map +0 -7
  294. package/dist/modules/notifications/api/route.js +0 -85
  295. package/dist/modules/notifications/api/route.js.map +0 -7
  296. package/dist/modules/notifications/api/settings/route.js +0 -155
  297. package/dist/modules/notifications/api/settings/route.js.map +0 -7
  298. package/dist/modules/notifications/api/unread-count/route.js +0 -38
  299. package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
  300. package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
  301. package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
  302. package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
  303. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
  304. package/dist/modules/notifications/cli.js +0 -16
  305. package/dist/modules/notifications/cli.js.map +0 -7
  306. package/dist/modules/notifications/data/entities.js +0 -112
  307. package/dist/modules/notifications/data/entities.js.map +0 -7
  308. package/dist/modules/notifications/data/validators.js +0 -98
  309. package/dist/modules/notifications/data/validators.js.map +0 -7
  310. package/dist/modules/notifications/di.js +0 -13
  311. package/dist/modules/notifications/di.js.map +0 -7
  312. package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
  313. package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
  314. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
  315. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
  316. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
  317. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
  318. package/dist/modules/notifications/index.js +0 -14
  319. package/dist/modules/notifications/index.js.map +0 -7
  320. package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
  321. package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
  322. package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
  323. package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
  324. package/dist/modules/notifications/lib/events.js +0 -12
  325. package/dist/modules/notifications/lib/events.js.map +0 -7
  326. package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
  327. package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
  328. package/dist/modules/notifications/lib/notificationFactory.js +0 -54
  329. package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
  330. package/dist/modules/notifications/lib/notificationMapper.js +0 -34
  331. package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
  332. package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
  333. package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
  334. package/dist/modules/notifications/lib/notificationService.js +0 -279
  335. package/dist/modules/notifications/lib/notificationService.js.map +0 -7
  336. package/dist/modules/notifications/lib/routeHelpers.js +0 -101
  337. package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
  338. package/dist/modules/notifications/lib/safeHref.js +0 -24
  339. package/dist/modules/notifications/lib/safeHref.js.map +0 -7
  340. package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
  341. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
  342. package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
  343. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
  344. package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
  345. package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
  346. package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
  347. package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
  348. package/dist/modules/sales/notifications.client.js +0 -51
  349. package/dist/modules/sales/notifications.client.js.map +0 -7
  350. package/dist/modules/sales/notifications.js +0 -88
  351. package/dist/modules/sales/notifications.js.map +0 -7
  352. package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
  353. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
  354. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
  355. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
  356. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
  357. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
  358. package/dist/modules/sales/widgets/notifications/index.js +0 -7
  359. package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
  360. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
  361. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
  362. package/dist/modules/staff/notifications.js +0 -75
  363. package/dist/modules/staff/notifications.js.map +0 -7
  364. package/dist/modules/workflows/notifications.js +0 -28
  365. package/dist/modules/workflows/notifications.js.map +0 -7
  366. package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
  367. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
  368. package/generated/entities/notification/index.ts +0 -27
  369. package/src/modules/auth/api/profile/route.ts +0 -163
  370. package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
  371. package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
  372. package/src/modules/auth/notifications.ts +0 -109
  373. package/src/modules/business_rules/notifications.ts +0 -25
  374. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
  375. package/src/modules/catalog/notifications.ts +0 -25
  376. package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
  377. package/src/modules/customers/notifications.ts +0 -44
  378. package/src/modules/dashboards/lib/role-widgets.ts +0 -80
  379. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
  380. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  381. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
  382. package/src/modules/notifications/acl.ts +0 -7
  383. package/src/modules/notifications/api/[id]/action/route.ts +0 -75
  384. package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
  385. package/src/modules/notifications/api/[id]/read/route.ts +0 -12
  386. package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
  387. package/src/modules/notifications/api/batch/route.ts +0 -14
  388. package/src/modules/notifications/api/feature/route.ts +0 -14
  389. package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
  390. package/src/modules/notifications/api/openapi.ts +0 -76
  391. package/src/modules/notifications/api/role/route.ts +0 -14
  392. package/src/modules/notifications/api/route.ts +0 -92
  393. package/src/modules/notifications/api/settings/route.ts +0 -157
  394. package/src/modules/notifications/api/unread-count/route.ts +0 -38
  395. package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
  396. package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
  397. package/src/modules/notifications/cli.ts +0 -18
  398. package/src/modules/notifications/data/entities.ts +0 -99
  399. package/src/modules/notifications/data/validators.ts +0 -115
  400. package/src/modules/notifications/di.ts +0 -11
  401. package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
  402. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
  403. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
  404. package/src/modules/notifications/i18n/de.json +0 -50
  405. package/src/modules/notifications/i18n/en.json +0 -50
  406. package/src/modules/notifications/i18n/es.json +0 -50
  407. package/src/modules/notifications/i18n/pl.json +0 -50
  408. package/src/modules/notifications/index.ts +0 -12
  409. package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
  410. package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
  411. package/src/modules/notifications/lib/events.ts +0 -48
  412. package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
  413. package/src/modules/notifications/lib/notificationFactory.ts +0 -76
  414. package/src/modules/notifications/lib/notificationMapper.ts +0 -33
  415. package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
  416. package/src/modules/notifications/lib/notificationService.ts +0 -414
  417. package/src/modules/notifications/lib/routeHelpers.ts +0 -151
  418. package/src/modules/notifications/lib/safeHref.ts +0 -29
  419. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -300
  420. package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
  421. package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
  422. package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
  423. package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
  424. package/src/modules/sales/notifications.client.ts +0 -65
  425. package/src/modules/sales/notifications.ts +0 -82
  426. package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
  427. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
  428. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
  429. package/src/modules/sales/widgets/notifications/index.ts +0 -2
  430. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
  431. package/src/modules/staff/notifications.ts +0 -71
  432. package/src/modules/workflows/notifications.ts +0 -25
  433. package/src/modules/workflows/subscribers/task-assigned-notification.ts +0 -53
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/sales/components/PaymentMethodsSettings.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { CrudForm, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n listPaymentProviders,\n type PaymentProvider,\n type ProviderSettingField,\n} from '../lib/providers'\n\ntype PaymentMethodRow = {\n id: string\n name: string\n code: string\n providerKey: string | null\n providerLabel: string | null\n description: string | null\n terms: string | null\n isActive: boolean\n updatedAt: string | null\n providerSettings: Record<string, unknown> | null\n}\n\ntype DialogState =\n | { mode: 'create' }\n | { mode: 'edit'; entry: PaymentMethodRow }\n\nconst paymentFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n providerKey: z.string().trim().optional(),\n description: z.string().optional(),\n terms: z.string().optional(),\n isActive: z.boolean().optional(),\n providerSettings: z.record(z.string(), z.unknown()).optional(),\n})\n\ntype PaymentFormValues = z.infer<typeof paymentFormSchema>\n\nconst DEFAULT_FORM: PaymentFormValues = {\n name: '',\n code: '',\n providerKey: '',\n description: '',\n terms: '',\n isActive: true,\n providerSettings: {},\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction renderFieldInput(opts: {\n field: ProviderSettingField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const { field, value, onChange } = opts\n const common = { id: field.key, 'data-provider-setting': field.key }\n switch (field.type) {\n case 'textarea':\n return (\n <Textarea\n {...common}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <Input\n {...common}\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? String(value) : ''}\n onChange={(evt) => onChange(evt.target.value === '' ? '' : Number(evt.target.value))}\n placeholder={field.placeholder}\n />\n )\n case 'boolean':\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <Switch\n id={field.key}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n <Label htmlFor={field.key}>{field.placeholder ?? ''}</Label>\n </div>\n )\n case 'select':\n return (\n <select\n {...common}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n >\n <option value=\"\">\u2014</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n case 'secret':\n return (\n <Input\n {...common}\n type=\"password\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'url':\n case 'text':\n default:\n return (\n <Input\n {...common}\n type={field.type === 'url' ? 'url' : 'text'}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction createPaymentProviderSettingsRenderer(params: {\n providers: PaymentProvider[]\n selectPrompt: string\n noFieldsLabel: string\n}) {\n const { providers, selectPrompt, noFieldsLabel } = params\n return function PaymentProviderSettingsField({\n value,\n setValue,\n values,\n }: CrudCustomFieldRenderProps) {\n const providerKey =\n values && typeof values.providerKey === 'string' && values.providerKey.trim().length\n ? values.providerKey\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const previousKey = React.useRef<string | null>(providerKey)\n\n React.useEffect(() => {\n if (providerKey !== previousKey.current) {\n const defaults = provider?.settings?.defaults ?? null\n setValue(defaults && typeof defaults === 'object' ? defaults : {})\n previousKey.current = providerKey\n }\n }, [providerKey, provider, setValue])\n\n if (!provider) {\n return <p className=\"text-sm text-muted-foreground\">{selectPrompt}</p>\n }\n\n const settings = isRecord(value) ? value : {}\n const fields = provider.settings?.fields ?? []\n if (!fields.length) {\n return <p className=\"text-sm text-muted-foreground\">{noFieldsLabel}</p>\n }\n\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const fieldValue = settings[field.key]\n return (\n <div key={field.key} className=\"space-y-1.5\">\n <Label htmlFor={field.key} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </Label>\n {field.description ? (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n ) : null}\n {renderFieldInput({\n field,\n value: fieldValue,\n onChange: (next) => setValue({ ...settings, [field.key]: next }),\n })}\n </div>\n )\n })}\n </div>\n )\n }\n}\n\nexport function PaymentMethodsSettings() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const providers = React.useMemo(() => listPaymentProviders(), [])\n const providerOptions = React.useMemo(\n () => providers.map((provider) => ({ value: provider.key, label: provider.label })),\n [providers]\n )\n const ProviderSettingsField = React.useMemo(\n () =>\n createPaymentProviderSettingsRenderer({\n providers,\n selectPrompt: t(\n 'sales.config.paymentMethods.form.selectProvider',\n 'Choose a provider to configure settings.'\n ),\n noFieldsLabel: t('sales.config.paymentMethods.form.noSettings', 'No configurable settings.'),\n }),\n [providers, t]\n )\n\n const translations = React.useMemo(() => ({\n title: t('sales.config.paymentMethods.title', 'Payment methods'),\n description: t(\n 'sales.config.paymentMethods.description',\n 'Configure payment providers and any checkout fees.'\n ),\n actions: {\n add: t('sales.config.paymentMethods.actions.add', 'Add payment method'),\n edit: t('sales.config.paymentMethods.actions.edit', 'Edit'),\n delete: t('sales.config.paymentMethods.actions.delete', 'Delete'),\n deleteConfirm: t('sales.config.paymentMethods.actions.deleteConfirm', 'Delete \"{{name}}\"?'),\n refresh: t('sales.config.paymentMethods.actions.refresh', 'Refresh'),\n },\n table: {\n name: t('sales.config.paymentMethods.table.name', 'Name'),\n code: t('sales.config.paymentMethods.table.code', 'Code'),\n provider: t('sales.config.paymentMethods.table.provider', 'Provider'),\n active: t('sales.config.paymentMethods.table.active', 'Active'),\n statusActive: t('sales.config.paymentMethods.table.statusActive', 'Active'),\n statusInactive: t('sales.config.paymentMethods.table.statusInactive', 'Inactive'),\n updatedAt: t('sales.config.paymentMethods.table.updatedAt', 'Updated'),\n empty: t('sales.config.paymentMethods.table.empty', 'No payment methods yet.'),\n search: t('sales.config.paymentMethods.table.search', 'Search payment methods\u2026'),\n },\n form: {\n createTitle: t('sales.config.paymentMethods.form.createTitle', 'Add payment method'),\n editTitle: t('sales.config.paymentMethods.form.editTitle', 'Edit payment method'),\n name: t('sales.config.paymentMethods.form.name', 'Name'),\n code: t('sales.config.paymentMethods.form.code', 'Code'),\n provider: t('sales.config.paymentMethods.form.provider', 'Provider'),\n description: t('sales.config.paymentMethods.form.description', 'Description'),\n terms: t('sales.config.paymentMethods.form.terms', 'Terms'),\n isActive: t('sales.config.paymentMethods.form.isActive', 'Active'),\n providerSettings: t('sales.config.paymentMethods.form.providerSettings', 'Provider settings'),\n save: t('sales.config.paymentMethods.form.save', 'Save'),\n cancel: t('sales.config.paymentMethods.form.cancel', 'Cancel'),\n },\n messages: {\n saved: t('sales.config.paymentMethods.messages.saved', 'Payment method saved.'),\n deleted: t('sales.config.paymentMethods.messages.deleted', 'Payment method deleted.'),\n },\n errors: {\n load: t('sales.config.paymentMethods.errors.load', 'Failed to load payment methods.'),\n save: t('sales.config.paymentMethods.errors.save', 'Failed to save payment method.'),\n delete: t('sales.config.paymentMethods.errors.delete', 'Failed to delete payment method.'),\n },\n }), [t])\n\n const [entries, setEntries] = React.useState<PaymentMethodRow[]>([])\n const [loading, setLoading] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogState | null>(null)\n const [formValues, setFormValues] = React.useState<PaymentFormValues>(DEFAULT_FORM)\n const [search, setSearch] = React.useState('')\n const [submitting, setSubmitting] = React.useState(false)\n\n const loadEntries = React.useCallback(async () => {\n setLoading(true)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/payment-methods?pageSize=100',\n undefined,\n { errorMessage: translations.errors.load, fallback: { items: [] } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setEntries(\n items.map((item) => {\n const providerKey = typeof (item as any).providerKey === 'string'\n ? (item as any).providerKey\n : typeof (item as any).provider_key === 'string'\n ? (item as any).provider_key\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n return {\n id: String(item.id ?? ''),\n name: typeof item.name === 'string' && item.name.length ? item.name : '\u2014',\n code: typeof item.code === 'string' ? item.code : '',\n providerKey,\n providerLabel: provider?.label ?? null,\n description: typeof item.description === 'string' ? item.description : null,\n terms: typeof item.terms === 'string' ? item.terms : null,\n isActive:\n typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof (item as any)?.is_active === 'boolean'\n ? (item as any).is_active\n : false,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : null,\n providerSettings:\n item && typeof (item as any).providerSettings === 'object'\n ? ((item as any).providerSettings as Record<string, unknown>)\n : null,\n }\n })\n )\n } catch (err) {\n console.error('sales.payment-methods.list failed', err)\n flash(translations.errors.load, 'error')\n } finally {\n setLoading(false)\n }\n }, [providers, translations.errors.load])\n\n React.useEffect(() => {\n void loadEntries()\n }, [loadEntries, scopeVersion])\n\n const openCreate = React.useCallback(() => {\n const defaultProvider = providerOptions[0]?.value ?? ''\n setFormValues({\n ...DEFAULT_FORM,\n providerKey: defaultProvider,\n providerSettings: {},\n })\n setDialog({ mode: 'create' })\n }, [providerOptions])\n\n const openEdit = React.useCallback((entry: PaymentMethodRow) => {\n setFormValues({\n name: entry.name,\n code: entry.code,\n providerKey: entry.providerKey ?? '',\n description: entry.description ?? '',\n terms: entry.terms ?? '',\n isActive: entry.isActive,\n providerSettings: entry.providerSettings ?? {},\n })\n setDialog({ mode: 'edit', entry })\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const deleteEntry = React.useCallback(async (entry: PaymentMethodRow) => {\n const message = translations.actions.deleteConfirm.replace('{{name}}', entry.name)\n if (!window.confirm(message)) return\n try {\n const call = await apiCall('/api/sales/payment-methods', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.delete)\n }\n flash(translations.messages.deleted, 'success')\n await loadEntries()\n } catch (err) {\n console.error('sales.payment-methods.delete failed', err)\n const message =\n err instanceof Error ? err.message : translations.errors.delete\n flash(message, 'error')\n }\n }, [loadEntries, translations.actions.deleteConfirm, translations.errors.delete, translations.messages.deleted])\n\n const handleSubmit = React.useCallback(async (values: PaymentFormValues) => {\n if (!dialog) return\n setSubmitting(true)\n const payload: Record<string, unknown> = {\n name: values.name.trim(),\n code: values.code.trim().toLowerCase(),\n description: values.description?.trim() || undefined,\n providerKey: values.providerKey?.trim() || undefined,\n terms: values.terms?.trim() || undefined,\n isActive: values.isActive ?? true,\n providerSettings: isRecord(values.providerSettings) ? values.providerSettings : undefined,\n }\n const path = '/api/sales/payment-methods'\n const method = dialog.mode === 'create' ? 'POST' : 'PUT'\n if (dialog.mode === 'edit') payload.id = dialog.entry.id\n try {\n const call = await apiCall(path, {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.save)\n }\n flash(translations.messages.saved, 'success')\n await loadEntries()\n closeDialog()\n } catch (err) {\n console.error('sales.payment-methods.save failed', err)\n const message = err instanceof Error ? err.message : translations.errors.save\n flash(message, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [closeDialog, dialog, loadEntries, translations.errors.save, translations.messages.saved])\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', label: translations.form.name, type: 'text', required: true },\n { id: 'code', label: translations.form.code, type: 'text', required: true },\n {\n id: 'providerKey',\n label: translations.form.provider,\n type: 'select',\n required: false,\n options: providerOptions,\n },\n { id: 'description', label: translations.form.description, type: 'textarea' },\n { id: 'terms', label: translations.form.terms, type: 'textarea' },\n { id: 'isActive', label: translations.form.isActive, type: 'checkbox' },\n {\n id: 'providerSettings',\n label: translations.form.providerSettings,\n type: 'custom',\n component: ProviderSettingsField,\n },\n ], [ProviderSettingsField, providerOptions, translations.form.code, translations.form.description, translations.form.isActive, translations.form.name, translations.form.provider, translations.form.providerSettings, translations.form.terms])\n\n const columns = React.useMemo<ColumnDef<PaymentMethodRow>[]>(() => [\n {\n accessorKey: 'name',\n header: translations.table.name,\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n <span className=\"text-xs text-muted-foreground\">{row.original.code}</span>\n </div>\n ),\n },\n {\n accessorKey: 'providerKey',\n header: translations.table.provider,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.providerLabel ?? row.original.providerKey ?? '\u2014'}\n </span>\n ),\n },\n {\n accessorKey: 'isActive',\n header: translations.table.active,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.isActive ? translations.table.statusActive : translations.table.statusInactive}\n </span>\n ),\n },\n {\n accessorKey: 'updatedAt',\n header: translations.table.updatedAt,\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.updatedAt ? new Date(row.original.updatedAt).toLocaleString() : '\u2014'}\n </span>\n ),\n },\n ], [translations])\n\n const filteredEntries = React.useMemo(() => {\n if (!search.trim()) return entries\n const term = search.trim().toLowerCase()\n return entries.filter(\n (entry) =>\n entry.name.toLowerCase().includes(term) ||\n entry.code.toLowerCase().includes(term) ||\n (entry.providerLabel ?? '').toLowerCase().includes(term) ||\n (entry.providerKey ?? '').toLowerCase().includes(term)\n )\n }, [entries, search])\n\n return (\n <section className=\"rounded border bg-card text-card-foreground shadow-sm\">\n <div className=\"border-b px-6 py-4 space-y-1\">\n <h2 className=\"text-lg font-medium\">{translations.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{translations.description}</p>\n </div>\n <div className=\"px-2 py-4 sm:px-4\">\n <DataTable\n embedded\n isLoading={loading}\n columns={columns}\n data={filteredEntries}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder={translations.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{translations.table.empty}</p>}\n actions={(\n <Button size=\"sm\" onClick={openCreate}>\n {translations.actions.add}\n </Button>\n )}\n refreshButton={{\n label: translations.actions.refresh,\n onRefresh: () => { void loadEntries() },\n isRefreshing: loading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: translations.actions.edit, onSelect: () => openEdit(row) },\n { id: 'delete', label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) },\n ]}\n />\n )}\n />\n </div>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit' ? translations.form.editTitle : translations.form.createTitle}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n schema={paymentFormSchema}\n fields={fields}\n initialValues={formValues}\n submitLabel={translations.form.save}\n onSubmit={handleSubmit}\n cancelHref={undefined}\n embedded\n isLoading={submitting}\n twoColumn\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {translations.form.cancel}\n </Button>\n )}\n />\n </DialogContent>\n </Dialog>\n </section>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { CrudForm, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n listPaymentProviders,\n type PaymentProvider,\n type ProviderSettingField,\n} from '../lib/providers'\n\ntype PaymentMethodRow = {\n id: string\n name: string\n code: string\n providerKey: string | null\n providerLabel: string | null\n description: string | null\n terms: string | null\n isActive: boolean\n updatedAt: string | null\n providerSettings: Record<string, unknown> | null\n}\n\ntype DialogState =\n | { mode: 'create' }\n | { mode: 'edit'; entry: PaymentMethodRow }\n\nconst paymentFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n providerKey: z.string().trim().optional(),\n description: z.string().optional(),\n terms: z.string().optional(),\n isActive: z.boolean().optional(),\n providerSettings: z.record(z.string(), z.unknown()).optional(),\n})\n\ntype PaymentFormValues = z.infer<typeof paymentFormSchema>\n\nconst DEFAULT_FORM: PaymentFormValues = {\n name: '',\n code: '',\n providerKey: '',\n description: '',\n terms: '',\n isActive: true,\n providerSettings: {},\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction renderFieldInput(opts: {\n field: ProviderSettingField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const { field, value, onChange } = opts\n const common = { id: field.key, 'data-provider-setting': field.key }\n switch (field.type) {\n case 'textarea':\n return (\n <Textarea\n {...common}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <Input\n {...common}\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? String(value) : ''}\n onChange={(evt) => onChange(evt.target.value === '' ? '' : Number(evt.target.value))}\n placeholder={field.placeholder}\n />\n )\n case 'boolean':\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <Switch\n id={field.key}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n <Label htmlFor={field.key}>{field.placeholder ?? ''}</Label>\n </div>\n )\n case 'select':\n return (\n <select\n {...common}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n >\n <option value=\"\">\u2014</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n case 'secret':\n return (\n <Input\n {...common}\n type=\"password\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'url':\n case 'text':\n default:\n return (\n <Input\n {...common}\n type={field.type === 'url' ? 'url' : 'text'}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction createPaymentProviderSettingsRenderer(params: {\n providers: PaymentProvider[]\n selectPrompt: string\n noFieldsLabel: string\n}) {\n const { providers, selectPrompt, noFieldsLabel } = params\n return function PaymentProviderSettingsField({\n value,\n setValue,\n values,\n }: CrudCustomFieldRenderProps) {\n const providerKey =\n values && typeof values.providerKey === 'string' && values.providerKey.trim().length\n ? values.providerKey\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const previousKey = React.useRef<string | null>(providerKey)\n\n React.useEffect(() => {\n if (providerKey !== previousKey.current) {\n const defaults = provider?.settings?.defaults ?? null\n setValue(defaults && typeof defaults === 'object' ? defaults : {})\n previousKey.current = providerKey\n }\n }, [providerKey, provider, setValue])\n\n if (!provider) {\n return <p className=\"text-sm text-muted-foreground\">{selectPrompt}</p>\n }\n\n const settings = isRecord(value) ? value : {}\n const fields = provider.settings?.fields ?? []\n if (!fields.length) {\n return <p className=\"text-sm text-muted-foreground\">{noFieldsLabel}</p>\n }\n\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const fieldValue = settings[field.key]\n return (\n <div key={field.key} className=\"space-y-1.5\">\n <Label htmlFor={field.key} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </Label>\n {field.description ? (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n ) : null}\n {renderFieldInput({\n field,\n value: fieldValue,\n onChange: (next) => setValue({ ...settings, [field.key]: next }),\n })}\n </div>\n )\n })}\n </div>\n )\n }\n}\n\nexport function PaymentMethodsSettings() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const providers = React.useMemo(() => listPaymentProviders(), [])\n const providerOptions = React.useMemo(\n () => providers.map((provider) => ({ value: provider.key, label: provider.label })),\n [providers]\n )\n const ProviderSettingsField = React.useMemo(\n () =>\n createPaymentProviderSettingsRenderer({\n providers,\n selectPrompt: t(\n 'sales.config.paymentMethods.form.selectProvider',\n 'Choose a provider to configure settings.'\n ),\n noFieldsLabel: t('sales.config.paymentMethods.form.noSettings', 'No configurable settings.'),\n }),\n [providers, t]\n )\n\n const translations = React.useMemo(() => ({\n title: t('sales.config.paymentMethods.title', 'Payment methods'),\n description: t(\n 'sales.config.paymentMethods.description',\n 'Configure payment providers and any checkout fees.'\n ),\n actions: {\n add: t('sales.config.paymentMethods.actions.add', 'Add payment method'),\n edit: t('sales.config.paymentMethods.actions.edit', 'Edit'),\n delete: t('sales.config.paymentMethods.actions.delete', 'Delete'),\n deleteConfirm: t('sales.config.paymentMethods.actions.deleteConfirm', 'Delete \"{{name}}\"?'),\n refresh: t('sales.config.paymentMethods.actions.refresh', 'Refresh'),\n },\n table: {\n name: t('sales.config.paymentMethods.table.name', 'Name'),\n code: t('sales.config.paymentMethods.table.code', 'Code'),\n provider: t('sales.config.paymentMethods.table.provider', 'Provider'),\n active: t('sales.config.paymentMethods.table.active', 'Active'),\n statusActive: t('sales.config.paymentMethods.table.statusActive', 'Active'),\n statusInactive: t('sales.config.paymentMethods.table.statusInactive', 'Inactive'),\n updatedAt: t('sales.config.paymentMethods.table.updatedAt', 'Updated'),\n empty: t('sales.config.paymentMethods.table.empty', 'No payment methods yet.'),\n search: t('sales.config.paymentMethods.table.search', 'Search payment methods\u2026'),\n },\n form: {\n createTitle: t('sales.config.paymentMethods.form.createTitle', 'Add payment method'),\n editTitle: t('sales.config.paymentMethods.form.editTitle', 'Edit payment method'),\n name: t('sales.config.paymentMethods.form.name', 'Name'),\n code: t('sales.config.paymentMethods.form.code', 'Code'),\n provider: t('sales.config.paymentMethods.form.provider', 'Provider'),\n description: t('sales.config.paymentMethods.form.description', 'Description'),\n terms: t('sales.config.paymentMethods.form.terms', 'Terms'),\n isActive: t('sales.config.paymentMethods.form.isActive', 'Active'),\n providerSettings: t('sales.config.paymentMethods.form.providerSettings', 'Provider settings'),\n save: t('sales.config.paymentMethods.form.save', 'Save'),\n cancel: t('sales.config.paymentMethods.form.cancel', 'Cancel'),\n },\n messages: {\n saved: t('sales.config.paymentMethods.messages.saved', 'Payment method saved.'),\n deleted: t('sales.config.paymentMethods.messages.deleted', 'Payment method deleted.'),\n },\n errors: {\n load: t('sales.config.paymentMethods.errors.load', 'Failed to load payment methods.'),\n save: t('sales.config.paymentMethods.errors.save', 'Failed to save payment method.'),\n delete: t('sales.config.paymentMethods.errors.delete', 'Failed to delete payment method.'),\n },\n }), [t])\n\n const [entries, setEntries] = React.useState<PaymentMethodRow[]>([])\n const [loading, setLoading] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogState | null>(null)\n const [formValues, setFormValues] = React.useState<PaymentFormValues>(DEFAULT_FORM)\n const [search, setSearch] = React.useState('')\n const [submitting, setSubmitting] = React.useState(false)\n\n const loadEntries = React.useCallback(async () => {\n setLoading(true)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/payment-methods?pageSize=100',\n undefined,\n { errorMessage: translations.errors.load, fallback: { items: [] } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setEntries(\n items.map((item) => {\n const providerKey = typeof (item as any).providerKey === 'string'\n ? (item as any).providerKey\n : typeof (item as any).provider_key === 'string'\n ? (item as any).provider_key\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n return {\n id: String(item.id ?? ''),\n name: typeof item.name === 'string' && item.name.length ? item.name : '\u2014',\n code: typeof item.code === 'string' ? item.code : '',\n providerKey,\n providerLabel: provider?.label ?? null,\n description: typeof item.description === 'string' ? item.description : null,\n terms: typeof item.terms === 'string' ? item.terms : null,\n isActive:\n typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof (item as any)?.is_active === 'boolean'\n ? (item as any).is_active\n : false,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : null,\n providerSettings:\n item && typeof (item as any).providerSettings === 'object'\n ? ((item as any).providerSettings as Record<string, unknown>)\n : null,\n }\n })\n )\n } catch (err) {\n console.error('sales.payment-methods.list failed', err)\n flash(translations.errors.load, 'error')\n } finally {\n setLoading(false)\n }\n }, [providers, translations.errors.load])\n\n React.useEffect(() => {\n void loadEntries()\n }, [loadEntries, scopeVersion])\n\n const openCreate = React.useCallback(() => {\n const defaultProvider = providerOptions[0]?.value ?? ''\n setFormValues({\n ...DEFAULT_FORM,\n providerKey: defaultProvider,\n providerSettings: {},\n })\n setDialog({ mode: 'create' })\n }, [providerOptions])\n\n const openEdit = React.useCallback((entry: PaymentMethodRow) => {\n setFormValues({\n name: entry.name,\n code: entry.code,\n providerKey: entry.providerKey ?? '',\n description: entry.description ?? '',\n terms: entry.terms ?? '',\n isActive: entry.isActive,\n providerSettings: entry.providerSettings ?? {},\n })\n setDialog({ mode: 'edit', entry })\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const deleteEntry = React.useCallback(async (entry: PaymentMethodRow) => {\n const message = translations.actions.deleteConfirm.replace('{{name}}', entry.name)\n if (!window.confirm(message)) return\n try {\n const call = await apiCall('/api/sales/payment-methods', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.delete)\n }\n flash(translations.messages.deleted, 'success')\n await loadEntries()\n } catch (err) {\n console.error('sales.payment-methods.delete failed', err)\n const message =\n err instanceof Error ? err.message : translations.errors.delete\n flash(message, 'error')\n }\n }, [loadEntries, translations.actions.deleteConfirm, translations.errors.delete, translations.messages.deleted])\n\n const handleSubmit = React.useCallback(async (values: PaymentFormValues) => {\n if (!dialog) return\n setSubmitting(true)\n const payload: Record<string, unknown> = {\n name: values.name.trim(),\n code: values.code.trim().toLowerCase(),\n description: values.description?.trim() || undefined,\n providerKey: values.providerKey?.trim() || undefined,\n terms: values.terms?.trim() || undefined,\n isActive: values.isActive ?? true,\n providerSettings: isRecord(values.providerSettings) ? values.providerSettings : undefined,\n }\n const path = '/api/sales/payment-methods'\n const method = dialog.mode === 'create' ? 'POST' : 'PUT'\n if (dialog.mode === 'edit') payload.id = dialog.entry.id\n try {\n const call = await apiCall(path, {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.save)\n }\n flash(translations.messages.saved, 'success')\n await loadEntries()\n closeDialog()\n } catch (err) {\n console.error('sales.payment-methods.save failed', err)\n const message = err instanceof Error ? err.message : translations.errors.save\n flash(message, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [closeDialog, dialog, loadEntries, translations.errors.save, translations.messages.saved])\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', label: translations.form.name, type: 'text', required: true },\n { id: 'code', label: translations.form.code, type: 'text', required: true },\n {\n id: 'providerKey',\n label: translations.form.provider,\n type: 'select',\n required: false,\n options: providerOptions,\n },\n { id: 'description', label: translations.form.description, type: 'textarea' },\n { id: 'terms', label: translations.form.terms, type: 'textarea' },\n { id: 'isActive', label: translations.form.isActive, type: 'checkbox' },\n {\n id: 'providerSettings',\n label: translations.form.providerSettings,\n type: 'custom',\n component: ProviderSettingsField,\n },\n ], [ProviderSettingsField, providerOptions, translations.form.code, translations.form.description, translations.form.isActive, translations.form.name, translations.form.provider, translations.form.providerSettings, translations.form.terms])\n\n const columns = React.useMemo<ColumnDef<PaymentMethodRow>[]>(() => [\n {\n accessorKey: 'name',\n header: translations.table.name,\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n <span className=\"text-xs text-muted-foreground\">{row.original.code}</span>\n </div>\n ),\n },\n {\n accessorKey: 'providerKey',\n header: translations.table.provider,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.providerLabel ?? row.original.providerKey ?? '\u2014'}\n </span>\n ),\n },\n {\n accessorKey: 'isActive',\n header: translations.table.active,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.isActive ? translations.table.statusActive : translations.table.statusInactive}\n </span>\n ),\n },\n {\n accessorKey: 'updatedAt',\n header: translations.table.updatedAt,\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.updatedAt ? new Date(row.original.updatedAt).toLocaleString() : '\u2014'}\n </span>\n ),\n },\n ], [translations])\n\n const filteredEntries = React.useMemo(() => {\n if (!search.trim()) return entries\n const term = search.trim().toLowerCase()\n return entries.filter(\n (entry) =>\n entry.name.toLowerCase().includes(term) ||\n entry.code.toLowerCase().includes(term) ||\n (entry.providerLabel ?? '').toLowerCase().includes(term) ||\n (entry.providerKey ?? '').toLowerCase().includes(term)\n )\n }, [entries, search])\n\n return (\n <section className=\"rounded border bg-card text-card-foreground shadow-sm\">\n <div className=\"border-b px-6 py-4 space-y-1\">\n <h2 className=\"text-lg font-medium\">{translations.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{translations.description}</p>\n </div>\n <div className=\"px-2 py-4 sm:px-4\">\n <DataTable\n embedded\n isLoading={loading}\n columns={columns}\n data={filteredEntries}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder={translations.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{translations.table.empty}</p>}\n actions={(\n <Button size=\"sm\" onClick={openCreate}>\n {translations.actions.add}\n </Button>\n )}\n refreshButton={{\n label: translations.actions.refresh,\n onRefresh: () => { void loadEntries() },\n isRefreshing: loading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { label: translations.actions.edit, onSelect: () => openEdit(row) },\n { label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) },\n ]}\n />\n )}\n />\n </div>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit' ? translations.form.editTitle : translations.form.createTitle}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n schema={paymentFormSchema}\n fields={fields}\n initialValues={formValues}\n submitLabel={translations.form.save}\n onSubmit={handleSubmit}\n cancelHref={undefined}\n embedded\n isLoading={submitting}\n twoColumn\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {translations.form.cancel}\n </Button>\n )}\n />\n </DialogContent>\n </Dialog>\n </section>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["message"]
7
7
  }
@@ -660,8 +660,8 @@ function ShippingMethodsSettings() {
660
660
  RowActions,
661
661
  {
662
662
  items: [
663
- { id: "edit", label: translations.actions.edit, onSelect: () => openEdit(row) },
664
- { id: "delete", label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) }
663
+ { label: translations.actions.edit, onSelect: () => openEdit(row) },
664
+ { label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) }
665
665
  ]
666
666
  }
667
667
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/sales/components/ShippingMethodsSettings.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n listShippingProviders,\n type ProviderSettingField,\n type ShippingProvider,\n} from '../lib/providers'\n\ntype ShippingMethodRow = {\n id: string\n name: string\n code: string\n providerKey: string | null\n providerLabel: string | null\n carrierCode: string | null\n description: string | null\n serviceLevel: string | null\n estimatedTransitDays: number | null\n baseRateNet: number\n baseRateGross: number\n currencyCode: string | null\n isActive: boolean\n updatedAt: string | null\n providerSettings: Record<string, unknown> | null\n}\n\ntype DialogState =\n | { mode: 'create' }\n | { mode: 'edit'; entry: ShippingMethodRow }\n\nconst shippingFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n providerKey: z.string().trim().optional(),\n description: z.string().optional(),\n carrierCode: z.string().optional(),\n serviceLevel: z.string().optional(),\n estimatedTransitDays: z.coerce.number().min(0).optional(),\n baseRateNet: z.coerce.number().min(0),\n baseRateGross: z.coerce.number().min(0).optional(),\n currencyCode: z.string().trim().optional(),\n isActive: z.boolean().optional(),\n providerSettings: z.record(z.string(), z.unknown()).optional(),\n})\n\ntype ShippingFormValues = z.infer<typeof shippingFormSchema>\n\nconst DEFAULT_FORM: ShippingFormValues = {\n name: '',\n code: '',\n providerKey: '',\n description: '',\n carrierCode: '',\n serviceLevel: '',\n estimatedTransitDays: undefined,\n baseRateNet: 0,\n baseRateGross: 0,\n currencyCode: '',\n isActive: true,\n providerSettings: {},\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction renderFieldInput(opts: {\n field: ProviderSettingField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const { field, value, onChange } = opts\n const common = { id: field.key, 'data-provider-setting': field.key }\n switch (field.type) {\n case 'textarea':\n return (\n <Textarea\n {...common}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <Input\n {...common}\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? String(value) : ''}\n onChange={(evt) => onChange(evt.target.value === '' ? '' : Number(evt.target.value))}\n placeholder={field.placeholder}\n />\n )\n case 'boolean':\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <Switch\n id={field.key}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n <Label htmlFor={field.key}>{field.placeholder ?? ''}</Label>\n </div>\n )\n case 'select':\n return (\n <select\n {...common}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n >\n <option value=\"\">\u2014</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n case 'secret':\n return (\n <Input\n {...common}\n type=\"password\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'url':\n case 'text':\n default:\n return (\n <Input\n {...common}\n type={field.type === 'url' ? 'url' : 'text'}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\ntype RateRule = {\n id?: string\n name?: string\n metric?: string\n min?: number | null\n max?: number | null\n amountNet?: number | null\n amountGross?: number | null\n currencyCode?: string | null\n}\n\ntype FlatRateLabels = {\n title: string\n add: string\n metric: string\n min: string\n max: string\n amountNet: string\n amountGross: string\n currency: string\n remove: string\n applyBaseRate: string\n}\n\nfunction FlatRateSettingsEditor(props: {\n value: Record<string, unknown>\n onChange: (next: Record<string, unknown>) => void\n translations: FlatRateLabels\n currencyCode?: string | null\n}) {\n const { value, onChange, translations, currencyCode } = props\n const rates = Array.isArray(value.rates) ? (value.rates as RateRule[]) : []\n const applyBaseRate = value.applyBaseRate !== false\n const metrics: Array<{ value: string; label: string }> = [\n { value: 'item_count', label: 'Item count' },\n { value: 'weight', label: 'Total weight' },\n { value: 'volume', label: 'Total volume' },\n { value: 'subtotal', label: 'Subtotal' },\n ]\n\n const updateRates = (nextRates: RateRule[]) => {\n onChange({ ...value, rates: nextRates })\n }\n\n const updateRate = (index: number, key: keyof RateRule, nextValue: unknown) => {\n const next = rates.map((rate, idx) =>\n idx === index ? { ...rate, [key]: nextValue } : rate\n )\n updateRates(next)\n }\n\n const addRate = () => {\n updateRates([\n ...rates,\n {\n id: crypto.randomUUID?.() ?? String(Date.now()),\n name: '',\n metric: 'item_count',\n min: 0,\n max: null,\n amountNet: 0,\n amountGross: 0,\n currencyCode: currencyCode ?? '',\n },\n ])\n }\n\n const removeRate = (index: number) => {\n updateRates(rates.filter((_, idx) => idx !== index))\n }\n\n return (\n <div className=\"space-y-3 rounded-md border border-dashed border-border p-3\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">{translations.title}</p>\n <Button size=\"sm\" variant=\"outline\" type=\"button\" onClick={addRate}>\n {translations.add}\n </Button>\n </div>\n <div className=\"space-y-3\">\n {rates.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{translations.add}</p>\n ) : (\n rates.map((rate, index) => (\n <div key={rate.id ?? index} className=\"rounded-md border border-border p-3 space-y-2\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.metric}</Label>\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={rate.metric ?? 'item_count'}\n onChange={(evt) => updateRate(index, 'metric', evt.target.value)}\n >\n {metrics.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.min}</Label>\n <Input\n type=\"number\"\n value={rate.min ?? ''}\n onChange={(evt) => updateRate(index, 'min', evt.target.value === '' ? null : Number(evt.target.value))}\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.max}</Label>\n <Input\n type=\"number\"\n value={rate.max ?? ''}\n onChange={(evt) => updateRate(index, 'max', evt.target.value === '' ? null : Number(evt.target.value))}\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.amountNet}</Label>\n <Input\n type=\"number\"\n value={rate.amountNet ?? ''}\n onChange={(evt) =>\n updateRate(index, 'amountNet', evt.target.value === '' ? null : Number(evt.target.value))\n }\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.amountGross}</Label>\n <Input\n type=\"number\"\n value={rate.amountGross ?? ''}\n onChange={(evt) =>\n updateRate(index, 'amountGross', evt.target.value === '' ? null : Number(evt.target.value))\n }\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.currency}</Label>\n <Input\n type=\"text\"\n value={rate.currencyCode ?? currencyCode ?? ''}\n onChange={(evt) =>\n updateRate(index, 'currencyCode', evt.target.value?.toUpperCase?.() ?? '')\n }\n />\n </div>\n </div>\n <div className=\"flex justify-end\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => removeRate(index)}>\n {translations.remove}\n </Button>\n </div>\n </div>\n ))\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"apply-base-rate\"\n checked={applyBaseRate}\n onCheckedChange={(checked) => onChange({ ...value, applyBaseRate: checked })}\n />\n <Label htmlFor=\"apply-base-rate\" className=\"text-sm\">\n {translations.applyBaseRate}\n </Label>\n </div>\n </div>\n )\n}\n\nfunction createShippingProviderSettingsRenderer(params: {\n providers: ShippingProvider[]\n selectPrompt: string\n noFieldsLabel: string\n flatRateLabels: FlatRateLabels\n}) {\n const { providers, selectPrompt, noFieldsLabel, flatRateLabels } = params\n return function ShippingProviderSettingsField({\n value,\n setValue,\n values,\n }: CrudCustomFieldRenderProps) {\n const providerKey =\n values && typeof values.providerKey === 'string' && values.providerKey.trim().length\n ? values.providerKey\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const previousKey = React.useRef<string | null>(providerKey)\n\n React.useEffect(() => {\n if (providerKey !== previousKey.current) {\n const defaults = provider?.settings?.defaults ?? null\n setValue(defaults && typeof defaults === 'object' ? defaults : {})\n previousKey.current = providerKey\n }\n }, [providerKey, provider, setValue])\n\n if (!provider) {\n return <p className=\"text-sm text-muted-foreground\">{selectPrompt}</p>\n }\n\n const settings = isRecord(value) ? value : {}\n const fields = provider.settings?.fields ?? []\n if (provider.key === 'flat-rate') {\n return (\n <FlatRateSettingsEditor\n value={settings}\n onChange={(next) => setValue(next)}\n translations={flatRateLabels}\n currencyCode={typeof values?.currencyCode === 'string' ? values.currencyCode : ''}\n />\n )\n }\n if (!fields.length) {\n return <p className=\"text-sm text-muted-foreground\">{noFieldsLabel}</p>\n }\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const fieldValue = settings[field.key]\n return (\n <div key={field.key} className=\"space-y-1.5\">\n <Label htmlFor={field.key} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </Label>\n {field.description ? (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n ) : null}\n {renderFieldInput({\n field,\n value: fieldValue,\n onChange: (next) => setValue({ ...settings, [field.key]: next }),\n })}\n </div>\n )\n })}\n </div>\n )\n }\n}\n\nexport function ShippingMethodsSettings() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const providers = React.useMemo(() => listShippingProviders(), [])\n const providerOptions = React.useMemo(\n () => providers.map((provider) => ({ value: provider.key, label: provider.label })),\n [providers]\n )\n const flatRateLabels = React.useMemo(() => ({\n title: t('sales.config.shippingMethods.form.ratesTitle', 'Rates'),\n add: t('sales.config.shippingMethods.form.addRate', 'Add rate'),\n metric: t('sales.config.shippingMethods.form.metric', 'Metric'),\n min: t('sales.config.shippingMethods.form.min', 'Min'),\n max: t('sales.config.shippingMethods.form.max', 'Max'),\n amountNet: t('sales.config.shippingMethods.form.amountNet', 'Amount (net)'),\n amountGross: t('sales.config.shippingMethods.form.amountGross', 'Amount (gross)'),\n currency: t('sales.config.shippingMethods.form.currency', 'Currency'),\n remove: t('sales.config.shippingMethods.form.removeRate', 'Remove'),\n applyBaseRate: t(\n 'sales.config.shippingMethods.form.applyBaseRate',\n 'Always include the base rate'\n ),\n }), [t])\n const ProviderSettingsField = React.useMemo(\n () =>\n createShippingProviderSettingsRenderer({\n providers,\n selectPrompt: t(\n 'sales.config.shippingMethods.form.selectProvider',\n 'Choose a provider to configure settings.'\n ),\n noFieldsLabel: t('sales.config.shippingMethods.form.noSettings', 'No configurable settings.'),\n flatRateLabels,\n }),\n [flatRateLabels, providers, t]\n )\n\n const translations = React.useMemo(() => ({\n title: t('sales.config.shippingMethods.title', 'Shipping methods'),\n description: t(\n 'sales.config.shippingMethods.description',\n 'Manage carriers, providers, and default shipping prices.'\n ),\n actions: {\n add: t('sales.config.shippingMethods.actions.add', 'Add shipping method'),\n edit: t('sales.config.shippingMethods.actions.edit', 'Edit'),\n delete: t('sales.config.shippingMethods.actions.delete', 'Delete'),\n deleteConfirm: t('sales.config.shippingMethods.actions.deleteConfirm', 'Delete \"{{name}}\"?'),\n refresh: t('sales.config.shippingMethods.actions.refresh', 'Refresh'),\n },\n table: {\n name: t('sales.config.shippingMethods.table.name', 'Name'),\n code: t('sales.config.shippingMethods.table.code', 'Code'),\n provider: t('sales.config.shippingMethods.table.provider', 'Provider'),\n rate: t('sales.config.shippingMethods.table.rate', 'Base rate'),\n currency: t('sales.config.shippingMethods.table.currency', 'Currency'),\n active: t('sales.config.shippingMethods.table.active', 'Active'),\n statusActive: t('sales.config.shippingMethods.table.statusActive', 'Active'),\n statusInactive: t('sales.config.shippingMethods.table.statusInactive', 'Inactive'),\n updatedAt: t('sales.config.shippingMethods.table.updatedAt', 'Updated'),\n empty: t('sales.config.shippingMethods.table.empty', 'No shipping methods yet.'),\n search: t('sales.config.shippingMethods.table.search', 'Search shipping methods\u2026'),\n },\n form: {\n createTitle: t('sales.config.shippingMethods.form.createTitle', 'Add shipping method'),\n editTitle: t('sales.config.shippingMethods.form.editTitle', 'Edit shipping method'),\n name: t('sales.config.shippingMethods.form.name', 'Name'),\n code: t('sales.config.shippingMethods.form.code', 'Code'),\n provider: t('sales.config.shippingMethods.form.provider', 'Provider'),\n description: t('sales.config.shippingMethods.form.description', 'Description'),\n carrierCode: t('sales.config.shippingMethods.form.carrierCode', 'Carrier'),\n serviceLevel: t('sales.config.shippingMethods.form.serviceLevel', 'Service level'),\n estimatedTransitDays: t(\n 'sales.config.shippingMethods.form.estimatedTransitDays',\n 'Transit days'\n ),\n baseRateNet: t('sales.config.shippingMethods.form.baseRateNet', 'Base rate (net)'),\n baseRateGross: t('sales.config.shippingMethods.form.baseRateGross', 'Base rate (gross)'),\n currencyCode: t('sales.config.shippingMethods.form.currencyCode', 'Currency'),\n isActive: t('sales.config.shippingMethods.form.isActive', 'Active'),\n providerSettings: t('sales.config.shippingMethods.form.providerSettings', 'Provider settings'),\n save: t('sales.config.shippingMethods.form.save', 'Save'),\n cancel: t('sales.config.shippingMethods.form.cancel', 'Cancel'),\n },\n messages: {\n saved: t('sales.config.shippingMethods.messages.saved', 'Shipping method saved.'),\n deleted: t('sales.config.shippingMethods.messages.deleted', 'Shipping method deleted.'),\n },\n errors: {\n load: t('sales.config.shippingMethods.errors.load', 'Failed to load shipping methods.'),\n save: t('sales.config.shippingMethods.errors.save', 'Failed to save shipping method.'),\n delete: t('sales.config.shippingMethods.errors.delete', 'Failed to delete shipping method.'),\n },\n }), [t])\n\n const [entries, setEntries] = React.useState<ShippingMethodRow[]>([])\n const [loading, setLoading] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogState | null>(null)\n const [formValues, setFormValues] = React.useState<ShippingFormValues>(DEFAULT_FORM)\n const [search, setSearch] = React.useState('')\n const [submitting, setSubmitting] = React.useState(false)\n\n const loadEntries = React.useCallback(async () => {\n setLoading(true)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/shipping-methods?pageSize=100',\n undefined,\n { errorMessage: translations.errors.load, fallback: { items: [] } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setEntries(\n items.map((item) => {\n const providerKey = typeof (item as any).providerKey === 'string'\n ? (item as any).providerKey\n : typeof (item as any)?.provider_key === 'string'\n ? (item as any).provider_key\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const baseRateGross = typeof item.baseRateGross === 'number'\n ? item.baseRateGross\n : Number((item as any)?.base_rate_gross ?? item.baseRateGross ?? 0) || 0\n const baseRateNet = typeof item.baseRateNet === 'number'\n ? item.baseRateNet\n : Number((item as any)?.base_rate_net ?? item.baseRateNet ?? 0) || 0\n const currency =\n typeof item.currencyCode === 'string'\n ? item.currencyCode\n : typeof (item as any)?.currency_code === 'string'\n ? (item as any).currency_code\n : null\n return {\n id: String(item.id ?? ''),\n name: typeof item.name === 'string' && item.name.length ? item.name : '\u2014',\n code: typeof item.code === 'string' ? item.code : '',\n providerKey,\n providerLabel: provider?.label ?? null,\n carrierCode: typeof item.carrierCode === 'string' ? item.carrierCode : null,\n description: typeof item.description === 'string' ? item.description : null,\n serviceLevel: typeof item.serviceLevel === 'string' ? item.serviceLevel : null,\n estimatedTransitDays:\n typeof (item as any)?.estimatedTransitDays === 'number'\n ? (item as any).estimatedTransitDays\n : typeof (item as any)?.estimated_transit_days === 'number'\n ? (item as any).estimated_transit_days\n : null,\n baseRateNet,\n baseRateGross,\n currencyCode: currency,\n isActive:\n typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof (item as any)?.is_active === 'boolean'\n ? (item as any).is_active\n : false,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : null,\n providerSettings:\n item && typeof (item as any).providerSettings === 'object'\n ? ((item as any).providerSettings as Record<string, unknown>)\n : null,\n }\n })\n )\n } catch (err) {\n console.error('sales.shipping-methods.list failed', err)\n flash(translations.errors.load, 'error')\n } finally {\n setLoading(false)\n }\n }, [providers, translations.errors.load])\n\n React.useEffect(() => {\n void loadEntries()\n }, [loadEntries, scopeVersion])\n\n const openCreate = React.useCallback(() => {\n const defaultProvider = providerOptions[0]?.value ?? ''\n setFormValues({\n ...DEFAULT_FORM,\n providerKey: defaultProvider,\n providerSettings: {},\n })\n setDialog({ mode: 'create' })\n }, [providerOptions])\n\n const openEdit = React.useCallback((entry: ShippingMethodRow) => {\n setFormValues({\n name: entry.name,\n code: entry.code,\n providerKey: entry.providerKey ?? '',\n description: entry.description ?? '',\n carrierCode: entry.carrierCode ?? '',\n serviceLevel: entry.serviceLevel ?? '',\n estimatedTransitDays: entry.estimatedTransitDays ?? undefined,\n baseRateNet: entry.baseRateNet,\n baseRateGross: entry.baseRateGross,\n currencyCode: entry.currencyCode ?? '',\n isActive: entry.isActive,\n providerSettings: entry.providerSettings ?? {},\n })\n setDialog({ mode: 'edit', entry })\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const deleteEntry = React.useCallback(async (entry: ShippingMethodRow) => {\n const message = translations.actions.deleteConfirm.replace('{{name}}', entry.name)\n if (!window.confirm(message)) return\n try {\n const call = await apiCall('/api/sales/shipping-methods', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.delete)\n }\n flash(translations.messages.deleted, 'success')\n await loadEntries()\n } catch (err) {\n console.error('sales.shipping-methods.delete failed', err)\n const message = err instanceof Error ? err.message : translations.errors.delete\n flash(message, 'error')\n }\n }, [loadEntries, translations.actions.deleteConfirm, translations.errors.delete, translations.messages.deleted])\n\n const columns = React.useMemo<ColumnDef<ShippingMethodRow>[]>(() => [\n {\n accessorKey: 'name',\n header: translations.table.name,\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n <span className=\"text-xs text-muted-foreground\">{row.original.code}</span>\n </div>\n ),\n },\n {\n accessorKey: 'providerKey',\n header: translations.table.provider,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.providerLabel ?? row.original.providerKey ?? '\u2014'}\n </span>\n ),\n },\n {\n accessorKey: 'rate',\n header: translations.table.rate,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.baseRateGross.toFixed(2)} {row.original.currencyCode ?? ''}\n </span>\n ),\n },\n {\n accessorKey: 'isActive',\n header: translations.table.active,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.isActive ? translations.table.statusActive : translations.table.statusInactive}\n </span>\n ),\n },\n {\n accessorKey: 'updatedAt',\n header: translations.table.updatedAt,\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.updatedAt ? new Date(row.original.updatedAt).toLocaleString() : '\u2014'}\n </span>\n ),\n },\n ], [translations])\n\n const handleSubmit = React.useCallback(async (values: ShippingFormValues) => {\n if (!dialog) return\n setSubmitting(true)\n const payload: Record<string, unknown> = {\n name: values.name.trim(),\n code: values.code.trim().toLowerCase(),\n description: values.description?.trim() || undefined,\n carrierCode: values.carrierCode?.trim() || undefined,\n providerKey: values.providerKey?.trim() || undefined,\n serviceLevel: values.serviceLevel?.trim() || undefined,\n estimatedTransitDays:\n values.estimatedTransitDays === undefined || values.estimatedTransitDays === null\n ? undefined\n : Number(values.estimatedTransitDays),\n baseRateNet: Number(values.baseRateNet ?? 0),\n baseRateGross:\n values.baseRateGross === undefined || values.baseRateGross === null\n ? Number(values.baseRateNet ?? 0)\n : Number(values.baseRateGross),\n currencyCode: values.currencyCode?.trim().toUpperCase() || undefined,\n isActive: values.isActive ?? true,\n providerSettings: isRecord(values.providerSettings) ? values.providerSettings : undefined,\n }\n const path = '/api/sales/shipping-methods'\n const method = dialog.mode === 'create' ? 'POST' : 'PUT'\n if (dialog.mode === 'edit') payload.id = dialog.entry.id\n try {\n const call = await apiCall(path, {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.save)\n }\n flash(translations.messages.saved, 'success')\n await loadEntries()\n closeDialog()\n } catch (err) {\n console.error('sales.shipping-methods.save failed', err)\n const message = err instanceof Error ? err.message : translations.errors.save\n flash(message, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [closeDialog, dialog, loadEntries, translations.errors.save, translations.messages.saved])\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', label: translations.form.name, type: 'text', required: true },\n { id: 'code', label: translations.form.code, type: 'text', required: true },\n {\n id: 'providerKey',\n label: translations.form.provider,\n type: 'select',\n required: false,\n options: providerOptions,\n },\n { id: 'carrierCode', label: translations.form.carrierCode, type: 'text' },\n { id: 'serviceLevel', label: translations.form.serviceLevel, type: 'text' },\n {\n id: 'estimatedTransitDays',\n label: translations.form.estimatedTransitDays,\n type: 'number',\n layout: 'half',\n },\n {\n id: 'baseRateNet',\n label: translations.form.baseRateNet,\n type: 'number',\n required: true,\n layout: 'half',\n },\n {\n id: 'baseRateGross',\n label: translations.form.baseRateGross,\n type: 'number',\n required: false,\n layout: 'half',\n },\n {\n id: 'currencyCode',\n label: translations.form.currencyCode,\n type: 'text',\n layout: 'half',\n },\n { id: 'description', label: translations.form.description, type: 'textarea' },\n { id: 'isActive', label: translations.form.isActive, type: 'checkbox' },\n {\n id: 'providerSettings',\n label: translations.form.providerSettings,\n type: 'custom',\n component: ProviderSettingsField,\n },\n ], [ProviderSettingsField, providerOptions, translations.form.baseRateGross, translations.form.baseRateNet, translations.form.carrierCode, translations.form.code, translations.form.currencyCode, translations.form.description, translations.form.estimatedTransitDays, translations.form.isActive, translations.form.name, translations.form.provider, translations.form.providerSettings, translations.form.serviceLevel])\n\n const filteredEntries = React.useMemo(() => {\n if (!search.trim()) return entries\n const term = search.trim().toLowerCase()\n return entries.filter(\n (entry) =>\n entry.name.toLowerCase().includes(term) ||\n entry.code.toLowerCase().includes(term) ||\n (entry.providerLabel ?? '').toLowerCase().includes(term) ||\n (entry.providerKey ?? '').toLowerCase().includes(term)\n )\n }, [entries, search])\n\n return (\n <section className=\"rounded border bg-card text-card-foreground shadow-sm\">\n <div className=\"border-b px-6 py-4 space-y-1\">\n <h2 className=\"text-lg font-medium\">{translations.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{translations.description}</p>\n </div>\n <div className=\"px-2 py-4 sm:px-4\">\n <DataTable\n embedded\n isLoading={loading}\n columns={columns}\n data={filteredEntries}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder={translations.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{translations.table.empty}</p>}\n actions={(\n <Button size=\"sm\" onClick={openCreate}>\n {translations.actions.add}\n </Button>\n )}\n refreshButton={{\n label: translations.actions.refresh,\n onRefresh: () => { void loadEntries() },\n isRefreshing: loading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: translations.actions.edit, onSelect: () => openEdit(row) },\n { id: 'delete', label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) },\n ]}\n />\n )}\n />\n </div>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit' ? translations.form.editTitle : translations.form.createTitle}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n schema={shippingFormSchema}\n fields={fields}\n initialValues={formValues}\n submitLabel={translations.form.save}\n cancelHref={undefined}\n embedded\n onSubmit={handleSubmit}\n isLoading={submitting}\n twoColumn\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {translations.form.cancel}\n </Button>\n )}\n />\n </DialogContent>\n </Dialog>\n </section>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n listShippingProviders,\n type ProviderSettingField,\n type ShippingProvider,\n} from '../lib/providers'\n\ntype ShippingMethodRow = {\n id: string\n name: string\n code: string\n providerKey: string | null\n providerLabel: string | null\n carrierCode: string | null\n description: string | null\n serviceLevel: string | null\n estimatedTransitDays: number | null\n baseRateNet: number\n baseRateGross: number\n currencyCode: string | null\n isActive: boolean\n updatedAt: string | null\n providerSettings: Record<string, unknown> | null\n}\n\ntype DialogState =\n | { mode: 'create' }\n | { mode: 'edit'; entry: ShippingMethodRow }\n\nconst shippingFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n providerKey: z.string().trim().optional(),\n description: z.string().optional(),\n carrierCode: z.string().optional(),\n serviceLevel: z.string().optional(),\n estimatedTransitDays: z.coerce.number().min(0).optional(),\n baseRateNet: z.coerce.number().min(0),\n baseRateGross: z.coerce.number().min(0).optional(),\n currencyCode: z.string().trim().optional(),\n isActive: z.boolean().optional(),\n providerSettings: z.record(z.string(), z.unknown()).optional(),\n})\n\ntype ShippingFormValues = z.infer<typeof shippingFormSchema>\n\nconst DEFAULT_FORM: ShippingFormValues = {\n name: '',\n code: '',\n providerKey: '',\n description: '',\n carrierCode: '',\n serviceLevel: '',\n estimatedTransitDays: undefined,\n baseRateNet: 0,\n baseRateGross: 0,\n currencyCode: '',\n isActive: true,\n providerSettings: {},\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction renderFieldInput(opts: {\n field: ProviderSettingField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const { field, value, onChange } = opts\n const common = { id: field.key, 'data-provider-setting': field.key }\n switch (field.type) {\n case 'textarea':\n return (\n <Textarea\n {...common}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <Input\n {...common}\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? String(value) : ''}\n onChange={(evt) => onChange(evt.target.value === '' ? '' : Number(evt.target.value))}\n placeholder={field.placeholder}\n />\n )\n case 'boolean':\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <Switch\n id={field.key}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n <Label htmlFor={field.key}>{field.placeholder ?? ''}</Label>\n </div>\n )\n case 'select':\n return (\n <select\n {...common}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n >\n <option value=\"\">\u2014</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n case 'secret':\n return (\n <Input\n {...common}\n type=\"password\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'url':\n case 'text':\n default:\n return (\n <Input\n {...common}\n type={field.type === 'url' ? 'url' : 'text'}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\ntype RateRule = {\n id?: string\n name?: string\n metric?: string\n min?: number | null\n max?: number | null\n amountNet?: number | null\n amountGross?: number | null\n currencyCode?: string | null\n}\n\ntype FlatRateLabels = {\n title: string\n add: string\n metric: string\n min: string\n max: string\n amountNet: string\n amountGross: string\n currency: string\n remove: string\n applyBaseRate: string\n}\n\nfunction FlatRateSettingsEditor(props: {\n value: Record<string, unknown>\n onChange: (next: Record<string, unknown>) => void\n translations: FlatRateLabels\n currencyCode?: string | null\n}) {\n const { value, onChange, translations, currencyCode } = props\n const rates = Array.isArray(value.rates) ? (value.rates as RateRule[]) : []\n const applyBaseRate = value.applyBaseRate !== false\n const metrics: Array<{ value: string; label: string }> = [\n { value: 'item_count', label: 'Item count' },\n { value: 'weight', label: 'Total weight' },\n { value: 'volume', label: 'Total volume' },\n { value: 'subtotal', label: 'Subtotal' },\n ]\n\n const updateRates = (nextRates: RateRule[]) => {\n onChange({ ...value, rates: nextRates })\n }\n\n const updateRate = (index: number, key: keyof RateRule, nextValue: unknown) => {\n const next = rates.map((rate, idx) =>\n idx === index ? { ...rate, [key]: nextValue } : rate\n )\n updateRates(next)\n }\n\n const addRate = () => {\n updateRates([\n ...rates,\n {\n id: crypto.randomUUID?.() ?? String(Date.now()),\n name: '',\n metric: 'item_count',\n min: 0,\n max: null,\n amountNet: 0,\n amountGross: 0,\n currencyCode: currencyCode ?? '',\n },\n ])\n }\n\n const removeRate = (index: number) => {\n updateRates(rates.filter((_, idx) => idx !== index))\n }\n\n return (\n <div className=\"space-y-3 rounded-md border border-dashed border-border p-3\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">{translations.title}</p>\n <Button size=\"sm\" variant=\"outline\" type=\"button\" onClick={addRate}>\n {translations.add}\n </Button>\n </div>\n <div className=\"space-y-3\">\n {rates.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{translations.add}</p>\n ) : (\n rates.map((rate, index) => (\n <div key={rate.id ?? index} className=\"rounded-md border border-border p-3 space-y-2\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.metric}</Label>\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={rate.metric ?? 'item_count'}\n onChange={(evt) => updateRate(index, 'metric', evt.target.value)}\n >\n {metrics.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.min}</Label>\n <Input\n type=\"number\"\n value={rate.min ?? ''}\n onChange={(evt) => updateRate(index, 'min', evt.target.value === '' ? null : Number(evt.target.value))}\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.max}</Label>\n <Input\n type=\"number\"\n value={rate.max ?? ''}\n onChange={(evt) => updateRate(index, 'max', evt.target.value === '' ? null : Number(evt.target.value))}\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.amountNet}</Label>\n <Input\n type=\"number\"\n value={rate.amountNet ?? ''}\n onChange={(evt) =>\n updateRate(index, 'amountNet', evt.target.value === '' ? null : Number(evt.target.value))\n }\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.amountGross}</Label>\n <Input\n type=\"number\"\n value={rate.amountGross ?? ''}\n onChange={(evt) =>\n updateRate(index, 'amountGross', evt.target.value === '' ? null : Number(evt.target.value))\n }\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{translations.currency}</Label>\n <Input\n type=\"text\"\n value={rate.currencyCode ?? currencyCode ?? ''}\n onChange={(evt) =>\n updateRate(index, 'currencyCode', evt.target.value?.toUpperCase?.() ?? '')\n }\n />\n </div>\n </div>\n <div className=\"flex justify-end\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => removeRate(index)}>\n {translations.remove}\n </Button>\n </div>\n </div>\n ))\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"apply-base-rate\"\n checked={applyBaseRate}\n onCheckedChange={(checked) => onChange({ ...value, applyBaseRate: checked })}\n />\n <Label htmlFor=\"apply-base-rate\" className=\"text-sm\">\n {translations.applyBaseRate}\n </Label>\n </div>\n </div>\n )\n}\n\nfunction createShippingProviderSettingsRenderer(params: {\n providers: ShippingProvider[]\n selectPrompt: string\n noFieldsLabel: string\n flatRateLabels: FlatRateLabels\n}) {\n const { providers, selectPrompt, noFieldsLabel, flatRateLabels } = params\n return function ShippingProviderSettingsField({\n value,\n setValue,\n values,\n }: CrudCustomFieldRenderProps) {\n const providerKey =\n values && typeof values.providerKey === 'string' && values.providerKey.trim().length\n ? values.providerKey\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const previousKey = React.useRef<string | null>(providerKey)\n\n React.useEffect(() => {\n if (providerKey !== previousKey.current) {\n const defaults = provider?.settings?.defaults ?? null\n setValue(defaults && typeof defaults === 'object' ? defaults : {})\n previousKey.current = providerKey\n }\n }, [providerKey, provider, setValue])\n\n if (!provider) {\n return <p className=\"text-sm text-muted-foreground\">{selectPrompt}</p>\n }\n\n const settings = isRecord(value) ? value : {}\n const fields = provider.settings?.fields ?? []\n if (provider.key === 'flat-rate') {\n return (\n <FlatRateSettingsEditor\n value={settings}\n onChange={(next) => setValue(next)}\n translations={flatRateLabels}\n currencyCode={typeof values?.currencyCode === 'string' ? values.currencyCode : ''}\n />\n )\n }\n if (!fields.length) {\n return <p className=\"text-sm text-muted-foreground\">{noFieldsLabel}</p>\n }\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const fieldValue = settings[field.key]\n return (\n <div key={field.key} className=\"space-y-1.5\">\n <Label htmlFor={field.key} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </Label>\n {field.description ? (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n ) : null}\n {renderFieldInput({\n field,\n value: fieldValue,\n onChange: (next) => setValue({ ...settings, [field.key]: next }),\n })}\n </div>\n )\n })}\n </div>\n )\n }\n}\n\nexport function ShippingMethodsSettings() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const providers = React.useMemo(() => listShippingProviders(), [])\n const providerOptions = React.useMemo(\n () => providers.map((provider) => ({ value: provider.key, label: provider.label })),\n [providers]\n )\n const flatRateLabels = React.useMemo(() => ({\n title: t('sales.config.shippingMethods.form.ratesTitle', 'Rates'),\n add: t('sales.config.shippingMethods.form.addRate', 'Add rate'),\n metric: t('sales.config.shippingMethods.form.metric', 'Metric'),\n min: t('sales.config.shippingMethods.form.min', 'Min'),\n max: t('sales.config.shippingMethods.form.max', 'Max'),\n amountNet: t('sales.config.shippingMethods.form.amountNet', 'Amount (net)'),\n amountGross: t('sales.config.shippingMethods.form.amountGross', 'Amount (gross)'),\n currency: t('sales.config.shippingMethods.form.currency', 'Currency'),\n remove: t('sales.config.shippingMethods.form.removeRate', 'Remove'),\n applyBaseRate: t(\n 'sales.config.shippingMethods.form.applyBaseRate',\n 'Always include the base rate'\n ),\n }), [t])\n const ProviderSettingsField = React.useMemo(\n () =>\n createShippingProviderSettingsRenderer({\n providers,\n selectPrompt: t(\n 'sales.config.shippingMethods.form.selectProvider',\n 'Choose a provider to configure settings.'\n ),\n noFieldsLabel: t('sales.config.shippingMethods.form.noSettings', 'No configurable settings.'),\n flatRateLabels,\n }),\n [flatRateLabels, providers, t]\n )\n\n const translations = React.useMemo(() => ({\n title: t('sales.config.shippingMethods.title', 'Shipping methods'),\n description: t(\n 'sales.config.shippingMethods.description',\n 'Manage carriers, providers, and default shipping prices.'\n ),\n actions: {\n add: t('sales.config.shippingMethods.actions.add', 'Add shipping method'),\n edit: t('sales.config.shippingMethods.actions.edit', 'Edit'),\n delete: t('sales.config.shippingMethods.actions.delete', 'Delete'),\n deleteConfirm: t('sales.config.shippingMethods.actions.deleteConfirm', 'Delete \"{{name}}\"?'),\n refresh: t('sales.config.shippingMethods.actions.refresh', 'Refresh'),\n },\n table: {\n name: t('sales.config.shippingMethods.table.name', 'Name'),\n code: t('sales.config.shippingMethods.table.code', 'Code'),\n provider: t('sales.config.shippingMethods.table.provider', 'Provider'),\n rate: t('sales.config.shippingMethods.table.rate', 'Base rate'),\n currency: t('sales.config.shippingMethods.table.currency', 'Currency'),\n active: t('sales.config.shippingMethods.table.active', 'Active'),\n statusActive: t('sales.config.shippingMethods.table.statusActive', 'Active'),\n statusInactive: t('sales.config.shippingMethods.table.statusInactive', 'Inactive'),\n updatedAt: t('sales.config.shippingMethods.table.updatedAt', 'Updated'),\n empty: t('sales.config.shippingMethods.table.empty', 'No shipping methods yet.'),\n search: t('sales.config.shippingMethods.table.search', 'Search shipping methods\u2026'),\n },\n form: {\n createTitle: t('sales.config.shippingMethods.form.createTitle', 'Add shipping method'),\n editTitle: t('sales.config.shippingMethods.form.editTitle', 'Edit shipping method'),\n name: t('sales.config.shippingMethods.form.name', 'Name'),\n code: t('sales.config.shippingMethods.form.code', 'Code'),\n provider: t('sales.config.shippingMethods.form.provider', 'Provider'),\n description: t('sales.config.shippingMethods.form.description', 'Description'),\n carrierCode: t('sales.config.shippingMethods.form.carrierCode', 'Carrier'),\n serviceLevel: t('sales.config.shippingMethods.form.serviceLevel', 'Service level'),\n estimatedTransitDays: t(\n 'sales.config.shippingMethods.form.estimatedTransitDays',\n 'Transit days'\n ),\n baseRateNet: t('sales.config.shippingMethods.form.baseRateNet', 'Base rate (net)'),\n baseRateGross: t('sales.config.shippingMethods.form.baseRateGross', 'Base rate (gross)'),\n currencyCode: t('sales.config.shippingMethods.form.currencyCode', 'Currency'),\n isActive: t('sales.config.shippingMethods.form.isActive', 'Active'),\n providerSettings: t('sales.config.shippingMethods.form.providerSettings', 'Provider settings'),\n save: t('sales.config.shippingMethods.form.save', 'Save'),\n cancel: t('sales.config.shippingMethods.form.cancel', 'Cancel'),\n },\n messages: {\n saved: t('sales.config.shippingMethods.messages.saved', 'Shipping method saved.'),\n deleted: t('sales.config.shippingMethods.messages.deleted', 'Shipping method deleted.'),\n },\n errors: {\n load: t('sales.config.shippingMethods.errors.load', 'Failed to load shipping methods.'),\n save: t('sales.config.shippingMethods.errors.save', 'Failed to save shipping method.'),\n delete: t('sales.config.shippingMethods.errors.delete', 'Failed to delete shipping method.'),\n },\n }), [t])\n\n const [entries, setEntries] = React.useState<ShippingMethodRow[]>([])\n const [loading, setLoading] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogState | null>(null)\n const [formValues, setFormValues] = React.useState<ShippingFormValues>(DEFAULT_FORM)\n const [search, setSearch] = React.useState('')\n const [submitting, setSubmitting] = React.useState(false)\n\n const loadEntries = React.useCallback(async () => {\n setLoading(true)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/shipping-methods?pageSize=100',\n undefined,\n { errorMessage: translations.errors.load, fallback: { items: [] } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setEntries(\n items.map((item) => {\n const providerKey = typeof (item as any).providerKey === 'string'\n ? (item as any).providerKey\n : typeof (item as any)?.provider_key === 'string'\n ? (item as any).provider_key\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const baseRateGross = typeof item.baseRateGross === 'number'\n ? item.baseRateGross\n : Number((item as any)?.base_rate_gross ?? item.baseRateGross ?? 0) || 0\n const baseRateNet = typeof item.baseRateNet === 'number'\n ? item.baseRateNet\n : Number((item as any)?.base_rate_net ?? item.baseRateNet ?? 0) || 0\n const currency =\n typeof item.currencyCode === 'string'\n ? item.currencyCode\n : typeof (item as any)?.currency_code === 'string'\n ? (item as any).currency_code\n : null\n return {\n id: String(item.id ?? ''),\n name: typeof item.name === 'string' && item.name.length ? item.name : '\u2014',\n code: typeof item.code === 'string' ? item.code : '',\n providerKey,\n providerLabel: provider?.label ?? null,\n carrierCode: typeof item.carrierCode === 'string' ? item.carrierCode : null,\n description: typeof item.description === 'string' ? item.description : null,\n serviceLevel: typeof item.serviceLevel === 'string' ? item.serviceLevel : null,\n estimatedTransitDays:\n typeof (item as any)?.estimatedTransitDays === 'number'\n ? (item as any).estimatedTransitDays\n : typeof (item as any)?.estimated_transit_days === 'number'\n ? (item as any).estimated_transit_days\n : null,\n baseRateNet,\n baseRateGross,\n currencyCode: currency,\n isActive:\n typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof (item as any)?.is_active === 'boolean'\n ? (item as any).is_active\n : false,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : null,\n providerSettings:\n item && typeof (item as any).providerSettings === 'object'\n ? ((item as any).providerSettings as Record<string, unknown>)\n : null,\n }\n })\n )\n } catch (err) {\n console.error('sales.shipping-methods.list failed', err)\n flash(translations.errors.load, 'error')\n } finally {\n setLoading(false)\n }\n }, [providers, translations.errors.load])\n\n React.useEffect(() => {\n void loadEntries()\n }, [loadEntries, scopeVersion])\n\n const openCreate = React.useCallback(() => {\n const defaultProvider = providerOptions[0]?.value ?? ''\n setFormValues({\n ...DEFAULT_FORM,\n providerKey: defaultProvider,\n providerSettings: {},\n })\n setDialog({ mode: 'create' })\n }, [providerOptions])\n\n const openEdit = React.useCallback((entry: ShippingMethodRow) => {\n setFormValues({\n name: entry.name,\n code: entry.code,\n providerKey: entry.providerKey ?? '',\n description: entry.description ?? '',\n carrierCode: entry.carrierCode ?? '',\n serviceLevel: entry.serviceLevel ?? '',\n estimatedTransitDays: entry.estimatedTransitDays ?? undefined,\n baseRateNet: entry.baseRateNet,\n baseRateGross: entry.baseRateGross,\n currencyCode: entry.currencyCode ?? '',\n isActive: entry.isActive,\n providerSettings: entry.providerSettings ?? {},\n })\n setDialog({ mode: 'edit', entry })\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const deleteEntry = React.useCallback(async (entry: ShippingMethodRow) => {\n const message = translations.actions.deleteConfirm.replace('{{name}}', entry.name)\n if (!window.confirm(message)) return\n try {\n const call = await apiCall('/api/sales/shipping-methods', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.delete)\n }\n flash(translations.messages.deleted, 'success')\n await loadEntries()\n } catch (err) {\n console.error('sales.shipping-methods.delete failed', err)\n const message = err instanceof Error ? err.message : translations.errors.delete\n flash(message, 'error')\n }\n }, [loadEntries, translations.actions.deleteConfirm, translations.errors.delete, translations.messages.deleted])\n\n const columns = React.useMemo<ColumnDef<ShippingMethodRow>[]>(() => [\n {\n accessorKey: 'name',\n header: translations.table.name,\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n <span className=\"text-xs text-muted-foreground\">{row.original.code}</span>\n </div>\n ),\n },\n {\n accessorKey: 'providerKey',\n header: translations.table.provider,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.providerLabel ?? row.original.providerKey ?? '\u2014'}\n </span>\n ),\n },\n {\n accessorKey: 'rate',\n header: translations.table.rate,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.baseRateGross.toFixed(2)} {row.original.currencyCode ?? ''}\n </span>\n ),\n },\n {\n accessorKey: 'isActive',\n header: translations.table.active,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.isActive ? translations.table.statusActive : translations.table.statusInactive}\n </span>\n ),\n },\n {\n accessorKey: 'updatedAt',\n header: translations.table.updatedAt,\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.updatedAt ? new Date(row.original.updatedAt).toLocaleString() : '\u2014'}\n </span>\n ),\n },\n ], [translations])\n\n const handleSubmit = React.useCallback(async (values: ShippingFormValues) => {\n if (!dialog) return\n setSubmitting(true)\n const payload: Record<string, unknown> = {\n name: values.name.trim(),\n code: values.code.trim().toLowerCase(),\n description: values.description?.trim() || undefined,\n carrierCode: values.carrierCode?.trim() || undefined,\n providerKey: values.providerKey?.trim() || undefined,\n serviceLevel: values.serviceLevel?.trim() || undefined,\n estimatedTransitDays:\n values.estimatedTransitDays === undefined || values.estimatedTransitDays === null\n ? undefined\n : Number(values.estimatedTransitDays),\n baseRateNet: Number(values.baseRateNet ?? 0),\n baseRateGross:\n values.baseRateGross === undefined || values.baseRateGross === null\n ? Number(values.baseRateNet ?? 0)\n : Number(values.baseRateGross),\n currencyCode: values.currencyCode?.trim().toUpperCase() || undefined,\n isActive: values.isActive ?? true,\n providerSettings: isRecord(values.providerSettings) ? values.providerSettings : undefined,\n }\n const path = '/api/sales/shipping-methods'\n const method = dialog.mode === 'create' ? 'POST' : 'PUT'\n if (dialog.mode === 'edit') payload.id = dialog.entry.id\n try {\n const call = await apiCall(path, {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.save)\n }\n flash(translations.messages.saved, 'success')\n await loadEntries()\n closeDialog()\n } catch (err) {\n console.error('sales.shipping-methods.save failed', err)\n const message = err instanceof Error ? err.message : translations.errors.save\n flash(message, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [closeDialog, dialog, loadEntries, translations.errors.save, translations.messages.saved])\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', label: translations.form.name, type: 'text', required: true },\n { id: 'code', label: translations.form.code, type: 'text', required: true },\n {\n id: 'providerKey',\n label: translations.form.provider,\n type: 'select',\n required: false,\n options: providerOptions,\n },\n { id: 'carrierCode', label: translations.form.carrierCode, type: 'text' },\n { id: 'serviceLevel', label: translations.form.serviceLevel, type: 'text' },\n {\n id: 'estimatedTransitDays',\n label: translations.form.estimatedTransitDays,\n type: 'number',\n layout: 'half',\n },\n {\n id: 'baseRateNet',\n label: translations.form.baseRateNet,\n type: 'number',\n required: true,\n layout: 'half',\n },\n {\n id: 'baseRateGross',\n label: translations.form.baseRateGross,\n type: 'number',\n required: false,\n layout: 'half',\n },\n {\n id: 'currencyCode',\n label: translations.form.currencyCode,\n type: 'text',\n layout: 'half',\n },\n { id: 'description', label: translations.form.description, type: 'textarea' },\n { id: 'isActive', label: translations.form.isActive, type: 'checkbox' },\n {\n id: 'providerSettings',\n label: translations.form.providerSettings,\n type: 'custom',\n component: ProviderSettingsField,\n },\n ], [ProviderSettingsField, providerOptions, translations.form.baseRateGross, translations.form.baseRateNet, translations.form.carrierCode, translations.form.code, translations.form.currencyCode, translations.form.description, translations.form.estimatedTransitDays, translations.form.isActive, translations.form.name, translations.form.provider, translations.form.providerSettings, translations.form.serviceLevel])\n\n const filteredEntries = React.useMemo(() => {\n if (!search.trim()) return entries\n const term = search.trim().toLowerCase()\n return entries.filter(\n (entry) =>\n entry.name.toLowerCase().includes(term) ||\n entry.code.toLowerCase().includes(term) ||\n (entry.providerLabel ?? '').toLowerCase().includes(term) ||\n (entry.providerKey ?? '').toLowerCase().includes(term)\n )\n }, [entries, search])\n\n return (\n <section className=\"rounded border bg-card text-card-foreground shadow-sm\">\n <div className=\"border-b px-6 py-4 space-y-1\">\n <h2 className=\"text-lg font-medium\">{translations.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{translations.description}</p>\n </div>\n <div className=\"px-2 py-4 sm:px-4\">\n <DataTable\n embedded\n isLoading={loading}\n columns={columns}\n data={filteredEntries}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder={translations.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{translations.table.empty}</p>}\n actions={(\n <Button size=\"sm\" onClick={openCreate}>\n {translations.actions.add}\n </Button>\n )}\n refreshButton={{\n label: translations.actions.refresh,\n onRefresh: () => { void loadEntries() },\n isRefreshing: loading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { label: translations.actions.edit, onSelect: () => openEdit(row) },\n { label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) },\n ]}\n />\n )}\n />\n </div>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit' ? translations.form.editTitle : translations.form.createTitle}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n schema={shippingFormSchema}\n fields={fields}\n initialValues={formValues}\n submitLabel={translations.form.save}\n cancelHref={undefined}\n embedded\n onSubmit={handleSubmit}\n isLoading={submitting}\n twoColumn\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {translations.form.cancel}\n </Button>\n )}\n />\n </DialogContent>\n </Dialog>\n </section>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["message"]
7
7
  }
@@ -283,8 +283,8 @@ function TaxRatesSettings() {
283
283
  RowActions,
284
284
  {
285
285
  items: [
286
- { id: "edit", label: translations.actions.edit, onSelect: () => openEdit(row) },
287
- { id: "delete", label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) }
286
+ { label: translations.actions.edit, onSelect: () => openEdit(row) },
287
+ { label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) }
288
288
  ]
289
289
  }
290
290
  )