@endora-commerce/mod-orders 0.0.0-stage → 0.100.0

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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -2
  3. package/dist/admin/components/OrderSavedViews.d.ts +23 -0
  4. package/dist/admin/components/OrderSavedViews.d.ts.map +1 -0
  5. package/dist/admin/components/OrderSavedViews.js +68 -0
  6. package/dist/admin/components/OrderSavedViews.js.map +1 -0
  7. package/dist/admin/components/OrderShipmentsTab.d.ts +36 -0
  8. package/dist/admin/components/OrderShipmentsTab.d.ts.map +1 -0
  9. package/dist/admin/components/OrderShipmentsTab.js +158 -0
  10. package/dist/admin/components/OrderShipmentsTab.js.map +1 -0
  11. package/dist/admin/components/OrdersBulkStatusDialog.d.ts +24 -0
  12. package/dist/admin/components/OrdersBulkStatusDialog.d.ts.map +1 -0
  13. package/dist/admin/components/OrdersBulkStatusDialog.js +36 -0
  14. package/dist/admin/components/OrdersBulkStatusDialog.js.map +1 -0
  15. package/dist/admin/components/StatusColorPicker.d.ts +14 -0
  16. package/dist/admin/components/StatusColorPicker.d.ts.map +1 -0
  17. package/dist/admin/components/StatusColorPicker.js +13 -0
  18. package/dist/admin/components/StatusColorPicker.js.map +1 -0
  19. package/dist/admin/index.d.ts +49 -0
  20. package/dist/admin/index.d.ts.map +1 -0
  21. package/dist/admin/index.js +171 -0
  22. package/dist/admin/index.js.map +1 -0
  23. package/dist/admin/lib/paymentStatus.d.ts +39 -0
  24. package/dist/admin/lib/paymentStatus.d.ts.map +1 -0
  25. package/dist/admin/lib/paymentStatus.js +46 -0
  26. package/dist/admin/lib/paymentStatus.js.map +1 -0
  27. package/dist/admin/pages/OrderCreatePage.d.ts +19 -0
  28. package/dist/admin/pages/OrderCreatePage.d.ts.map +1 -0
  29. package/dist/admin/pages/OrderCreatePage.js +382 -0
  30. package/dist/admin/pages/OrderCreatePage.js.map +1 -0
  31. package/dist/admin/pages/OrderDetail.d.ts +88 -0
  32. package/dist/admin/pages/OrderDetail.d.ts.map +1 -0
  33. package/dist/admin/pages/OrderDetail.js +233 -0
  34. package/dist/admin/pages/OrderDetail.js.map +1 -0
  35. package/dist/admin/pages/OrderStatusConfigPage.d.ts +9 -0
  36. package/dist/admin/pages/OrderStatusConfigPage.d.ts.map +1 -0
  37. package/dist/admin/pages/OrderStatusConfigPage.js +162 -0
  38. package/dist/admin/pages/OrderStatusConfigPage.js.map +1 -0
  39. package/dist/admin/pages/OrdersList.d.ts +9 -0
  40. package/dist/admin/pages/OrdersList.d.ts.map +1 -0
  41. package/dist/admin/pages/OrdersList.js +464 -0
  42. package/dist/admin/pages/OrdersList.js.map +1 -0
  43. package/dist/admin/zones/OrderEntryStandardTab.d.ts +27 -0
  44. package/dist/admin/zones/OrderEntryStandardTab.d.ts.map +1 -0
  45. package/dist/admin/zones/OrderEntryStandardTab.js +32 -0
  46. package/dist/admin/zones/OrderEntryStandardTab.js.map +1 -0
  47. package/dist/backend/domain/credit-limit-reservation.d.ts +31 -0
  48. package/dist/backend/domain/credit-limit-reservation.d.ts.map +1 -0
  49. package/dist/backend/domain/credit-limit-reservation.js +29 -0
  50. package/dist/backend/domain/credit-limit-reservation.js.map +1 -0
  51. package/dist/backend/domain/customer-cancellation.d.ts +107 -0
  52. package/dist/backend/domain/customer-cancellation.d.ts.map +1 -0
  53. package/dist/backend/domain/customer-cancellation.js +92 -0
  54. package/dist/backend/domain/customer-cancellation.js.map +1 -0
  55. package/dist/backend/domain/order-status-graph.d.ts +114 -0
  56. package/dist/backend/domain/order-status-graph.d.ts.map +1 -0
  57. package/dist/backend/domain/order-status-graph.js +190 -0
  58. package/dist/backend/domain/order-status-graph.js.map +1 -0
  59. package/dist/backend/domain/status-authorship.d.ts +79 -0
  60. package/dist/backend/domain/status-authorship.d.ts.map +1 -0
  61. package/dist/backend/domain/status-authorship.js +84 -0
  62. package/dist/backend/domain/status-authorship.js.map +1 -0
  63. package/dist/backend/email-templates/adapter-line-baselines.d.ts +29 -0
  64. package/dist/backend/email-templates/adapter-line-baselines.d.ts.map +1 -0
  65. package/dist/backend/email-templates/adapter-line-baselines.js +35 -0
  66. package/dist/backend/email-templates/adapter-line-baselines.js.map +1 -0
  67. package/dist/backend/email-templates/admin-created-order.d.ts +12 -0
  68. package/dist/backend/email-templates/admin-created-order.d.ts.map +1 -0
  69. package/dist/backend/email-templates/admin-created-order.js +18 -0
  70. package/dist/backend/email-templates/admin-created-order.js.map +1 -0
  71. package/dist/backend/email-templates/order-comment-notification.d.ts +13 -0
  72. package/dist/backend/email-templates/order-comment-notification.d.ts.map +1 -0
  73. package/dist/backend/email-templates/order-comment-notification.js +26 -0
  74. package/dist/backend/email-templates/order-comment-notification.js.map +1 -0
  75. package/dist/backend/email-templates/order-confirmation.d.ts +89 -0
  76. package/dist/backend/email-templates/order-confirmation.d.ts.map +1 -0
  77. package/dist/backend/email-templates/order-confirmation.default.d.ts +6 -0
  78. package/dist/backend/email-templates/order-confirmation.default.d.ts.map +1 -0
  79. package/dist/backend/email-templates/order-confirmation.default.js +70 -0
  80. package/dist/backend/email-templates/order-confirmation.default.js.map +1 -0
  81. package/dist/backend/email-templates/order-confirmation.js +144 -0
  82. package/dist/backend/email-templates/order-confirmation.js.map +1 -0
  83. package/dist/backend/email-templates/reorder-created.d.ts +11 -0
  84. package/dist/backend/email-templates/reorder-created.d.ts.map +1 -0
  85. package/dist/backend/email-templates/reorder-created.js +17 -0
  86. package/dist/backend/email-templates/reorder-created.js.map +1 -0
  87. package/dist/backend/email-templates/secondary-defaults.d.ts +16 -0
  88. package/dist/backend/email-templates/secondary-defaults.d.ts.map +1 -0
  89. package/dist/backend/email-templates/secondary-defaults.js +71 -0
  90. package/dist/backend/email-templates/secondary-defaults.js.map +1 -0
  91. package/dist/backend/entities/order-applied-promotion.entity.d.ts +15 -0
  92. package/dist/backend/entities/order-applied-promotion.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/order-applied-promotion.entity.js +56 -0
  94. package/dist/backend/entities/order-applied-promotion.entity.js.map +1 -0
  95. package/dist/backend/entities/order-comment.entity.d.ts +22 -0
  96. package/dist/backend/entities/order-comment.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/order-comment.entity.js +72 -0
  98. package/dist/backend/entities/order-comment.entity.js.map +1 -0
  99. package/dist/backend/entities/order-item.entity.d.ts +32 -0
  100. package/dist/backend/entities/order-item.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/order-item.entity.js +87 -0
  102. package/dist/backend/entities/order-item.entity.js.map +1 -0
  103. package/dist/backend/entities/order-list-saved-view.entity.d.ts +32 -0
  104. package/dist/backend/entities/order-list-saved-view.entity.d.ts.map +1 -0
  105. package/dist/backend/entities/order-list-saved-view.entity.js +82 -0
  106. package/dist/backend/entities/order-list-saved-view.entity.js.map +1 -0
  107. package/dist/backend/entities/order-placement-intent.entity.d.ts +33 -0
  108. package/dist/backend/entities/order-placement-intent.entity.d.ts.map +1 -0
  109. package/dist/backend/entities/order-placement-intent.entity.js +91 -0
  110. package/dist/backend/entities/order-placement-intent.entity.js.map +1 -0
  111. package/dist/backend/entities/order-status-transition.entity.d.ts +18 -0
  112. package/dist/backend/entities/order-status-transition.entity.d.ts.map +1 -0
  113. package/dist/backend/entities/order-status-transition.entity.js +56 -0
  114. package/dist/backend/entities/order-status-transition.entity.js.map +1 -0
  115. package/dist/backend/entities/order-status.entity.d.ts +29 -0
  116. package/dist/backend/entities/order-status.entity.d.ts.map +1 -0
  117. package/dist/backend/entities/order-status.entity.js +90 -0
  118. package/dist/backend/entities/order-status.entity.js.map +1 -0
  119. package/dist/backend/entities/order.entity.d.ts +142 -0
  120. package/dist/backend/entities/order.entity.d.ts.map +1 -0
  121. package/dist/backend/entities/order.entity.js +255 -0
  122. package/dist/backend/entities/order.entity.js.map +1 -0
  123. package/dist/backend/events/order-status-events.d.ts +77 -0
  124. package/dist/backend/events/order-status-events.d.ts.map +1 -0
  125. package/dist/backend/events/order-status-events.js +97 -0
  126. package/dist/backend/events/order-status-events.js.map +1 -0
  127. package/dist/backend/index.d.ts +191 -0
  128. package/dist/backend/index.d.ts.map +1 -0
  129. package/dist/backend/index.js +605 -0
  130. package/dist/backend/index.js.map +1 -0
  131. package/dist/backend/plugin.d.ts +344 -0
  132. package/dist/backend/plugin.d.ts.map +1 -0
  133. package/dist/backend/plugin.js +232 -0
  134. package/dist/backend/plugin.js.map +1 -0
  135. package/dist/backend/prompt-tools.d.ts +34 -0
  136. package/dist/backend/prompt-tools.d.ts.map +1 -0
  137. package/dist/backend/prompt-tools.js +146 -0
  138. package/dist/backend/prompt-tools.js.map +1 -0
  139. package/dist/backend/routes.d.ts +123 -0
  140. package/dist/backend/routes.d.ts.map +1 -0
  141. package/dist/backend/routes.external.d.ts +30 -0
  142. package/dist/backend/routes.external.d.ts.map +1 -0
  143. package/dist/backend/routes.external.js +156 -0
  144. package/dist/backend/routes.external.js.map +1 -0
  145. package/dist/backend/routes.js +838 -0
  146. package/dist/backend/routes.js.map +1 -0
  147. package/dist/backend/services/business-id-generator.d.ts +50 -0
  148. package/dist/backend/services/business-id-generator.d.ts.map +1 -0
  149. package/dist/backend/services/business-id-generator.js +69 -0
  150. package/dist/backend/services/business-id-generator.js.map +1 -0
  151. package/dist/backend/services/order-access-service.d.ts +41 -0
  152. package/dist/backend/services/order-access-service.d.ts.map +1 -0
  153. package/dist/backend/services/order-access-service.js +55 -0
  154. package/dist/backend/services/order-access-service.js.map +1 -0
  155. package/dist/backend/services/order-api-intake-service.d.ts +79 -0
  156. package/dist/backend/services/order-api-intake-service.d.ts.map +1 -0
  157. package/dist/backend/services/order-api-intake-service.js +313 -0
  158. package/dist/backend/services/order-api-intake-service.js.map +1 -0
  159. package/dist/backend/services/order-cancellation-service.d.ts +133 -0
  160. package/dist/backend/services/order-cancellation-service.d.ts.map +1 -0
  161. package/dist/backend/services/order-cancellation-service.js +201 -0
  162. package/dist/backend/services/order-cancellation-service.js.map +1 -0
  163. package/dist/backend/services/order-clone-to-quote-service.d.ts +24 -0
  164. package/dist/backend/services/order-clone-to-quote-service.d.ts.map +1 -0
  165. package/dist/backend/services/order-clone-to-quote-service.js +47 -0
  166. package/dist/backend/services/order-clone-to-quote-service.js.map +1 -0
  167. package/dist/backend/services/order-comment-service.d.ts +43 -0
  168. package/dist/backend/services/order-comment-service.d.ts.map +1 -0
  169. package/dist/backend/services/order-comment-service.js +131 -0
  170. package/dist/backend/services/order-comment-service.js.map +1 -0
  171. package/dist/backend/services/order-confirmation-service.d.ts +17 -0
  172. package/dist/backend/services/order-confirmation-service.d.ts.map +1 -0
  173. package/dist/backend/services/order-confirmation-service.js +55 -0
  174. package/dist/backend/services/order-confirmation-service.js.map +1 -0
  175. package/dist/backend/services/order-creation-admin-service.d.ts +58 -0
  176. package/dist/backend/services/order-creation-admin-service.d.ts.map +1 -0
  177. package/dist/backend/services/order-creation-admin-service.js +163 -0
  178. package/dist/backend/services/order-creation-admin-service.js.map +1 -0
  179. package/dist/backend/services/order-export-service.d.ts +20 -0
  180. package/dist/backend/services/order-export-service.d.ts.map +1 -0
  181. package/dist/backend/services/order-export-service.js +41 -0
  182. package/dist/backend/services/order-export-service.js.map +1 -0
  183. package/dist/backend/services/order-list-service.d.ts +114 -0
  184. package/dist/backend/services/order-list-service.d.ts.map +1 -0
  185. package/dist/backend/services/order-list-service.js +177 -0
  186. package/dist/backend/services/order-list-service.js.map +1 -0
  187. package/dist/backend/services/order-list-view-service.d.ts +39 -0
  188. package/dist/backend/services/order-list-view-service.d.ts.map +1 -0
  189. package/dist/backend/services/order-list-view-service.js +79 -0
  190. package/dist/backend/services/order-list-view-service.js.map +1 -0
  191. package/dist/backend/services/order-payment-status-apply-port.d.ts +34 -0
  192. package/dist/backend/services/order-payment-status-apply-port.d.ts.map +1 -0
  193. package/dist/backend/services/order-payment-status-apply-port.js +43 -0
  194. package/dist/backend/services/order-payment-status-apply-port.js.map +1 -0
  195. package/dist/backend/services/order-read-port.d.ts +30 -0
  196. package/dist/backend/services/order-read-port.d.ts.map +1 -0
  197. package/dist/backend/services/order-read-port.js +112 -0
  198. package/dist/backend/services/order-read-port.js.map +1 -0
  199. package/dist/backend/services/order-reorder-service.d.ts +48 -0
  200. package/dist/backend/services/order-reorder-service.d.ts.map +1 -0
  201. package/dist/backend/services/order-reorder-service.js +154 -0
  202. package/dist/backend/services/order-reorder-service.js.map +1 -0
  203. package/dist/backend/services/order-return-context.d.ts +8 -0
  204. package/dist/backend/services/order-return-context.d.ts.map +1 -0
  205. package/dist/backend/services/order-return-context.js +55 -0
  206. package/dist/backend/services/order-return-context.js.map +1 -0
  207. package/dist/backend/services/order-service.d.ts +536 -0
  208. package/dist/backend/services/order-service.d.ts.map +1 -0
  209. package/dist/backend/services/order-service.js +1567 -0
  210. package/dist/backend/services/order-service.js.map +1 -0
  211. package/dist/backend/services/order-status-graph-service.d.ts +69 -0
  212. package/dist/backend/services/order-status-graph-service.d.ts.map +1 -0
  213. package/dist/backend/services/order-status-graph-service.js +248 -0
  214. package/dist/backend/services/order-status-graph-service.js.map +1 -0
  215. package/dist/backend/services/order-transition-port.d.ts +65 -0
  216. package/dist/backend/services/order-transition-port.d.ts.map +1 -0
  217. package/dist/backend/services/order-transition-port.js +111 -0
  218. package/dist/backend/services/order-transition-port.js.map +1 -0
  219. package/dist/backend/services/order-transition-service.d.ts +77 -0
  220. package/dist/backend/services/order-transition-service.d.ts.map +1 -0
  221. package/dist/backend/services/order-transition-service.js +148 -0
  222. package/dist/backend/services/order-transition-service.js.map +1 -0
  223. package/dist/backend/services/purchase-conversion-service.d.ts +62 -0
  224. package/dist/backend/services/purchase-conversion-service.d.ts.map +1 -0
  225. package/dist/backend/services/purchase-conversion-service.js +71 -0
  226. package/dist/backend/services/purchase-conversion-service.js.map +1 -0
  227. package/dist/backend/services/sales-channel-attributions.d.ts +18 -0
  228. package/dist/backend/services/sales-channel-attributions.d.ts.map +1 -0
  229. package/dist/backend/services/sales-channel-attributions.js +25 -0
  230. package/dist/backend/services/sales-channel-attributions.js.map +1 -0
  231. package/dist/backend/services/transactional-email-helper.d.ts +77 -0
  232. package/dist/backend/services/transactional-email-helper.d.ts.map +1 -0
  233. package/dist/backend/services/transactional-email-helper.js +61 -0
  234. package/dist/backend/services/transactional-email-helper.js.map +1 -0
  235. package/dist/manifest.d.ts +180 -0
  236. package/dist/manifest.d.ts.map +1 -0
  237. package/dist/manifest.js +751 -0
  238. package/dist/manifest.js.map +1 -0
  239. package/dist/migrations/20260611T140355_orders_business_id.d.ts +22 -0
  240. package/dist/migrations/20260611T140355_orders_business_id.d.ts.map +1 -0
  241. package/dist/migrations/20260611T140355_orders_business_id.js +33 -0
  242. package/dist/migrations/20260611T140355_orders_business_id.js.map +1 -0
  243. package/dist/migrations/20260611T140356_orders_status_model.d.ts +20 -0
  244. package/dist/migrations/20260611T140356_orders_status_model.d.ts.map +1 -0
  245. package/dist/migrations/20260611T140356_orders_status_model.js +78 -0
  246. package/dist/migrations/20260611T140356_orders_status_model.js.map +1 -0
  247. package/dist/migrations/20260611T140357_orders_order_comments_and_saved_views.d.ts +9 -0
  248. package/dist/migrations/20260611T140357_orders_order_comments_and_saved_views.d.ts.map +1 -0
  249. package/dist/migrations/20260611T140357_orders_order_comments_and_saved_views.js +42 -0
  250. package/dist/migrations/20260611T140357_orders_order_comments_and_saved_views.js.map +1 -0
  251. package/dist/migrations/20260611T140401_orders_order_status_default_name.d.ts +14 -0
  252. package/dist/migrations/20260611T140401_orders_order_status_default_name.d.ts.map +1 -0
  253. package/dist/migrations/20260611T140401_orders_order_status_default_name.js +19 -0
  254. package/dist/migrations/20260611T140401_orders_order_status_default_name.js.map +1 -0
  255. package/dist/migrations/20260611T140405_orders_order_status_color.d.ts +13 -0
  256. package/dist/migrations/20260611T140405_orders_order_status_color.d.ts.map +1 -0
  257. package/dist/migrations/20260611T140405_orders_order_status_color.js +24 -0
  258. package/dist/migrations/20260611T140405_orders_order_status_color.js.map +1 -0
  259. package/dist/migrations/20260611T140406_orders_order_saved_view_columns.d.ts +13 -0
  260. package/dist/migrations/20260611T140406_orders_order_saved_view_columns.d.ts.map +1 -0
  261. package/dist/migrations/20260611T140406_orders_order_saved_view_columns.js +17 -0
  262. package/dist/migrations/20260611T140406_orders_order_saved_view_columns.js.map +1 -0
  263. package/dist/migrations/20260611T140414_orders_order_item_packaging.d.ts +11 -0
  264. package/dist/migrations/20260611T140414_orders_order_item_packaging.d.ts.map +1 -0
  265. package/dist/migrations/20260611T140414_orders_order_item_packaging.js +15 -0
  266. package/dist/migrations/20260611T140414_orders_order_item_packaging.js.map +1 -0
  267. package/dist/migrations/20260618T130459_orders_order_applied_promotions.d.ts +10 -0
  268. package/dist/migrations/20260618T130459_orders_order_applied_promotions.d.ts.map +1 -0
  269. package/dist/migrations/20260618T130459_orders_order_applied_promotions.js +25 -0
  270. package/dist/migrations/20260618T130459_orders_order_applied_promotions.js.map +1 -0
  271. package/dist/migrations/20260718T200339_orders_order_custom_field_values.d.ts +12 -0
  272. package/dist/migrations/20260718T200339_orders_order_custom_field_values.d.ts.map +1 -0
  273. package/dist/migrations/20260718T200339_orders_order_custom_field_values.js +16 -0
  274. package/dist/migrations/20260718T200339_orders_order_custom_field_values.js.map +1 -0
  275. package/dist/migrations/20260724T193611_orders_order_placement_intents.d.ts +17 -0
  276. package/dist/migrations/20260724T193611_orders_order_placement_intents.d.ts.map +1 -0
  277. package/dist/migrations/20260724T193611_orders_order_placement_intents.js +62 -0
  278. package/dist/migrations/20260724T193611_orders_order_placement_intents.js.map +1 -0
  279. package/dist/migrations/20260804T114814_orders_shipping_adapter_data.d.ts +10 -0
  280. package/dist/migrations/20260804T114814_orders_shipping_adapter_data.d.ts.map +1 -0
  281. package/dist/migrations/20260804T114814_orders_shipping_adapter_data.js +20 -0
  282. package/dist/migrations/20260804T114814_orders_shipping_adapter_data.js.map +1 -0
  283. package/dist/migrations/20260820T100201_orders_new_to_paid_transition.d.ts +35 -0
  284. package/dist/migrations/20260820T100201_orders_new_to_paid_transition.d.ts.map +1 -0
  285. package/dist/migrations/20260820T100201_orders_new_to_paid_transition.js +46 -0
  286. package/dist/migrations/20260820T100201_orders_new_to_paid_transition.js.map +1 -0
  287. package/dist/migrations/20260821T131145_orders_purchase_conversion_marker.d.ts +38 -0
  288. package/dist/migrations/20260821T131145_orders_purchase_conversion_marker.d.ts.map +1 -0
  289. package/dist/migrations/20260821T131145_orders_purchase_conversion_marker.js +44 -0
  290. package/dist/migrations/20260821T131145_orders_purchase_conversion_marker.js.map +1 -0
  291. package/dist/migrations/20260824T080000_orders_delivery_point_snapshot.d.ts +12 -0
  292. package/dist/migrations/20260824T080000_orders_delivery_point_snapshot.d.ts.map +1 -0
  293. package/dist/migrations/20260824T080000_orders_delivery_point_snapshot.js +16 -0
  294. package/dist/migrations/20260824T080000_orders_delivery_point_snapshot.js.map +1 -0
  295. package/dist/migrations/index.d.ts +40 -0
  296. package/dist/migrations/index.d.ts.map +1 -0
  297. package/dist/migrations/index.js +55 -0
  298. package/dist/migrations/index.js.map +1 -0
  299. package/dist/ports/index.d.ts +242 -0
  300. package/dist/ports/index.d.ts.map +1 -0
  301. package/dist/ports/index.js +2 -0
  302. package/dist/ports/index.js.map +1 -0
  303. package/dist/ports/organization-confirmation-emails.port.d.ts +12 -0
  304. package/dist/ports/organization-confirmation-emails.port.d.ts.map +1 -0
  305. package/dist/ports/organization-confirmation-emails.port.js +2 -0
  306. package/dist/ports/organization-confirmation-emails.port.js.map +1 -0
  307. package/docs/orders.md +105 -0
  308. package/i18n/en.json +54 -0
  309. package/i18n/pl.json +54 -0
  310. package/package.json +114 -3
  311. package/tailwind.css +14 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,67 @@
1
- # Temporary Holding Version
1
+ <!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ # @endora-commerce/mod-orders
4
+
5
+ Order placement, lifecycle, and history.
6
+
7
+ ## What this is
8
+
9
+ An **Endora Commerce module package**. Its module id is `orders` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
10
+
11
+ A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
12
+
13
+ ## Entry points
14
+
15
+ | Import | Contents |
16
+ | --- | --- |
17
+ | `@endora-commerce/mod-orders` | the module manifest — its id, version, dependencies, settings and activation |
18
+ | `@endora-commerce/mod-orders/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
19
+ | `@endora-commerce/mod-orders/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
20
+ | `@endora-commerce/mod-orders/migrations` | the module’s own schema migrations, in the order the platform runs them |
21
+ | `@endora-commerce/mod-orders/ports` | type-only — the port interfaces other modules resolve this one through |
22
+ | `@endora-commerce/mod-orders/tailwind.css` | the Tailwind source declaration for the admin code above |
23
+
24
+ ## Depends on
25
+
26
+ Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
27
+
28
+ **Endora packages**
29
+
30
+ - `@endora-commerce/admin-kit` — *optional*
31
+ - `@endora-commerce/contracts`
32
+ - `@endora-commerce/email-components`
33
+ - `@endora-commerce/mod-carts`
34
+ - `@endora-commerce/mod-credit-limits`
35
+ - `@endora-commerce/mod-inventory`
36
+ - `@endora-commerce/mod-invoices`
37
+ - `@endora-commerce/mod-promotions`
38
+ - `@endora-commerce/platform`
39
+
40
+ **Third-party**
41
+
42
+ - `@mikro-orm/core` ^6
43
+ - `@mikro-orm/migrations` ^6
44
+ - `@mikro-orm/postgresql` ^6
45
+ - `fastify` ^5
46
+ - `ioredis` ^5
47
+ - `lucide-react` ^1 — *optional*
48
+ - `react` ^19 — *optional*
49
+ - `react-router-dom` ^7 — *optional*
50
+ - `zod` ^4
51
+
52
+ ## What the tarball carries
53
+
54
+ - `dist/` — the compiled JavaScript and its type declarations
55
+ - `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
56
+ - `docs/` — the package’s own pages in the Endora Commerce documentation site
57
+ - `tailwind.css` — the Tailwind source declaration
58
+
59
+ ## Install
60
+
61
+ ```bash
62
+ pnpm add @endora-commerce/mod-orders
63
+ ```
64
+
65
+ ## Licence
66
+
67
+ MIT — the text is in `LICENSE`, beside this file.
@@ -0,0 +1,23 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface SavedViewState {
3
+ filters: Record<string, unknown>;
4
+ sort: {
5
+ field: string;
6
+ dir: 'asc' | 'desc';
7
+ };
8
+ /** Column-picker selection; `null`/absent ⇒ the list falls back to defaults. */
9
+ visibleColumns?: string[] | null;
10
+ }
11
+ interface Props {
12
+ current: SavedViewState;
13
+ onLoad: (view: SavedViewState) => void;
14
+ onError: (message: string) => void;
15
+ }
16
+ /**
17
+ * Feature 038 (US2) — saved orders-list views. Lists the caller's own views
18
+ * plus shared ones, loads a view's filters/sort, and saves/deletes views
19
+ * (optionally shared with everyone who can access the list).
20
+ */
21
+ export declare function OrderSavedViews({ current, onLoad, onError }: Props): ReactNode;
22
+ export {};
23
+ //# sourceMappingURL=OrderSavedViews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderSavedViews.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrderSavedViews.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMzE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAClC;AAQD,UAAU,KAAK;IACb,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,SAAS,CAsF9E"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Save, Trash2 } from 'lucide-react';
4
+ import { ApiError, apiClient } from '@endora-commerce/admin-kit/lib';
5
+ import { Button, Select } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ /**
8
+ * Feature 038 (US2) — saved orders-list views. Lists the caller's own views
9
+ * plus shared ones, loads a view's filters/sort, and saves/deletes views
10
+ * (optionally shared with everyone who can access the list).
11
+ */
12
+ export function OrderSavedViews({ current, onLoad, onError }) {
13
+ const t = useTranslation('core');
14
+ const [views, setViews] = useState([]);
15
+ const [selectedId, setSelectedId] = useState('');
16
+ const load = useCallback(async () => {
17
+ try {
18
+ const res = await apiClient.get('/api/v1/admin/orders/list-views');
19
+ setViews(res.data);
20
+ }
21
+ catch (err) {
22
+ onError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load views.');
23
+ }
24
+ }, [onError]);
25
+ useEffect(() => {
26
+ void load();
27
+ }, [load]);
28
+ const handleLoad = (id) => {
29
+ setSelectedId(id);
30
+ const view = views.find((v) => v.id === id);
31
+ if (view) {
32
+ onLoad({ filters: view.filters, sort: view.sort, visibleColumns: view.visibleColumns ?? null });
33
+ }
34
+ };
35
+ const save = async () => {
36
+ const name = window.prompt(t('orders.views.namePrompt'));
37
+ if (!name)
38
+ return;
39
+ const shared = window.confirm(t('orders.views.sharedPrompt'));
40
+ try {
41
+ await apiClient.post('/api/v1/admin/orders/list-views', {
42
+ name,
43
+ shared,
44
+ filters: current.filters,
45
+ sort: current.sort,
46
+ visibleColumns: current.visibleColumns ?? null,
47
+ });
48
+ await load();
49
+ }
50
+ catch (err) {
51
+ onError(err instanceof ApiError ? err.envelope.error.message : 'Failed to save view.');
52
+ }
53
+ };
54
+ const remove = async () => {
55
+ if (!selectedId)
56
+ return;
57
+ try {
58
+ await apiClient.delete(`/api/v1/admin/orders/list-views/${selectedId}`);
59
+ setSelectedId('');
60
+ await load();
61
+ }
62
+ catch (err) {
63
+ onError(err instanceof ApiError ? err.envelope.error.message : 'Failed to delete view.');
64
+ }
65
+ };
66
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Select, { id: "saved-views", "aria-label": t('orders.views.label'), value: selectedId, onChange: (e) => handleLoad(e.target.value), children: [_jsx("option", { value: "", children: t('orders.views.none') }), views.map((v) => (_jsxs("option", { value: v.id, children: [v.name, v.shared ? ' ★' : ''] }, v.id)))] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", "aria-label": "save-view", onClick: () => void save(), children: _jsx(Save, {}) }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": "delete-view", disabled: !selectedId, onClick: () => void remove(), children: _jsx(Trash2, {}) })] }));
67
+ }
68
+ //# sourceMappingURL=OrderSavedViews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderSavedViews.js","sourceRoot":"","sources":["../../../src/admin/components/OrderSavedViews.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAqBjE;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAS;IACjE,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAmB,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAwB,iCAAiC,CAAC,CAAC;YAC1F,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,IAAI,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,UAAU,GAAG,CAAC,EAAU,EAAQ,EAAE;QACtC,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBACtD,IAAI;gBACJ,MAAM;gBACN,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;aAC/C,CAAC,CAAC;YACH,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,MAAM,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;YACxE,aAAa,CAAC,EAAE,CAAC,CAAC;YAClB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,MAAC,MAAM,IACL,EAAE,EAAC,aAAa,gBACJ,CAAC,CAAC,oBAAoB,CAAC,EACnC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAEjD,iBAAQ,KAAK,EAAC,EAAE,YAAE,CAAC,CAAC,mBAAmB,CAAC,GAAU,EACjD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,kBAAmB,KAAK,EAAE,CAAC,CAAC,EAAE,aAC3B,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAFV,CAAC,CAAC,EAAE,CAGR,CACV,CAAC,IACK,EACT,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,gBAAY,WAAW,EAAC,OAAO,EAAE,GAAS,EAAE,CAAC,KAAK,IAAI,EAAE,YACvG,KAAC,IAAI,KAAG,GACD,EACT,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,gBACE,aAAa,EACxB,QAAQ,EAAE,CAAC,UAAU,EACrB,OAAO,EAAE,GAAS,EAAE,CAAC,KAAK,MAAM,EAAE,YAElC,KAAC,MAAM,KAAG,GACH,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Delivery tab — lists the shipment generation attempts tied to an order
4
+ * (`GET /api/v1/admin/orders/:id/shipments`). A new attempt is appended on
5
+ * each retry, so the most recent attempt has the highest `attemptNo`.
6
+ *
7
+ * ## What P7d took out of it (feature 091, §10.4)
8
+ *
9
+ * Two carriers' affordances, which this file rendered itself. `inpost` was
10
+ * named three ways — a `useSurfaceVisibility` gate, a `useTranslation`
11
+ * namespace and a `providerDetails.provider` comparison — the first two being
12
+ * the pair of `foreign-module-ids` keys this conversion retires. The other
13
+ * carrier was named by its two **delivery-method codes** rather than by its
14
+ * module id, so no ledger and no check ever saw it; its three buttons carried
15
+ * no permission gate at all while the routes behind them enforce a read and a
16
+ * write code. Neither carrier's name is written in this file any more, in any
17
+ * spelling — `OrderShipmentsTab.carrier-zones.test.tsx` asserts that, so the
18
+ * codes are deliberately not quoted here either.
19
+ *
20
+ * Both carriers left together, which is what `api/carrier-documents-client.ts`
21
+ * ruled in its own header before it was deleted with them: *"both carriers are
22
+ * one shipment tab reaching two adapters … a repair naming one is a repair that
23
+ * has not understood the shape"*.
24
+ *
25
+ * Two zones stand in their place. `order.shipment.row.actions` is mounted once
26
+ * per attempt and carries that attempt's `providerCode` and `status`;
27
+ * `order.shipments.tab.actions` is mounted once in the footer bar and carries
28
+ * the order's delivery-method code and its latest attempt. What this file keeps
29
+ * knowing is that a shipment row may have an action and that the tab has a
30
+ * footer bar; what it stops knowing is which carrier fills either.
31
+ */
32
+ export declare function OrderShipmentsTab(props: {
33
+ orderId: string;
34
+ deliveryMethodCode: string;
35
+ }): ReactNode;
36
+ //# sourceMappingURL=OrderShipmentsTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderShipmentsTab.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrderShipmentsTab.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyDlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,SAAS,CAmMZ"}
@@ -0,0 +1,158 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { PackageX } from 'lucide-react';
4
+ import { ApiError, apiClient, formatDateTime, useSurfaceVisibility } from '@endora-commerce/admin-kit/lib';
5
+ import { Alert, AlertDescription, AlertTitle, Badge, Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Section } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ import { AdminZone, selectZoneContributions, useAdminContributions } from '@endora-commerce/admin-kit/zones';
8
+ const STATUS_VARIANT = {
9
+ pending: 'warning',
10
+ // Its own variant, not `warning`: a `pending` shipment is waiting for a
11
+ // carrier that knows about it, and a `pending_manual` one is waiting for a
12
+ // person. Two rows that read the same are the defect this state exists to
13
+ // remove (issue #250).
14
+ pending_manual: 'destructive',
15
+ success: 'success',
16
+ failure: 'destructive',
17
+ };
18
+ /** The most recent attempt — the only one an operator can still act on. */
19
+ function latestAttempt(rows) {
20
+ return rows.reduce((best, row) => (best === undefined || row.attemptNo > best.attemptNo ? row : best), undefined);
21
+ }
22
+ /**
23
+ * Which carrier opened this attempt, from the adapter's own envelope.
24
+ *
25
+ * A **provider code**, not a module id: it is a string the adapter deposited,
26
+ * and it is `null` for an attempt no carrier ever answered — the fail-closed
27
+ * value, which no contribution's `match` agrees with.
28
+ */
29
+ function providerCodeOf(row) {
30
+ const provider = row.providerDetails?.['provider'];
31
+ return typeof provider === 'string' ? provider : null;
32
+ }
33
+ /**
34
+ * Delivery tab — lists the shipment generation attempts tied to an order
35
+ * (`GET /api/v1/admin/orders/:id/shipments`). A new attempt is appended on
36
+ * each retry, so the most recent attempt has the highest `attemptNo`.
37
+ *
38
+ * ## What P7d took out of it (feature 091, §10.4)
39
+ *
40
+ * Two carriers' affordances, which this file rendered itself. `inpost` was
41
+ * named three ways — a `useSurfaceVisibility` gate, a `useTranslation`
42
+ * namespace and a `providerDetails.provider` comparison — the first two being
43
+ * the pair of `foreign-module-ids` keys this conversion retires. The other
44
+ * carrier was named by its two **delivery-method codes** rather than by its
45
+ * module id, so no ledger and no check ever saw it; its three buttons carried
46
+ * no permission gate at all while the routes behind them enforce a read and a
47
+ * write code. Neither carrier's name is written in this file any more, in any
48
+ * spelling — `OrderShipmentsTab.carrier-zones.test.tsx` asserts that, so the
49
+ * codes are deliberately not quoted here either.
50
+ *
51
+ * Both carriers left together, which is what `api/carrier-documents-client.ts`
52
+ * ruled in its own header before it was deleted with them: *"both carriers are
53
+ * one shipment tab reaching two adapters … a repair naming one is a repair that
54
+ * has not understood the shape"*.
55
+ *
56
+ * Two zones stand in their place. `order.shipment.row.actions` is mounted once
57
+ * per attempt and carries that attempt's `providerCode` and `status`;
58
+ * `order.shipments.tab.actions` is mounted once in the footer bar and carries
59
+ * the order's delivery-method code and its latest attempt. What this file keeps
60
+ * knowing is that a shipment row may have an action and that the tab has a
61
+ * footer bar; what it stops knowing is which carrier fills either.
62
+ */
63
+ export function OrderShipmentsTab(props) {
64
+ const t = useTranslation('core');
65
+ const [rows, setRows] = useState([]);
66
+ const [loading, setLoading] = useState(true);
67
+ const [loadError, setLoadError] = useState(false);
68
+ const [actionError, setActionError] = useState(null);
69
+ const [regenerating, setRegenerating] = useState(false);
70
+ const [reloadToken, setReloadToken] = useState(0);
71
+ /**
72
+ * Whether the attempts table needs its action column at all.
73
+ *
74
+ * `useAdminZone` is a hook, so it cannot be asked once per row;
75
+ * `selectZoneContributions` is the pure function that hook is a `useMemo`
76
+ * over, and the kit publishes it for exactly this. Asking it per row is the
77
+ * honest question — *"will any row show an action"* — and strictly narrower
78
+ * than the answer this file gave before, which was one carrier's presence
79
+ * and permission with no reference to the rows at all.
80
+ */
81
+ const contributions = useAdminContributions();
82
+ const isVisible = useSurfaceVisibility();
83
+ const showRowActions = useMemo(() => rows.some((row) => selectZoneContributions(contributions, 'order.shipment.row.actions', {
84
+ orderId: props.orderId,
85
+ shipmentId: row.id,
86
+ deliveryMethodCode: props.deliveryMethodCode,
87
+ providerCode: providerCodeOf(row),
88
+ status: row.status,
89
+ }, isVisible).length > 0), [rows, contributions, isVisible, props.orderId, props.deliveryMethodCode]);
90
+ useEffect(() => {
91
+ let alive = true;
92
+ setLoading(true);
93
+ setLoadError(false);
94
+ void apiClient
95
+ .get(`/api/v1/admin/orders/${props.orderId}/shipments`)
96
+ .then((res) => {
97
+ if (alive)
98
+ setRows(res.data);
99
+ })
100
+ .catch(() => {
101
+ if (!alive)
102
+ return;
103
+ setLoadError(true);
104
+ setRows([]);
105
+ })
106
+ .finally(() => {
107
+ if (alive)
108
+ setLoading(false);
109
+ });
110
+ return () => {
111
+ alive = false;
112
+ };
113
+ }, [props.orderId, reloadToken]);
114
+ /**
115
+ * The recovery path, and it is the *generate* endpoint rather than the retry
116
+ * one on purpose: opening a retry attempt does not contact the carrier, and
117
+ * a second row nobody asked for would be the same silence again. Generating
118
+ * appends a new attempt and asks the adapter, which is exactly what has to
119
+ * happen once the operator has switched the module back on.
120
+ */
121
+ const generateAgain = useCallback(() => {
122
+ setRegenerating(true);
123
+ setActionError(null);
124
+ void apiClient
125
+ .post(`/api/v1/admin/orders/${props.orderId}/shipments`, {})
126
+ .then(() => {
127
+ setReloadToken((token) => token + 1);
128
+ })
129
+ .catch((err) => {
130
+ setActionError(err instanceof ApiError
131
+ ? err.envelope.error.message
132
+ : t('orderDetail.shipments.generate.error'));
133
+ })
134
+ .finally(() => {
135
+ setRegenerating(false);
136
+ });
137
+ }, [props.orderId, t]);
138
+ const stalled = latestAttempt(rows)?.status === 'pending_manual' ? latestAttempt(rows) : undefined;
139
+ const latest = latestAttempt(rows);
140
+ const canGenerate = rows.length === 0 || latest?.status === 'failure' || latest?.status === 'pending_manual';
141
+ return (_jsx(Section, { title: t('orderDetail.shipments.title'), children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('common.state.loading') })) : loadError ? (_jsx("p", { className: "text-sm text-destructive", children: t('common.state.error') })) : (_jsxs(_Fragment, { children: [actionError ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: actionError }) })) : null, rows.length === 0 ? (_jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: t('orderDetail.shipments.empty') })) : null, stalled ? (_jsxs(Alert, { variant: "destructive", className: "mb-4", children: [_jsx(PackageX, { "aria-hidden": "true" }), _jsx(AlertTitle, { children: t('orderDetail.shipments.carrierNotContacted.title') }), _jsxs(AlertDescription, { children: [_jsx("p", { children: t('orderDetail.shipments.carrierNotContacted.body') }), stalled.failureReason ? (_jsx("p", { className: "mt-1 text-xs opacity-80", children: stalled.failureReason })) : null] })] })) : null, rows.length > 0 ? (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('orderDetail.shipments.columns.attempt') }), _jsx(TableHead, { children: t('orderDetail.shipments.columns.status') }), _jsx(TableHead, { children: t('orderDetail.shipments.columns.tracking') }), _jsx(TableHead, { children: t('orderDetail.shipments.columns.createdAt') }), _jsx(TableHead, { children: t('orderDetail.shipments.columns.failure') }), showRowActions ? _jsx(TableHead, {}) : null] }) }), _jsx(TableBody, { children: rows.map((s) => (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: ["#", s.attemptNo] }), _jsx(TableCell, { children: _jsx(Badge, { variant: STATUS_VARIANT[s.status], children: t(`orderDetail.shipments.status.${s.status}`) }) }), _jsx(TableCell, { className: "font-mono text-xs", children: s.externalReference ?? '—' }), _jsx(TableCell, { children: formatDateTime(s.createdAt) }), _jsx(TableCell, { className: "text-destructive", children: s.failureReason ?? '' }), showRowActions ? (_jsx(TableCell, { children: _jsx(AdminZone, { name: "order.shipment.row.actions", props: {
142
+ orderId: props.orderId,
143
+ shipmentId: s.id,
144
+ deliveryMethodCode: props.deliveryMethodCode,
145
+ providerCode: providerCodeOf(s),
146
+ status: s.status,
147
+ } }) })) : null] }, s.id))) })] })) : null, _jsxs("div", { className: "mt-4 flex flex-wrap gap-2", children: [canGenerate ? (_jsx(Button, { size: "sm", disabled: regenerating, onClick: generateAgain, children: regenerating
148
+ ? t('orderDetail.shipments.generate.busy')
149
+ : rows.length === 0
150
+ ? t('orderDetail.shipments.generate')
151
+ : t('orderDetail.shipments.generate.again') })) : null, _jsx(AdminZone, { name: "order.shipments.tab.actions", props: {
152
+ orderId: props.orderId,
153
+ deliveryMethodCode: props.deliveryMethodCode,
154
+ latestShipmentId: latest?.id ?? null,
155
+ latestStatus: latest?.status ?? null,
156
+ } })] })] })) }));
157
+ }
158
+ //# sourceMappingURL=OrderShipmentsTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderShipmentsTab.js","sourceRoot":"","sources":["../../../src/admin/components/OrderShipmentsTab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type ReactNode } from 'react';
2
+ interface StatusDef {
3
+ code: string;
4
+ name: Record<string, string>;
5
+ }
6
+ export interface BulkStatusSummary {
7
+ changed: number;
8
+ skipped: number;
9
+ }
10
+ interface Props {
11
+ open: boolean;
12
+ orderIds: string[];
13
+ statuses: StatusDef[];
14
+ onClose: () => void;
15
+ onDone: (summary: BulkStatusSummary) => void;
16
+ }
17
+ /**
18
+ * Feature 038 (US2) — bulk order status change. Applies the chosen target to
19
+ * every selected order; the server moves only the eligible ones and reports
20
+ * the rest as skipped (with reasons).
21
+ */
22
+ export declare function OrdersBulkStatusDialog({ open, orderIds, statuses, onClose, onDone }: Props): ReactNode;
23
+ export {};
24
+ //# sourceMappingURL=OrdersBulkStatusDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrdersBulkStatusDialog.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrdersBulkStatusDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKjD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,SAAS,CAmDtG"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { ApiError, apiClient } from '@endora-commerce/admin-kit/lib';
4
+ import { Button, Label, Select } from '@endora-commerce/admin-kit/ui';
5
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
6
+ /**
7
+ * Feature 038 (US2) — bulk order status change. Applies the chosen target to
8
+ * every selected order; the server moves only the eligible ones and reports
9
+ * the rest as skipped (with reasons).
10
+ */
11
+ export function OrdersBulkStatusDialog({ open, orderIds, statuses, onClose, onDone }) {
12
+ const t = useTranslation('core');
13
+ const [target, setTarget] = useState('');
14
+ const [busy, setBusy] = useState(false);
15
+ const [error, setError] = useState(null);
16
+ if (!open)
17
+ return null;
18
+ const apply = async () => {
19
+ if (!target)
20
+ return;
21
+ setBusy(true);
22
+ setError(null);
23
+ try {
24
+ const res = await apiClient.post('/api/v1/admin/orders/bulk/status', { orderIds, toStatusCode: target });
25
+ onDone({ changed: res.data.changed.length, skipped: res.data.skipped.length });
26
+ }
27
+ catch (err) {
28
+ setError(err instanceof ApiError ? err.envelope.error.message : t('orders.bulk.error'));
29
+ }
30
+ finally {
31
+ setBusy(false);
32
+ }
33
+ };
34
+ return (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4", role: "dialog", "aria-modal": "true", children: _jsxs("div", { className: "w-full max-w-md rounded-lg bg-background p-6 shadow-lg", children: [_jsx("h2", { className: "mb-4 text-lg font-semibold", children: t('orders.bulk.dialogTitle', { count: orderIds.length }) }), error ? _jsx("p", { className: "mb-3 text-sm text-destructive", children: error }) : null, _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "bulk-target", children: t('orders.bulk.targetStatus') }), _jsxs(Select, { id: "bulk-target", value: target, onChange: (e) => setTarget(e.target.value), children: [_jsx("option", { value: "", children: "\u2014" }), statuses.map((s) => (_jsx("option", { value: s.code, children: s.name['en'] ?? s.code }, s.code)))] })] }), _jsxs("div", { className: "mt-6 flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: onClose, disabled: busy, children: t('common.action.cancel') }), _jsx(Button, { onClick: () => void apply(), disabled: !target || busy, children: t('orders.bulk.apply') })] })] }) }));
35
+ }
36
+ //# sourceMappingURL=OrdersBulkStatusDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrdersBulkStatusDialog.js","sourceRoot":"","sources":["../../../src/admin/components/OrdersBulkStatusDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Order-status colour picker — a thin wrapper around the core
4
+ * {@link ColorPicker} that supplies the curated order-status preset palette.
5
+ * Kept as a named component so existing call sites stay unchanged.
6
+ */
7
+ export declare function StatusColorPicker(props: {
8
+ value: string;
9
+ onChange: (hex: string) => void;
10
+ /** Accessible label for the trigger + custom input. */
11
+ label: string;
12
+ customLabel: string;
13
+ }): ReactNode;
14
+ //# sourceMappingURL=StatusColorPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusColorPicker.d.ts","sourceRoot":"","sources":["../../../src/admin/components/StatusColorPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,SAAS,CAUZ"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import {} from 'react';
3
+ import { ColorPicker } from '@endora-commerce/admin-kit/ui';
4
+ import { ORDER_STATUS_COLOR_PRESETS } from '@endora-commerce/contracts';
5
+ /**
6
+ * Order-status colour picker — a thin wrapper around the core
7
+ * {@link ColorPicker} that supplies the curated order-status preset palette.
8
+ * Kept as a named component so existing call sites stay unchanged.
9
+ */
10
+ export function StatusColorPicker(props) {
11
+ return (_jsx(ColorPicker, { value: props.value, onChange: props.onChange, label: props.label, customLabel: props.customLabel, presets: ORDER_STATUS_COLOR_PRESETS }));
12
+ }
13
+ //# sourceMappingURL=StatusColorPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusColorPicker.js","sourceRoot":"","sources":["../../../src/admin/components/StatusColorPicker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAMjC;IACC,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,OAAO,EAAE,0BAA0B,GACnC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * `orders`' admin surface — four routes, three sidebar entries and one zone
3
+ * contribution (feature 091: P4d for the contribution, Phase 4 batch 15 for
4
+ * the rest;
5
+ * `specs/091-module-owned-admin-surfaces/contracts/admin-component-contribution.md`
6
+ * §6).
7
+ *
8
+ * **This entry said "no route and no sidebar entry here" until batch 15**, and
9
+ * that sentence is what a module looks like halfway through the drain: P4d
10
+ * declared the zone contribution while the screens were still `App.tsx`'s,
11
+ * because `check:admin-registrations` counts routes and nav entries and a zone
12
+ * is neither. The screens are here now, so the module is both ends of that
13
+ * property at once — a contributor to `order.entry.tabs` and the host of four
14
+ * other members.
15
+ *
16
+ * **The four it hosts.** `OrderDetail.tsx` mounts `order.detail.payment`,
17
+ * `OrderShipmentsTab.tsx` mounts `order.shipment.row.actions` once per attempt
18
+ * and `order.shipments.tab.actions` once per tab, and `OrderCreatePage.tsx`
19
+ * mounts `order.entry.tabs` — through the kit's `<RouteTabsZone>` rather than a
20
+ * bare `<AdminZone>`, because the strip counts what the hook already filtered
21
+ * and *"fewer than two tabs is not a choice"*. P7d and P4d published all four,
22
+ * and `payments`, `inpost` and `quick_order` contribute to them. A screen that
23
+ * moved into this package and lost a mount would leave those contributions
24
+ * rendering nowhere.
25
+ *
26
+ * **Zone and not a published component** for its own contribution, decided from
27
+ * the file P4d deleted (§9.3): `OrderEntryTabs()` took no props at all and
28
+ * answered the question *"which of these two modules is installed"* out of a
29
+ * third party's file. There is no signature to publish — the component was
30
+ * module knowledge, twice over — which is Z1 question 2 in its plainest form.
31
+ *
32
+ * **What it drains: nothing, and the zero is measured rather than assumed.**
33
+ * Before anything moved on this branch, this module owned no
34
+ * `backend/scripts/ledgers/cross-module-imports/` shard and was named as a
35
+ * target by none: batch 5 paid the two carrier-client reaches
36
+ * `OrderShipmentsTab.tsx` carried, and P7d retired the two `foreign-module-ids`
37
+ * entries that same file had in favour of the two zones it now mounts.
38
+ * `admin-surface.ts` is empty — P4d's own contribution drained one of its last
39
+ * two keys. `check:module-boundary` reads
40
+ * `cross-module reaches=7 (imports=3 sql=4) ledger-size=7 shards=4` on both
41
+ * sides of the move, and that agreement is the measurement rather than a
42
+ * silence.
43
+ *
44
+ * **This entry exports data and nothing else** (R2); every component is a
45
+ * dynamic-import factory (R6).
46
+ */
47
+ import { type AdminContributions } from '@endora-commerce/admin-kit/contributions';
48
+ export declare const contributions: AdminContributions;
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0CAA0C,CAAC;AA2ClD,eAAO,MAAM,aAAa,EAAE,kBAoF3B,CAAC"}