@aglyn/plugins-commerce 1.0.0-beta.229 → 1.0.0-beta.231

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 (590) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  39. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  40. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  41. package/src/lib/components/console/host-orders-card.component.js +84 -5
  42. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  43. package/src/lib/components/console/locations-card.component.js +164 -57
  44. package/src/lib/components/console/locations-card.component.js.map +1 -1
  45. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  46. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  47. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  48. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  49. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  50. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  51. package/src/lib/components/console/order-invoice.component.js +81 -0
  52. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  53. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  54. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  55. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  56. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  57. package/src/lib/components/console/order-returns.component.js +142 -0
  58. package/src/lib/components/console/order-returns.component.js.map +1 -0
  59. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  60. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  61. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  62. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  63. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  64. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  65. package/src/lib/components/console/order-zones.d.ts +155 -0
  66. package/src/lib/components/console/order-zones.js +40 -0
  67. package/src/lib/components/console/order-zones.js.map +1 -0
  68. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  69. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  70. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  71. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  72. package/src/lib/components/console/pos/pos-api.js +101 -0
  73. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  74. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  75. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  77. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  78. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  80. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  81. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  83. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  84. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  86. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  87. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  89. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  90. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  92. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  93. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  94. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  95. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  96. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  97. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  98. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  99. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  100. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  101. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  102. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  103. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  104. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  105. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  107. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  108. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  110. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  111. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  113. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  114. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  115. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  116. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  117. package/src/lib/components/console/pos-display-page.component.js +407 -0
  118. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  119. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  120. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  122. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  123. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  125. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  126. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  128. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  129. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  131. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  132. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  134. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  135. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  140. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  141. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  143. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  144. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  152. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  153. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  155. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  156. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  157. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  158. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  159. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  161. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  162. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  164. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  165. package/src/lib/components/console/pos-page.component.js +729 -657
  166. package/src/lib/components/console/pos-page.component.js.map +1 -1
  167. package/src/lib/components/console/product-editor-dialog.component.js +51 -7
  168. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  169. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  170. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  171. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  172. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  173. package/src/lib/components/console/product-register-fields.component.js +241 -0
  174. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  175. package/src/lib/components/console/product-zones.d.ts +58 -2
  176. package/src/lib/components/console/product-zones.js +10 -2
  177. package/src/lib/components/console/product-zones.js.map +1 -1
  178. package/src/lib/components/console/products-hub-card.component.js +51 -11
  179. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  180. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  181. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  182. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  183. package/src/lib/components/console/registers-card.component.js +24 -5
  184. package/src/lib/components/console/registers-card.component.js.map +1 -1
  185. package/src/lib/components/console/return-actions.d.ts +38 -0
  186. package/src/lib/components/console/return-actions.js +76 -0
  187. package/src/lib/components/console/return-actions.js.map +1 -0
  188. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  189. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  190. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  191. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  192. package/src/lib/components/console/return-settings-card.component.js +195 -0
  193. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  194. package/src/lib/components/console/return-zones.d.ts +87 -0
  195. package/src/lib/components/console/return-zones.js +31 -0
  196. package/src/lib/components/console/return-zones.js.map +1 -0
  197. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  198. package/src/lib/components/console/returns-card.component.js +159 -0
  199. package/src/lib/components/console/returns-card.component.js.map +1 -0
  200. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  201. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  202. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  203. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  204. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  205. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  206. package/src/lib/components/console/shipstation-card.component.js +345 -0
  207. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  208. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  209. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  210. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  211. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  212. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  213. package/src/lib/components/console/store-settings-card.component.js +2 -66
  214. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  215. package/src/lib/components/console/store-zones.d.ts +42 -0
  216. package/src/lib/components/console/store-zones.js +39 -0
  217. package/src/lib/components/console/store-zones.js.map +1 -0
  218. package/src/lib/components/order-status.d.ts +36 -0
  219. package/src/lib/components/order-status.js +502 -0
  220. package/src/lib/components/order-status.js.map +1 -0
  221. package/src/lib/components/product-detail.js +44 -2
  222. package/src/lib/components/product-detail.js.map +1 -1
  223. package/src/lib/components/return-request.d.ts +32 -0
  224. package/src/lib/components/return-request.js +576 -0
  225. package/src/lib/components/return-request.js.map +1 -0
  226. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  227. package/src/lib/components/storefront-payment-appearance.js +114 -0
  228. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  229. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  230. package/src/lib/components/storefront-payment-element.js +332 -33
  231. package/src/lib/components/storefront-payment-element.js.map +1 -1
  232. package/src/lib/constants/order-status.d.ts +22 -0
  233. package/src/lib/constants/order-status.js +22 -0
  234. package/src/lib/constants/order-status.js.map +1 -0
  235. package/src/lib/constants/return-request.d.ts +27 -0
  236. package/src/lib/constants/return-request.js +32 -0
  237. package/src/lib/constants/return-request.js.map +1 -0
  238. package/src/lib/constants/stock-movement-query.js +2 -1
  239. package/src/lib/constants/stock-movement-query.js.map +1 -1
  240. package/src/lib/declarations.console-server.js +9 -0
  241. package/src/lib/declarations.console-server.js.map +1 -1
  242. package/src/lib/declarations.server.d.ts +2 -1
  243. package/src/lib/declarations.server.js +47 -1
  244. package/src/lib/declarations.server.js.map +1 -1
  245. package/src/lib/model/buyer-notifications.d.ts +59 -0
  246. package/src/lib/model/buyer-notifications.js +97 -0
  247. package/src/lib/model/buyer-notifications.js.map +1 -0
  248. package/src/lib/model/commerce-orders.d.ts +127 -1
  249. package/src/lib/model/commerce-orders.js +24 -15
  250. package/src/lib/model/commerce-orders.js.map +1 -1
  251. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  252. package/src/lib/model/commerce-payment-methods.js +247 -0
  253. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  254. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  255. package/src/lib/model/commerce-pos-ops.js +721 -0
  256. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  257. package/src/lib/model/commerce-pos.d.ts +263 -0
  258. package/src/lib/model/commerce-pos.js +375 -0
  259. package/src/lib/model/commerce-pos.js.map +1 -0
  260. package/src/lib/model/commerce-printers.d.ts +211 -0
  261. package/src/lib/model/commerce-printers.js +181 -0
  262. package/src/lib/model/commerce-printers.js.map +1 -0
  263. package/src/lib/model/commerce-receipt.d.ts +97 -0
  264. package/src/lib/model/commerce-receipt.js +180 -0
  265. package/src/lib/model/commerce-receipt.js.map +1 -0
  266. package/src/lib/model/commerce-returns.d.ts +207 -0
  267. package/src/lib/model/commerce-returns.js +300 -0
  268. package/src/lib/model/commerce-returns.js.map +1 -0
  269. package/src/lib/model/commerce-shipping.d.ts +44 -1
  270. package/src/lib/model/commerce-shipping.js +53 -9
  271. package/src/lib/model/commerce-shipping.js.map +1 -1
  272. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  273. package/src/lib/model/commerce-tax-engine.js +129 -0
  274. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  275. package/src/lib/model/commerce.d.ts +88 -2
  276. package/src/lib/model/commerce.js +89 -1
  277. package/src/lib/model/commerce.js.map +1 -1
  278. package/src/lib/model/index.d.ts +15 -0
  279. package/src/lib/model/index.js +15 -0
  280. package/src/lib/model/index.js.map +1 -1
  281. package/src/lib/model/order-events.d.ts +154 -0
  282. package/src/lib/model/order-events.js +153 -0
  283. package/src/lib/model/order-events.js.map +1 -0
  284. package/src/lib/model/order-fulfillment.d.ts +117 -0
  285. package/src/lib/model/order-fulfillment.js +217 -0
  286. package/src/lib/model/order-fulfillment.js.map +1 -0
  287. package/src/lib/model/order-history.d.ts +58 -0
  288. package/src/lib/model/order-history.js +22 -0
  289. package/src/lib/model/order-history.js.map +1 -0
  290. package/src/lib/model/order-list-fields.d.ts +9 -1
  291. package/src/lib/model/order-list-fields.js +7 -1
  292. package/src/lib/model/order-list-fields.js.map +1 -1
  293. package/src/lib/model/order-shipping-export.d.ts +91 -0
  294. package/src/lib/model/order-shipping-export.js +192 -0
  295. package/src/lib/model/order-shipping-export.js.map +1 -0
  296. package/src/lib/model/order-status-view.d.ts +103 -0
  297. package/src/lib/model/order-status-view.js +156 -0
  298. package/src/lib/model/order-status-view.js.map +1 -0
  299. package/src/lib/model/order-webhooks.d.ts +142 -0
  300. package/src/lib/model/order-webhooks.js +91 -0
  301. package/src/lib/model/order-webhooks.js.map +1 -0
  302. package/src/lib/model/product-channel.d.ts +56 -0
  303. package/src/lib/model/product-channel.js +86 -0
  304. package/src/lib/model/product-channel.js.map +1 -0
  305. package/src/lib/model/product-modifiers.d.ts +80 -0
  306. package/src/lib/model/product-modifiers.js +140 -0
  307. package/src/lib/model/product-modifiers.js.map +1 -0
  308. package/src/lib/model/shippingeasy.d.ts +94 -0
  309. package/src/lib/model/shippingeasy.js +267 -0
  310. package/src/lib/model/shippingeasy.js.map +1 -0
  311. package/src/lib/model/shipstation.d.ts +125 -0
  312. package/src/lib/model/shipstation.js +399 -0
  313. package/src/lib/model/shipstation.js.map +1 -0
  314. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  315. package/src/lib/model/smart-collection-reads.js +63 -0
  316. package/src/lib/model/smart-collection-reads.js.map +1 -0
  317. package/src/lib/model/tracking-url.d.ts +74 -0
  318. package/src/lib/model/tracking-url.js +159 -0
  319. package/src/lib/model/tracking-url.js.map +1 -0
  320. package/src/lib/plugin-config.d.ts +13 -0
  321. package/src/lib/plugin-config.js +77 -5
  322. package/src/lib/plugin-config.js.map +1 -1
  323. package/src/lib/plugin.js +23 -0
  324. package/src/lib/plugin.js.map +1 -1
  325. package/src/lib/pos-ops-config.d.ts +39 -0
  326. package/src/lib/pos-ops-config.js +88 -0
  327. package/src/lib/pos-ops-config.js.map +1 -0
  328. package/src/lib/printing/print-document.d.ts +106 -0
  329. package/src/lib/printing/print-document.js +464 -0
  330. package/src/lib/printing/print-document.js.map +1 -0
  331. package/src/lib/printing/product-labels.d.ts +58 -0
  332. package/src/lib/printing/product-labels.js +116 -0
  333. package/src/lib/printing/product-labels.js.map +1 -0
  334. package/src/lib/printing/render-epson.d.ts +57 -0
  335. package/src/lib/printing/render-epson.js +135 -0
  336. package/src/lib/printing/render-epson.js.map +1 -0
  337. package/src/lib/printing/render-star.d.ts +45 -0
  338. package/src/lib/printing/render-star.js +100 -0
  339. package/src/lib/printing/render-star.js.map +1 -0
  340. package/src/lib/printing/render-text.d.ts +25 -0
  341. package/src/lib/printing/render-text.js +53 -0
  342. package/src/lib/printing/render-text.js.map +1 -0
  343. package/src/lib/server/api-v1/openapi.js +27 -4
  344. package/src/lib/server/api-v1/openapi.js.map +1 -1
  345. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  346. package/src/lib/server/api-v1/order-view.js +120 -0
  347. package/src/lib/server/api-v1/order-view.js.map +1 -0
  348. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  349. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  350. package/src/lib/server/billing-webhook.js +135 -28
  351. package/src/lib/server/billing-webhook.js.map +1 -1
  352. package/src/lib/server/cancel-order.js +29 -0
  353. package/src/lib/server/cancel-order.js.map +1 -1
  354. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  355. package/src/lib/server/carrier-rates-availability.js +76 -0
  356. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  357. package/src/lib/server/carrier-shipping.d.ts +84 -0
  358. package/src/lib/server/carrier-shipping.js +135 -0
  359. package/src/lib/server/carrier-shipping.js.map +1 -0
  360. package/src/lib/server/cart-checkout.d.ts +2 -0
  361. package/src/lib/server/cart-checkout.js +226 -22
  362. package/src/lib/server/cart-checkout.js.map +1 -1
  363. package/src/lib/server/checkout-extras.d.ts +64 -0
  364. package/src/lib/server/checkout-extras.js +157 -0
  365. package/src/lib/server/checkout-extras.js.map +1 -0
  366. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  367. package/src/lib/server/checkout-status.js +111 -0
  368. package/src/lib/server/checkout-status.js.map +1 -0
  369. package/src/lib/server/checkout.js +86 -9
  370. package/src/lib/server/checkout.js.map +1 -1
  371. package/src/lib/server/draft-order.js +34 -5
  372. package/src/lib/server/draft-order.js.map +1 -1
  373. package/src/lib/server/fulfill-order.d.ts +127 -10
  374. package/src/lib/server/fulfill-order.js +451 -49
  375. package/src/lib/server/fulfill-order.js.map +1 -1
  376. package/src/lib/server/legacy-feed.d.ts +28 -0
  377. package/src/lib/server/legacy-feed.js +52 -0
  378. package/src/lib/server/legacy-feed.js.map +1 -0
  379. package/src/lib/server/native-checkout.d.ts +34 -15
  380. package/src/lib/server/native-checkout.js +32 -17
  381. package/src/lib/server/native-checkout.js.map +1 -1
  382. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  383. package/src/lib/server/order-event-host-emit.js +30 -0
  384. package/src/lib/server/order-event-host-emit.js.map +1 -0
  385. package/src/lib/server/order-event-triggers.d.ts +37 -0
  386. package/src/lib/server/order-event-triggers.js +119 -0
  387. package/src/lib/server/order-event-triggers.js.map +1 -0
  388. package/src/lib/server/order-events.d.ts +62 -0
  389. package/src/lib/server/order-events.js +109 -0
  390. package/src/lib/server/order-events.js.map +1 -0
  391. package/src/lib/server/order-history.d.ts +23 -0
  392. package/src/lib/server/order-history.js +65 -0
  393. package/src/lib/server/order-history.js.map +1 -0
  394. package/src/lib/server/order-notifications.d.ts +185 -0
  395. package/src/lib/server/order-notifications.js +567 -0
  396. package/src/lib/server/order-notifications.js.map +1 -0
  397. package/src/lib/server/order-receipt-send.d.ts +39 -0
  398. package/src/lib/server/order-receipt-send.js +151 -0
  399. package/src/lib/server/order-receipt-send.js.map +1 -0
  400. package/src/lib/server/order-status-token.d.ts +31 -0
  401. package/src/lib/server/order-status-token.js +75 -0
  402. package/src/lib/server/order-status-token.js.map +1 -0
  403. package/src/lib/server/order-status.d.ts +58 -0
  404. package/src/lib/server/order-status.js +141 -0
  405. package/src/lib/server/order-status.js.map +1 -0
  406. package/src/lib/server/order-webhooks.d.ts +108 -0
  407. package/src/lib/server/order-webhooks.js +622 -0
  408. package/src/lib/server/order-webhooks.js.map +1 -0
  409. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  410. package/src/lib/server/orders-shipping-prepare.js +121 -0
  411. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  412. package/src/lib/server/payment-method-domains.d.ts +209 -0
  413. package/src/lib/server/payment-method-domains.js +444 -0
  414. package/src/lib/server/payment-method-domains.js.map +1 -0
  415. package/src/lib/server/payment-methods.d.ts +77 -0
  416. package/src/lib/server/payment-methods.js +284 -0
  417. package/src/lib/server/payment-methods.js.map +1 -0
  418. package/src/lib/server/pos-auth.d.ts +50 -0
  419. package/src/lib/server/pos-auth.js +121 -0
  420. package/src/lib/server/pos-auth.js.map +1 -0
  421. package/src/lib/server/pos-customer.d.ts +49 -0
  422. package/src/lib/server/pos-customer.js +257 -0
  423. package/src/lib/server/pos-customer.js.map +1 -0
  424. package/src/lib/server/pos-display.d.ts +57 -0
  425. package/src/lib/server/pos-display.js +419 -0
  426. package/src/lib/server/pos-display.js.map +1 -0
  427. package/src/lib/server/pos-fee-month.d.ts +34 -0
  428. package/src/lib/server/pos-fee-month.js +36 -0
  429. package/src/lib/server/pos-fee-month.js.map +1 -0
  430. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  431. package/src/lib/server/pos-ops-gate.js +295 -0
  432. package/src/lib/server/pos-ops-gate.js.map +1 -0
  433. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  434. package/src/lib/server/pos-ops-routes.js +36 -0
  435. package/src/lib/server/pos-ops-routes.js.map +1 -0
  436. package/src/lib/server/pos-order.d.ts +1 -18
  437. package/src/lib/server/pos-order.js +222 -42
  438. package/src/lib/server/pos-order.js.map +1 -1
  439. package/src/lib/server/pos-payment.d.ts +39 -0
  440. package/src/lib/server/pos-payment.js +922 -0
  441. package/src/lib/server/pos-payment.js.map +1 -0
  442. package/src/lib/server/pos-print.d.ts +82 -0
  443. package/src/lib/server/pos-print.js +193 -0
  444. package/src/lib/server/pos-print.js.map +1 -0
  445. package/src/lib/server/pos-readers.d.ts +27 -0
  446. package/src/lib/server/pos-readers.js +276 -0
  447. package/src/lib/server/pos-readers.js.map +1 -0
  448. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  449. package/src/lib/server/pos-refund-authority.js +72 -0
  450. package/src/lib/server/pos-refund-authority.js.map +1 -0
  451. package/src/lib/server/pos-return.d.ts +58 -0
  452. package/src/lib/server/pos-return.js +891 -0
  453. package/src/lib/server/pos-return.js.map +1 -0
  454. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  455. package/src/lib/server/pos-sale-stamp.js +84 -0
  456. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  457. package/src/lib/server/pos-sale.d.ts +170 -0
  458. package/src/lib/server/pos-sale.js +461 -0
  459. package/src/lib/server/pos-sale.js.map +1 -0
  460. package/src/lib/server/pos-shift.d.ts +45 -0
  461. package/src/lib/server/pos-shift.js +484 -0
  462. package/src/lib/server/pos-shift.js.map +1 -0
  463. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  464. package/src/lib/server/pos-staff-pin.js +339 -0
  465. package/src/lib/server/pos-staff-pin.js.map +1 -0
  466. package/src/lib/server/pos-stripe.d.ts +91 -0
  467. package/src/lib/server/pos-stripe.js +129 -0
  468. package/src/lib/server/pos-stripe.js.map +1 -0
  469. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  470. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  471. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  472. package/src/lib/server/pos-terminal.d.ts +218 -0
  473. package/src/lib/server/pos-terminal.js +1014 -0
  474. package/src/lib/server/pos-terminal.js.map +1 -0
  475. package/src/lib/server/print-queue.d.ts +124 -0
  476. package/src/lib/server/print-queue.js +301 -0
  477. package/src/lib/server/print-queue.js.map +1 -0
  478. package/src/lib/server/printer-poll.d.ts +75 -0
  479. package/src/lib/server/printer-poll.js +325 -0
  480. package/src/lib/server/printer-poll.js.map +1 -0
  481. package/src/lib/server/printer-secret.d.ts +39 -0
  482. package/src/lib/server/printer-secret.js +56 -0
  483. package/src/lib/server/printer-secret.js.map +1 -0
  484. package/src/lib/server/printers.d.ts +114 -0
  485. package/src/lib/server/printers.js +546 -0
  486. package/src/lib/server/printers.js.map +1 -0
  487. package/src/lib/server/product-ai-capability.d.ts +42 -0
  488. package/src/lib/server/product-ai-capability.js +159 -0
  489. package/src/lib/server/product-ai-capability.js.map +1 -0
  490. package/src/lib/server/product-catalog.d.ts +42 -0
  491. package/src/lib/server/product-catalog.js +305 -0
  492. package/src/lib/server/product-catalog.js.map +1 -0
  493. package/src/lib/server/product-drafts.d.ts +119 -0
  494. package/src/lib/server/product-drafts.js +384 -0
  495. package/src/lib/server/product-drafts.js.map +1 -0
  496. package/src/lib/server/refund.js +110 -45
  497. package/src/lib/server/refund.js.map +1 -1
  498. package/src/lib/server/reserve.js +2 -0
  499. package/src/lib/server/reserve.js.map +1 -1
  500. package/src/lib/server/return-status-action.d.ts +37 -0
  501. package/src/lib/server/return-status-action.js +57 -0
  502. package/src/lib/server/return-status-action.js.map +1 -0
  503. package/src/lib/server/returns.d.ts +119 -0
  504. package/src/lib/server/returns.js +938 -0
  505. package/src/lib/server/returns.js.map +1 -0
  506. package/src/lib/server/shipment-records.d.ts +36 -0
  507. package/src/lib/server/shipment-records.js +289 -0
  508. package/src/lib/server/shipment-records.js.map +1 -0
  509. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  510. package/src/lib/server/shipping-connector-gates.js +97 -0
  511. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  512. package/src/lib/server/shipping-connectors.d.ts +29 -0
  513. package/src/lib/server/shipping-connectors.js +236 -0
  514. package/src/lib/server/shipping-connectors.js.map +1 -0
  515. package/src/lib/server/shippingeasy.d.ts +238 -0
  516. package/src/lib/server/shippingeasy.js +787 -0
  517. package/src/lib/server/shippingeasy.js.map +1 -0
  518. package/src/lib/server/shipstation.d.ts +129 -0
  519. package/src/lib/server/shipstation.js +483 -0
  520. package/src/lib/server/shipstation.js.map +1 -0
  521. package/src/lib/server/site-page-resolver.d.ts +5 -0
  522. package/src/lib/server/site-page-resolver.js +156 -1
  523. package/src/lib/server/site-page-resolver.js.map +1 -1
  524. package/src/lib/server/stock-levels.d.ts +21 -0
  525. package/src/lib/server/stock-levels.js +263 -0
  526. package/src/lib/server/stock-levels.js.map +1 -0
  527. package/src/lib/server/stripe-refund.d.ts +47 -0
  528. package/src/lib/server/stripe-refund.js +87 -0
  529. package/src/lib/server/stripe-refund.js.map +1 -0
  530. package/src/lib/server/supplier-update.js +46 -5
  531. package/src/lib/server/supplier-update.js.map +1 -1
  532. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  533. package/src/lib/server/tax-engine-quote.js +105 -0
  534. package/src/lib/server/tax-engine-quote.js.map +1 -0
  535. package/src/lib/server.js +146 -2
  536. package/src/lib/server.js.map +1 -1
  537. package/src/lib/site.js +12 -0
  538. package/src/lib/site.js.map +1 -1
  539. package/src/lib/subprocessors.d.ts +26 -0
  540. package/src/lib/subprocessors.js +50 -0
  541. package/src/lib/subprocessors.js.map +1 -0
  542. package/src/lib/tenant-emails.js +461 -3
  543. package/src/lib/tenant-emails.js.map +1 -1
  544. package/src/lib/testing/fake-firestore.d.ts +45 -0
  545. package/src/lib/testing/fake-firestore.js +189 -0
  546. package/src/lib/testing/fake-firestore.js.map +1 -0
  547. package/src/lib/testing/memory-firestore.d.ts +123 -0
  548. package/src/lib/testing/memory-firestore.js +274 -0
  549. package/src/lib/testing/memory-firestore.js.map +1 -0
  550. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  551. package/src/lib/testing/pos-ops-harness.js +184 -0
  552. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  553. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  554. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  555. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  556. package/src/lib/transfer/records-transfer.d.ts +11 -1
  557. package/src/lib/transfer/records-transfer.js +127 -5
  558. package/src/lib/transfer/records-transfer.js.map +1 -1
  559. package/src/lib/transfer/records.server.d.ts +9 -2
  560. package/src/lib/transfer/records.server.js +58 -7
  561. package/src/lib/transfer/records.server.js.map +1 -1
  562. package/src/lib/transfer/register-transfer-resources.js +40 -1
  563. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  564. package/src/lib/transfer/register-transfer-ui.js +4 -1
  565. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  566. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  567. package/src/lib/transfer/shipping-presets.js +156 -0
  568. package/src/lib/transfer/shipping-presets.js.map +1 -0
  569. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  570. package/src/lib/transfer/tracking-transfer.js +546 -0
  571. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  572. package/src/lib/transfer/tracking.server.d.ts +37 -0
  573. package/src/lib/transfer/tracking.server.js +393 -0
  574. package/src/lib/transfer/tracking.server.js.map +1 -0
  575. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  576. package/src/lib/transfer/transfer-keys.js +6 -2
  577. package/src/lib/transfer/transfer-keys.js.map +1 -1
  578. package/src/lib/utils/code128.d.ts +37 -0
  579. package/src/lib/utils/code128.js +199 -0
  580. package/src/lib/utils/code128.js.map +1 -0
  581. package/src/lib/utils/order-invoice.d.ts +55 -0
  582. package/src/lib/utils/order-invoice.js +127 -0
  583. package/src/lib/utils/order-invoice.js.map +1 -0
  584. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  585. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  586. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  587. package/src/lib/utils/use-storefront-purchase-event.js +4 -0
  588. package/src/lib/utils/use-storefront-purchase-event.js.map +1 -1
  589. package/src/lib/server/feed.js +0 -69
  590. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,159 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
+ import * as CommerceModel from "../../model/index.js";
19
+ import { CardDisplay } from "@aglyn/shared-ui-jsx";
20
+ import { ListPagination } from "@aglyn/shared-ui-jsx/components/list-pagination.component";
21
+ import { pluginDocsHelp } from "@aglyn/aglyn";
22
+ import { Chip, List, ListItemButton, ListItemText, MenuItem, Stack, TextField, Typography } from "@mui/material";
23
+ import { collection, limit, orderBy, query, where } from "firebase/firestore";
24
+ import { useSearchParams } from "next/navigation";
25
+ import { useEffect, useRef, useState } from "react";
26
+ import { useFirestore, usePagedCollection } from "@aglyn/tenant-feature-instance";
27
+ import ReturnDetailDialog from "./return-detail-dialog.component.js";
28
+ /** The query key the Returns list opens one return's dialog by. */ export const RETURNS_RETURN_PARAM = 'return';
29
+ /**
30
+ * What is coming back, as the row's summary: "2× Mug, 1× Tee" from the names
31
+ * a return keeps, or "3 items" for one opened before it kept them.
32
+ */ export function itemsSummary(entry) {
33
+ var _entry_lines;
34
+ const lines = (_entry_lines = entry.lines) != null ? _entry_lines : [];
35
+ if (lines.length > 0 && lines.every((line)=>line.name)) {
36
+ return lines.map((line)=>`${Math.max(0, Number(line.quantity) || 0)}× ${line.name}`).join(', ');
37
+ }
38
+ const units = lines.reduce((sum, line)=>sum + Math.max(0, Number(line.quantity) || 0), 0);
39
+ return `${units} ${units === 1 ? 'item' : 'items'}`;
40
+ }
41
+ /**
42
+ * Returns (RMA, AGL-3611): every return on the store, newest first.
43
+ *
44
+ * THE STATUS FILTER IS THE QUERY. `status == X` ordered by `createdAtMs`
45
+ * descending, served by the `returns(status ASC, createdAtMs DESC)`
46
+ * composite; "All" is the single-field order alone. The footer pages that
47
+ * query's answer, so page two of "Requested" is page two of the requests,
48
+ * never a page of the store narrowed afterwards.
49
+ *
50
+ * `?return={id}` opens that return's dialog on arrival — the address the
51
+ * merchant's "return requested" notification links to. The dialog reads the
52
+ * return by id, so one that is not on this page opens just the same.
53
+ */ export function ReturnsCard(props) {
54
+ var _ref;
55
+ const { hostId } = props;
56
+ const firestore = useFirestore();
57
+ const [filter, setFilter] = useState('all');
58
+ const { rows: returns, hasMore, page, setPage, pageSize, setPageSize, status } = usePagedCollection((pageLimit)=>query(collection(firestore, 'hosts', hostId, 'returns'), ...filter === 'all' ? [] : [
59
+ where('status', '==', filter)
60
+ ], orderBy('createdAtMs', 'desc'), limit(pageLimit)), [
61
+ firestore,
62
+ hostId,
63
+ filter
64
+ ], {
65
+ idField: '$id'
66
+ });
67
+ const searchParams = useSearchParams();
68
+ const seededId = (_ref = searchParams == null ? void 0 : searchParams.get(RETURNS_RETURN_PARAM)) != null ? _ref : null;
69
+ const [selectedId, setSelectedId] = useState(null);
70
+ // Once per id, so closing the dialog does not reopen it on the next render.
71
+ const seeded = useRef(null);
72
+ useEffect(()=>{
73
+ if (!seededId || seeded.current === seededId) return;
74
+ seeded.current = seededId;
75
+ setSelectedId(seededId);
76
+ }, [
77
+ seededId
78
+ ]);
79
+ return /*#__PURE__*/ _jsxs(CardDisplay, {
80
+ header: 'Returns',
81
+ help: pluginDocsHelp('ordersAndReturns', {
82
+ anchor: '#run-a-return'
83
+ }),
84
+ HeaderProps: {
85
+ action: /*#__PURE__*/ _jsxs(TextField, {
86
+ label: "Status",
87
+ value: filter,
88
+ onChange: (event)=>setFilter(event.target.value),
89
+ size: "small",
90
+ select: true,
91
+ sx: {
92
+ minWidth: 160
93
+ },
94
+ children: [
95
+ /*#__PURE__*/ _jsx(MenuItem, {
96
+ value: "all",
97
+ children: 'All'
98
+ }),
99
+ CommerceModel.RETURN_STATUSES.map((value)=>/*#__PURE__*/ _jsx(MenuItem, {
100
+ value: value,
101
+ children: CommerceModel.RETURN_STATUS_LABELS[value]
102
+ }, value))
103
+ ]
104
+ })
105
+ },
106
+ contentGutterX: true,
107
+ contentGutterY: true,
108
+ children: [
109
+ /*#__PURE__*/ _jsxs(Stack, {
110
+ spacing: 1,
111
+ children: [
112
+ returns.length === 0 ? /*#__PURE__*/ _jsx(Typography, {
113
+ variant: "body2",
114
+ color: "text.secondary",
115
+ children: status === 'loading' ? 'Loading returns…' : filter === 'all' ? 'No returns yet. When a buyer asks to send something back, or you start a return from an order, it appears here.' : `No ${CommerceModel.RETURN_STATUS_LABELS[filter].toLowerCase()} returns.`
116
+ }) : /*#__PURE__*/ _jsx(List, {
117
+ disablePadding: true,
118
+ children: returns.map((entry)=>{
119
+ var _CommerceModel_RETURN_STATUS_LABELS_entry_status, _CommerceModel_RETURN_STATUS_COLOR_entry_status;
120
+ return /*#__PURE__*/ _jsxs(ListItemButton, {
121
+ onClick: ()=>setSelectedId(entry.$id),
122
+ divider: true,
123
+ children: [
124
+ /*#__PURE__*/ _jsx(ListItemText, {
125
+ primary: `${entry.orderNumber} · ${entry.customerName || entry.customerEmail || 'Guest buyer'}`,
126
+ secondary: `${itemsSummary(entry)} · Requested ${new Date(entry.createdAtMs).toLocaleDateString()}`
127
+ }),
128
+ /*#__PURE__*/ _jsx(Chip, {
129
+ label: (_CommerceModel_RETURN_STATUS_LABELS_entry_status = CommerceModel.RETURN_STATUS_LABELS[entry.status]) != null ? _CommerceModel_RETURN_STATUS_LABELS_entry_status : entry.status,
130
+ size: "small",
131
+ color: (_CommerceModel_RETURN_STATUS_COLOR_entry_status = CommerceModel.RETURN_STATUS_COLOR[entry.status]) != null ? _CommerceModel_RETURN_STATUS_COLOR_entry_status : 'default',
132
+ variant: "outlined"
133
+ })
134
+ ]
135
+ }, entry.$id);
136
+ })
137
+ }),
138
+ /*#__PURE__*/ _jsx(ListPagination, {
139
+ page: page,
140
+ pageSize: pageSize,
141
+ rowCount: returns.length,
142
+ hasMore: hasMore,
143
+ onPageChange: setPage,
144
+ onPageSizeChange: setPageSize
145
+ })
146
+ ]
147
+ }),
148
+ selectedId ? /*#__PURE__*/ _jsx(ReturnDetailDialog, {
149
+ hostId: hostId,
150
+ returnId: selectedId,
151
+ onClose: ()=>setSelectedId(null)
152
+ }) : null
153
+ ]
154
+ });
155
+ }
156
+ ReturnsCard.displayName = 'ReturnsCard';
157
+ export default ReturnsCard;
158
+
159
+ //# sourceMappingURL=returns-card.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/returns-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\nimport * as CommerceModel from '../../model'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ListPagination } from '@aglyn/shared-ui-jsx/components/list-pagination.component'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport {\n Chip,\n List,\n ListItemButton,\n ListItemText,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { collection, limit, orderBy, query, where } from 'firebase/firestore'\nimport { useSearchParams } from 'next/navigation'\nimport { useEffect, useRef, useState } from 'react'\nimport { useFirestore, usePagedCollection } from '@aglyn/tenant-feature-instance'\nimport ReturnDetailDialog from './return-detail-dialog.component'\n\nexport interface ReturnsCardProps {\n hostId: string\n}\n\n/** The query key the Returns list opens one return's dialog by. */\nexport const RETURNS_RETURN_PARAM = 'return'\n\ntype ReturnFilter = CommerceModel.ReturnStatus | 'all'\n\n/**\n * What is coming back, as the row's summary: \"2× Mug, 1× Tee\" from the names\n * a return keeps, or \"3 items\" for one opened before it kept them.\n */\nexport function itemsSummary(entry: Pick<CommerceModel.HostReturn, 'lines'>): string {\n const lines = entry.lines ?? []\n if (lines.length > 0 && lines.every((line) => line.name)) {\n return lines.map((line) => `${Math.max(0, Number(line.quantity) || 0)}× ${line.name}`).join(', ')\n }\n const units = lines.reduce(\n (sum, line) => sum + Math.max(0, Number(line.quantity) || 0),\n 0,\n )\n return `${units} ${units === 1 ? 'item' : 'items'}`\n}\n\n/**\n * Returns (RMA, AGL-3611): every return on the store, newest first.\n *\n * THE STATUS FILTER IS THE QUERY. `status == X` ordered by `createdAtMs`\n * descending, served by the `returns(status ASC, createdAtMs DESC)`\n * composite; \"All\" is the single-field order alone. The footer pages that\n * query's answer, so page two of \"Requested\" is page two of the requests,\n * never a page of the store narrowed afterwards.\n *\n * `?return={id}` opens that return's dialog on arrival — the address the\n * merchant's \"return requested\" notification links to. The dialog reads the\n * return by id, so one that is not on this page opens just the same.\n */\nexport function ReturnsCard(props: ReturnsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const [filter, setFilter] = useState<ReturnFilter>('all')\n const {\n rows: returns,\n hasMore,\n page,\n setPage,\n pageSize,\n setPageSize,\n status,\n } = usePagedCollection<CommerceModel.HostReturn & { $id: string }>(\n (pageLimit) =>\n query(\n collection(firestore, 'hosts', hostId, 'returns'),\n ...(filter === 'all' ? [] : [where('status', '==', filter)]),\n orderBy('createdAtMs', 'desc'),\n limit(pageLimit),\n ),\n [firestore, hostId, filter],\n { idField: '$id' },\n )\n\n const searchParams = useSearchParams()\n const seededId = searchParams?.get(RETURNS_RETURN_PARAM) ?? null\n const [selectedId, setSelectedId] = useState<string | null>(null)\n // Once per id, so closing the dialog does not reopen it on the next render.\n const seeded = useRef<string | null>(null)\n useEffect(() => {\n if (!seededId || seeded.current === seededId) return\n seeded.current = seededId\n setSelectedId(seededId)\n }, [seededId])\n\n return (\n <CardDisplay\n header={'Returns'}\n help={pluginDocsHelp('ordersAndReturns', { anchor: '#run-a-return' })}\n HeaderProps={{\n action: (\n <TextField\n label=\"Status\"\n value={filter}\n onChange={(event) => setFilter(event.target.value as ReturnFilter)}\n size=\"small\"\n select\n sx={{ minWidth: 160 }}\n >\n <MenuItem value=\"all\">{'All'}</MenuItem>\n {CommerceModel.RETURN_STATUSES.map((value) => (\n <MenuItem key={value} value={value}>\n {CommerceModel.RETURN_STATUS_LABELS[value]}\n </MenuItem>\n ))}\n </TextField>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1}>\n {returns.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {status === 'loading'\n ? 'Loading returns…'\n : filter === 'all'\n ? 'No returns yet. When a buyer asks to send something back, or you start a return from an order, it appears here.'\n : `No ${CommerceModel.RETURN_STATUS_LABELS[filter].toLowerCase()} returns.`}\n </Typography>\n ) : (\n <List disablePadding>\n {returns.map((entry) => (\n <ListItemButton\n key={entry.$id}\n onClick={() => setSelectedId(entry.$id)}\n divider\n >\n <ListItemText\n primary={`${entry.orderNumber} · ${\n entry.customerName || entry.customerEmail || 'Guest buyer'\n }`}\n secondary={`${itemsSummary(entry)} · Requested ${new Date(\n entry.createdAtMs,\n ).toLocaleDateString()}`}\n />\n <Chip\n label={CommerceModel.RETURN_STATUS_LABELS[entry.status] ?? entry.status}\n size=\"small\"\n color={CommerceModel.RETURN_STATUS_COLOR[entry.status] ?? 'default'}\n variant=\"outlined\"\n />\n </ListItemButton>\n ))}\n </List>\n )}\n <ListPagination\n page={page}\n pageSize={pageSize}\n rowCount={returns.length}\n hasMore={hasMore}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </Stack>\n {selectedId ? (\n <ReturnDetailDialog\n hostId={hostId}\n returnId={selectedId}\n onClose={() => setSelectedId(null)}\n />\n ) : null}\n </CardDisplay>\n )\n}\nReturnsCard.displayName = 'ReturnsCard'\n\nexport default ReturnsCard\n"],"names":["CommerceModel","CardDisplay","ListPagination","pluginDocsHelp","Chip","List","ListItemButton","ListItemText","MenuItem","Stack","TextField","Typography","collection","limit","orderBy","query","where","useSearchParams","useEffect","useRef","useState","useFirestore","usePagedCollection","ReturnDetailDialog","RETURNS_RETURN_PARAM","itemsSummary","entry","lines","length","every","line","name","map","Math","max","Number","quantity","join","units","reduce","sum","ReturnsCard","props","hostId","firestore","filter","setFilter","rows","returns","hasMore","page","setPage","pageSize","setPageSize","status","pageLimit","idField","searchParams","seededId","get","selectedId","setSelectedId","seeded","current","header","help","anchor","HeaderProps","action","label","value","onChange","event","target","size","select","sx","minWidth","RETURN_STATUSES","RETURN_STATUS_LABELS","contentGutterX","contentGutterY","spacing","variant","color","toLowerCase","disablePadding","onClick","$id","divider","primary","orderNumber","customerName","customerEmail","secondary","Date","createdAtMs","toLocaleDateString","RETURN_STATUS_COLOR","rowCount","onPageChange","onPageSizeChange","returnId","onClose","displayName"],"mappings":"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"}
@@ -21,9 +21,10 @@ import * as CommerceModel from "../../model/index.js";
21
21
  import { CardDisplay } from "@aglyn/shared-ui-jsx";
22
22
  import { useSnackbar } from "@aglyn/shared-ui-snackstack";
23
23
  import { Alert, AlertTitle, Button, Divider, FormControlLabel, MenuItem, Stack, Switch, TextField, Typography } from "@mui/material";
24
+ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
24
25
  import { doc, setDoc } from "firebase/firestore";
25
- import { useCallback, useState } from "react";
26
- import { useFirestore } from "@aglyn/tenant-feature-instance";
26
+ import { useCallback, useEffect, useState } from "react";
27
+ import { useFirestore, useUser } from "@aglyn/tenant-feature-instance";
27
28
  import { useFirestoreDoc, writeGuardedBySeed } from "@aglyn/tenant-feature-instance";
28
29
  import { pluginDocsHelp } from "@aglyn/aglyn";
29
30
  /**
@@ -76,6 +77,32 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
76
77
  ]);
77
78
  const [draft, setDraft] = useState(null);
78
79
  const current = (_ref = draft != null ? draft : store == null ? void 0 : store.shipping) != null ? _ref : {};
80
+ /*
81
+ * Live carrier rates (AGL-3612) are offered only where a plugin quotes
82
+ * carriers for this site — the server asks core's quoter seam. A rate
83
+ * already saved as `carrier` stays editable either way, so a merchant can
84
+ * still see and change what checkout falls back to.
85
+ */ const { data: user } = useUser();
86
+ const [carrier, setCarrier] = useState({
87
+ available: false,
88
+ services: []
89
+ });
90
+ useEffect(()=>{
91
+ let live = true;
92
+ authorizedFetch(user, `/api/commerce/shipping/carrier-rates?hostId=${encodeURIComponent(hostId)}`).then((response)=>response.ok ? response.json() : null).then((answer)=>{
93
+ var _answer_services;
94
+ if (live && answer) setCarrier({
95
+ available: Boolean(answer.available),
96
+ services: (_answer_services = answer.services) != null ? _answer_services : []
97
+ });
98
+ }).catch(()=>undefined);
99
+ return ()=>{
100
+ live = false;
101
+ };
102
+ }, [
103
+ hostId,
104
+ user
105
+ ]);
79
106
  const update = (patch)=>setDraft(_extends({}, current, patch));
80
107
  const updateZone = (index, patch)=>{
81
108
  var _current_zones;
@@ -255,7 +282,7 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
255
282
  children: 'Rates'
256
283
  }),
257
284
  ((_current_rates = current.rates) != null ? _current_rates : []).map((rate, index)=>{
258
- var _current_zones, _rate_tiers;
285
+ var _current_zones, _current_rates, _rate_tiers;
259
286
  return /*#__PURE__*/ _jsxs(Stack, {
260
287
  spacing: 1,
261
288
  children: [
@@ -329,7 +356,11 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
329
356
  /*#__PURE__*/ _jsx(MenuItem, {
330
357
  value: "weight_tiers",
331
358
  children: 'Weight tiers'
332
- })
359
+ }),
360
+ carrier.available || rate.kind === 'carrier' ? /*#__PURE__*/ _jsx(MenuItem, {
361
+ value: "carrier",
362
+ children: 'Carrier rates'
363
+ }) : null
333
364
  ]
334
365
  }),
335
366
  /*#__PURE__*/ _jsx(Button, {
@@ -340,7 +371,13 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
340
371
  })
341
372
  ]
342
373
  }),
343
- rate.kind === 'flat' || rate.kind === 'free_over' ? /*#__PURE__*/ _jsxs(Stack, {
374
+ rate.kind === 'carrier' ? /*#__PURE__*/ _jsx(CarrierRateFields, {
375
+ rate: rate,
376
+ services: carrier.services,
377
+ available: carrier.available,
378
+ fallbacks: ((_current_rates = current.rates) != null ? _current_rates : []).filter((other)=>other.id !== rate.id && other.zoneId === rate.zoneId && other.kind !== 'carrier'),
379
+ onChange: (patch)=>updateRate(index, patch)
380
+ }) : rate.kind === 'flat' || rate.kind === 'free_over' ? /*#__PURE__*/ _jsxs(Stack, {
344
381
  direction: "row",
345
382
  spacing: 1,
346
383
  children: [
@@ -556,5 +593,124 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
556
593
  }
557
594
  ShippingSettingsCard.displayName = 'ShippingSettingsCard';
558
595
  export default ShippingSettingsCard;
596
+ /**
597
+ * A carrier rate's options (AGL-3612): which services checkout offers, what
598
+ * is added to each quote, and the zone's rate offered when no live quote is.
599
+ */ function CarrierRateFields(props) {
600
+ var _rate_carrier, _options_services, _options_markupPct, _options_fallbackRateId;
601
+ const { rate, services, available, fallbacks, onChange } = props;
602
+ const options = (_rate_carrier = rate.carrier) != null ? _rate_carrier : {};
603
+ const set = (patch)=>onChange({
604
+ carrier: _extends({}, options, patch)
605
+ });
606
+ const picked = new Set((_options_services = options.services) != null ? _options_services : []);
607
+ return /*#__PURE__*/ _jsxs(Stack, {
608
+ spacing: 1,
609
+ sx: {
610
+ pl: 2
611
+ },
612
+ children: [
613
+ !available ? /*#__PURE__*/ _jsx(Alert, {
614
+ severity: "info",
615
+ children: 'Live carrier rates are not available on this site right now, so checkout offers the fallback rate.'
616
+ }) : null,
617
+ /*#__PURE__*/ _jsx(Typography, {
618
+ variant: "caption",
619
+ color: "text.secondary",
620
+ children: 'Shoppers see each carrier’s price for their address. Leave every service unticked to offer all of them.'
621
+ }),
622
+ /*#__PURE__*/ _jsx(Stack, {
623
+ direction: "row",
624
+ sx: {
625
+ flexWrap: 'wrap',
626
+ columnGap: 2
627
+ },
628
+ children: services.map((service)=>/*#__PURE__*/ _jsx(FormControlLabel, {
629
+ control: /*#__PURE__*/ _jsx(Switch, {
630
+ size: "small",
631
+ checked: picked.has(service.serviceKey),
632
+ onChange: (event)=>set({
633
+ services: event.target.checked ? [
634
+ ...picked,
635
+ service.serviceKey
636
+ ] : [
637
+ ...picked
638
+ ].filter((key)=>key !== service.serviceKey)
639
+ })
640
+ }),
641
+ label: service.label
642
+ }, service.serviceKey))
643
+ }),
644
+ /*#__PURE__*/ _jsxs(Stack, {
645
+ direction: "row",
646
+ spacing: 1,
647
+ children: [
648
+ /*#__PURE__*/ _jsx(TextField, {
649
+ label: "Markup (%)",
650
+ value: (_options_markupPct = options.markupPct) != null ? _options_markupPct : '',
651
+ onChange: (event)=>{
652
+ const pct = Number(event.target.value);
653
+ set({
654
+ markupPct: Number.isFinite(pct) && pct > 0 ? Math.min(pct, 500) : 0
655
+ });
656
+ },
657
+ size: "small",
658
+ sx: {
659
+ width: 120
660
+ },
661
+ slotProps: {
662
+ htmlInput: {
663
+ inputMode: 'decimal'
664
+ }
665
+ }
666
+ }),
667
+ /*#__PURE__*/ _jsx(TextField, {
668
+ label: "Handling fee ($)",
669
+ value: options.handlingCents ? options.handlingCents / 100 : '',
670
+ onChange: (event)=>{
671
+ const dollars = Number(event.target.value);
672
+ set({
673
+ handlingCents: Number.isFinite(dollars) && dollars > 0 ? Math.round(dollars * 100) : 0
674
+ });
675
+ },
676
+ size: "small",
677
+ sx: {
678
+ width: 150
679
+ },
680
+ slotProps: {
681
+ htmlInput: {
682
+ inputMode: 'decimal'
683
+ }
684
+ }
685
+ }),
686
+ /*#__PURE__*/ _jsxs(TextField, {
687
+ select: true,
688
+ label: "If no live rate",
689
+ value: (_options_fallbackRateId = options.fallbackRateId) != null ? _options_fallbackRateId : '',
690
+ onChange: (event)=>set({
691
+ fallbackRateId: event.target.value
692
+ }),
693
+ size: "small",
694
+ sx: {
695
+ minWidth: 200
696
+ },
697
+ error: !options.fallbackRateId,
698
+ helperText: options.fallbackRateId ? undefined : 'Pick a rate of this zone, or checkout can’t price without a quote',
699
+ children: [
700
+ /*#__PURE__*/ _jsx(MenuItem, {
701
+ value: "",
702
+ children: 'None'
703
+ }),
704
+ fallbacks.map((fallback)=>/*#__PURE__*/ _jsx(MenuItem, {
705
+ value: fallback.id,
706
+ children: fallback.name || 'Unnamed rate'
707
+ }, fallback.id))
708
+ ]
709
+ })
710
+ ]
711
+ })
712
+ ]
713
+ });
714
+ }
559
715
 
560
716
  //# sourceMappingURL=shipping-settings-card.component.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/shipping-settings-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Alert,\n AlertTitle,\n Button,\n Divider,\n FormControlLabel,\n MenuItem,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { doc, setDoc } from 'firebase/firestore'\nimport { useCallback, useState } from 'react'\nimport { useFirestore } from '@aglyn/tenant-feature-instance'\nimport {\n useFirestoreDoc,\n writeGuardedBySeed,\n} from '@aglyn/tenant-feature-instance'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\n\nexport interface ShippingSettingsCardProps {\n hostId: string\n}\n\n/**\n * Shipping settings (AGL-288): zones (countries, '*' = rest of world)\n * and rates (flat / free-over / subtotal or weight tiers), stored on\n * `hosts/{hostId}/settings/store` under `shipping`. Cart checkout (AGL-1707)\n * and buy-now (AGL-1720) both read this document and declare the rates as\n * Stripe `shipping_options` (`planCheckoutShipping`) — until those landed\n * nothing read it, and everything saved here was charged to nobody. Buy-now\n * resolves only for physical one-time sales; draft orders and POS still\n * resolve no shipping at all.\n *\n * WHAT A ZONE LAYOUT COSTS THE SHOPPER (AGL-1721). A session's rates are\n * charged as picked and never re-checked against the address, so the checkout\n * can only offer rates that hold for every country it will ship to. Saving\n * zones whose rates DIFFER therefore makes the storefront ask the shopper\n * where the parcel is going before it can price one, and a destination no\n * zone covers is refused outright rather than shipped for free. One zone, or\n * one '*' zone, needs neither: the shopper is asked nothing.\n *\n * AND THE MERCHANT HAS TO BE ABLE TO SEE IT (AGL-1791). Both consequences\n * were invisible here: a merchant saved zones and the checkouts they refused\n * were refused with nothing on this page saying so, which is a support ticket\n * from someone who did nothing wrong. The coverage block reads\n * `summarizeShippingCoverage` off the same `current` object the save writes,\n * so it moves as the form is typed rather than after a round trip.\n *\n * It escalates to a warning ONLY for a merchant who priced some destinations\n * and not others. A merchant whose rates reach nowhere is not misconfigured —\n * that store charges no shipping and refuses nobody — and warning them would\n * nag every store selling downloads.\n */\nexport function ShippingSettingsCard(props: ShippingSettingsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const { enqueueSnackbar } = useSnackbar()\n const {\n data: store,\n status: storeStatus,\n /**\n * The settings doc this form is seeded from is unconfirmed by the server\n * (AGL-1358). `current` is `draft ?? store?.shipping ?? {}` and the save\n * writes `{shipping: current}`, so `merge: true` protects the doc's other\n * maps and nothing inside this one — `zones` and `rates` are arrays, and\n * a merge replaces an array wholesale. Against a cached read, adding one\n * rate restores that snapshot's whole price table, and a zone that\n * disappears with it means `resolveShippingRates` matches nothing, which\n * is a checkout offering no shipping option at all.\n */\n fromCache: storeFromCache,\n } = useFirestoreDoc<any>(\n () => doc(firestore, 'hosts', hostId, 'settings', 'store'),\n [firestore, hostId],\n )\n const [draft, setDraft] = useState<CommerceModel.ShippingSettings | null>(null)\n const current: CommerceModel.ShippingSettings = draft ?? store?.shipping ?? {}\n const update = (patch: Partial<CommerceModel.ShippingSettings>) =>\n setDraft({ ...current, ...patch })\n\n const updateZone = (\n index: number,\n patch: Partial<CommerceModel.ShippingZone> | null,\n ) => {\n const zones = [...(current.zones ?? [])]\n if (patch === null) {\n const removed = zones.splice(index, 1)[0]\n update({\n zones,\n rates: (current.rates ?? []).filter(\n (rate) => rate.zoneId !== removed?.id,\n ),\n })\n return\n }\n zones[index] = {\n id: Aglyn.createResourceUid(),\n name: '',\n countries: [],\n ...zones[index],\n ...patch,\n }\n update({ zones })\n }\n\n const updateRate = (\n index: number,\n patch: Partial<CommerceModel.ShippingRate> | null,\n ) => {\n const rates = [...(current.rates ?? [])]\n if (patch === null) rates.splice(index, 1)\n else\n rates[index] = {\n id: Aglyn.createResourceUid(),\n zoneId: current.zones?.[0]?.id ?? '',\n name: '',\n kind: 'flat',\n ...rates[index],\n ...patch,\n }\n update({ rates })\n }\n\n const handleSave = useCallback(async () => {\n /**\n * Refuse a save whose seed the server never confirmed (AGL-1358).\n *\n * No create path to exempt: this is a FIXED document path, so the empty\n * `{}` that `store?.shipping ?? {}` yields when the cache has never seen\n * the map is not the harmless blank a fresh uid would be — it replaces\n * the real zones and rates with nothing.\n *\n * The guard WRAPS the write — an early return is a shape you can keep\n * while losing the protection.\n */\n const verdict = await writeGuardedBySeed(\n {\n subject: 'shipping settings',\n unreadable: storeStatus === 'error',\n fromCache: storeFromCache,\n },\n async () => {\n await setDoc(\n doc(firestore, 'hosts', hostId, 'settings', 'store'),\n { shipping: current },\n { merge: true },\n )\n },\n )\n // Before `setDraft(null)`, so a refusal keeps every zone and rate that\n // was typed on screen.\n if (!verdict.ok) {\n return void enqueueSnackbar(verdict.message, {\n variant: 'warning',\n persist: false,\n })\n }\n setDraft(null)\n enqueueSnackbar('Shipping settings saved', {\n variant: 'success',\n persist: false,\n })\n }, [current, firestore, hostId, enqueueSnackbar, storeStatus, storeFromCache])\n\n /**\n * Recomputed from `current` on every render, so the block answers for what\n * is typed rather than for what was last saved — a merchant deleting the\n * zone that covered France should see France go uncovered before they\n * commit it, not after.\n */\n const coverage = CommerceModel.summarizeShippingCoverage(current)\n const countryNames = (codes: readonly string[]) =>\n codes\n .map((code) => CommerceModel.CHECKOUT_SHIPPING_COUNTRY_NAMES[code] ?? code)\n .join(', ')\n /**\n * The one-click half of the fix: a zone claiming everywhere the merchant\n * has not named. It adds the ZONE only — a rate on it prices the parcel,\n * and choosing that price is the merchant's call, not ours. A rate row\n * defaulted here would post at whatever we picked, and a blank flat rate\n * resolves to free.\n */\n const addRestOfWorldZone = () =>\n updateZone(current.zones?.length ?? 0, {\n name: 'Rest of world',\n countries: ['*'],\n })\n\n const usd = (cents: number | undefined) =>\n cents == null ? '' : String(cents / 100)\n const cents = (raw: string) =>\n raw.trim() === '' ? undefined : Math.round(Number(raw) * 100)\n\n return (\n <CardDisplay\n header={'Shipping'}\n help={pluginDocsHelp('commerce', { anchor: '#shipping--taxes' })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1.5}>\n <Typography variant=\"subtitle2\">{'Zones'}</Typography>\n {(current.zones ?? []).map((zone, index) => (\n <Stack key={zone.id} direction=\"row\" spacing={1}>\n <TextField\n label=\"Zone name\"\n value={zone.name}\n onChange={(event) =>\n updateZone(index, { name: event.target.value })\n }\n size=\"small\"\n sx={{ width: 180 }}\n />\n <TextField\n label=\"Countries\"\n value={zone.countries.join(', ')}\n onChange={(event) =>\n updateZone(index, {\n countries: event.target.value\n .split(',')\n .map((code) => code.trim().toUpperCase())\n .filter(Boolean),\n })\n }\n size=\"small\"\n sx={{ flex: 1 }}\n placeholder=\"US, CA — or * for everywhere else\"\n />\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() => updateZone(index, null)}\n >\n {'✕'}\n </Button>\n </Stack>\n ))}\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => updateZone(current.zones?.length ?? 0, {})}\n >\n {'Add zone'}\n </Button>\n\n <Divider />\n <Typography variant=\"subtitle2\">{'Rates'}</Typography>\n {(current.rates ?? []).map((rate, index) => (\n <Stack key={rate.id} spacing={1}>\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Zone\"\n value={rate.zoneId}\n onChange={(event) =>\n updateRate(index, { zoneId: event.target.value })\n }\n size=\"small\"\n select\n sx={{ width: 150 }}\n >\n {(current.zones ?? []).map((zone) => (\n <MenuItem key={zone.id} value={zone.id}>\n {zone.name || zone.countries.join(',')}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label=\"Name\"\n value={rate.name}\n onChange={(event) =>\n updateRate(index, { name: event.target.value })\n }\n size=\"small\"\n sx={{ flex: 1 }}\n placeholder=\"Standard\"\n /**\n * A rate with no name is DROPPED at checkout, silently\n * (AGL-1791): Stripe requires a `display_name`, so\n * `resolveCheckoutShippingOptions` skips the row rather than\n * emit a session Stripe would reject. Saved blank it looks\n * like a priced rate on this page and is not one anywhere\n * else, which is the same invisibility the coverage block\n * below exists to end — said on the row that causes it,\n * because the block can only report the destination it costs.\n */\n error={!rate.name.trim()}\n helperText={\n rate.name.trim() ? undefined : 'Needed — checkout drops it'\n }\n />\n <TextField\n label=\"Type\"\n value={rate.kind}\n onChange={(event) =>\n updateRate(index, {\n kind: event.target.value as CommerceModel.ShippingRate['kind'],\n })\n }\n size=\"small\"\n select\n sx={{ width: 170 }}\n >\n <MenuItem value=\"flat\">{'Flat'}</MenuItem>\n <MenuItem value=\"free_over\">{'Free over subtotal'}</MenuItem>\n <MenuItem value=\"price_tiers\">{'Subtotal tiers'}</MenuItem>\n <MenuItem value=\"weight_tiers\">{'Weight tiers'}</MenuItem>\n </TextField>\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() => updateRate(index, null)}\n >\n {'✕'}\n </Button>\n </Stack>\n {rate.kind === 'flat' || rate.kind === 'free_over' ? (\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Price ($)\"\n value={usd(rate.amountCents)}\n onChange={(event) =>\n updateRate(index, { amountCents: cents(event.target.value) })\n }\n size=\"small\"\n sx={{ width: 120 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n {rate.kind === 'free_over' ? (\n <TextField\n label=\"Free at subtotal ($)\"\n value={usd(rate.freeOverCents)}\n onChange={(event) =>\n updateRate(index, {\n freeOverCents: cents(event.target.value),\n })\n }\n size=\"small\"\n sx={{ width: 160 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n ) : null}\n </Stack>\n ) : (\n <Stack spacing={1} sx={{ pl: 2 }}>\n {(rate.tiers ?? []).map((tier, tierIndex) => (\n <Stack key={tierIndex} direction=\"row\" spacing={1}>\n <TextField\n label={\n rate.kind === 'weight_tiers'\n ? 'Up to (g)'\n : 'Up to subtotal ($)'\n }\n value={\n rate.kind === 'weight_tiers'\n ? tier.upTo\n : tier.upTo / 100\n }\n onChange={(event) => {\n const tiers = [...(rate.tiers ?? [])]\n const value = Number(event.target.value) || 0\n tiers[tierIndex] = {\n ...tier,\n upTo:\n rate.kind === 'weight_tiers'\n ? Math.round(value)\n : Math.round(value * 100),\n }\n updateRate(index, { tiers })\n }}\n size=\"small\"\n sx={{ width: 160 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n <TextField\n label=\"Price ($)\"\n value={tier.amountCents / 100}\n onChange={(event) => {\n const tiers = [...(rate.tiers ?? [])]\n tiers[tierIndex] = {\n ...tier,\n amountCents: Math.round(\n (Number(event.target.value) || 0) * 100,\n ),\n }\n updateRate(index, { tiers })\n }}\n size=\"small\"\n sx={{ width: 120 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() =>\n updateRate(index, {\n tiers: (rate.tiers ?? []).filter(\n (_item, itemIndex) => itemIndex !== tierIndex,\n ),\n })\n }\n >\n {'✕'}\n </Button>\n </Stack>\n ))}\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() =>\n updateRate(index, {\n tiers: [\n ...(rate.tiers ?? []),\n { upTo: 0, amountCents: 0 },\n ],\n })\n }\n >\n {'Add tier'}\n </Button>\n </Stack>\n )}\n </Stack>\n ))}\n <Button\n size=\"small\"\n disabled={(current.zones?.length ?? 0) === 0}\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => updateRate(current.rates?.length ?? 0, {})}\n >\n {'Add rate'}\n </Button>\n\n <Stack spacing={0}>\n <FormControlLabel\n control={\n <Switch\n size=\"small\"\n checked={Boolean(current.localPickup)}\n onChange={(event) =>\n update({ localPickup: event.target.checked })\n }\n />\n }\n label=\"Offer free local pickup\"\n />\n {/*\n What the toggle does NOT do, said on the toggle (AGL-2325). It\n used to silently switch off every \"we don't ship there\" refusal,\n because pickup resolved for every destination and checkout read a\n non-empty list as coverage. It no longer does — but a merchant\n reading one line of label still has to be told that turning\n collection on is not the same as adding a destination.\n */}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {\n 'A free collection choice at checkout. It does not widen where ' +\n 'you ship — a destination none of your rates reaches is still ' +\n 'turned away.'\n }\n </Typography>\n </Stack>\n\n <Divider />\n <Typography variant=\"subtitle2\">{'Coverage'}</Typography>\n {coverage.unserved.length > 0 ? (\n <Alert\n severity=\"warning\"\n action={\n coverage.hasRestOfWorldZone ? undefined : (\n <Button\n size=\"small\"\n color=\"inherit\"\n onClick={addRestOfWorldZone}\n >\n {'Add rest-of-world zone'}\n </Button>\n )\n }\n >\n <AlertTitle>\n {`Checkout turns away ${coverage.unserved.length} of the ${CommerceModel.CHECKOUT_SHIPPING_COUNTRIES.length} destinations it collects addresses for`}\n </AlertTitle>\n {`No rate reaches ${countryNames(coverage.unserved)}, so an order shipping there is refused rather than posted for free. `}\n {coverage.offersLocalPickup\n ? 'Local pickup does not cover them: it is a collection choice, not a rate, so it is offered where checkout completes and closes no gap here. '\n : ''}\n {coverage.hasRestOfWorldZone\n ? 'A rest-of-world zone is already saved, so what those destinations are missing is a rate on the zone that covers them.'\n : 'Give them a zone with a rate, or add a rest-of-world zone and price one on it.'}\n </Alert>\n ) : (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {coverage.shipsNowhere\n ? coverage.offersLocalPickup\n ? 'No rate reaches any destination, so local pickup is the only delivery choice checkout offers. Nobody is turned away and no shipping is charged.'\n : 'No rate reaches any destination, so checkout charges no shipping and turns nobody away.'\n : `Checkout can price shipping to every destination it collects an address for: ${countryNames(coverage.served)}.`}\n </Typography>\n )}\n {coverage.asksDestination ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {\n 'Rates differ by destination, so checkout asks the shopper where the parcel is going before it can price one.'\n }\n </Typography>\n ) : null}\n\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n disabled={!draft}\n onClick={handleSave}\n sx={{ alignSelf: 'flex-start' }}\n >\n {'Save shipping settings'}\n </Button>\n </Stack>\n </CardDisplay>\n )\n}\nShippingSettingsCard.displayName = 'ShippingSettingsCard'\n\nexport default ShippingSettingsCard\n"],"names":["Aglyn","CommerceModel","CardDisplay","useSnackbar","Alert","AlertTitle","Button","Divider","FormControlLabel","MenuItem","Stack","Switch","TextField","Typography","doc","setDoc","useCallback","useState","useFirestore","useFirestoreDoc","writeGuardedBySeed","pluginDocsHelp","ShippingSettingsCard","props","draft","current","hostId","firestore","enqueueSnackbar","data","store","status","storeStatus","fromCache","storeFromCache","setDraft","shipping","update","patch","updateZone","index","zones","removed","splice","rates","filter","rate","zoneId","id","createResourceUid","name","countries","updateRate","kind","handleSave","verdict","subject","unreadable","merge","ok","message","variant","persist","coverage","summarizeShippingCoverage","countryNames","codes","map","code","CHECKOUT_SHIPPING_COUNTRY_NAMES","join","addRestOfWorldZone","length","usd","cents","String","raw","trim","undefined","Math","round","Number","header","help","anchor","contentGutterX","contentGutterY","spacing","zone","direction","label","value","onChange","event","target","size","sx","width","split","toUpperCase","Boolean","flex","placeholder","color","onClick","alignSelf","select","error","helperText","amountCents","slotProps","htmlInput","inputMode","freeOverCents","pl","tiers","tier","tierIndex","upTo","_item","itemIndex","disabled","control","checked","localPickup","unserved","severity","action","hasRestOfWorldZone","CHECKOUT_SHIPPING_COUNTRIES","offersLocalPickup","shipsNowhere","served","asksDestination","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/shipping-settings-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Alert,\n AlertTitle,\n Button,\n Divider,\n FormControlLabel,\n MenuItem,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { doc, setDoc } from 'firebase/firestore'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n useFirestoreDoc,\n writeGuardedBySeed,\n} from '@aglyn/tenant-feature-instance'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\n\nexport interface ShippingSettingsCardProps {\n hostId: string\n}\n\n/**\n * Shipping settings (AGL-288): zones (countries, '*' = rest of world)\n * and rates (flat / free-over / subtotal or weight tiers), stored on\n * `hosts/{hostId}/settings/store` under `shipping`. Cart checkout (AGL-1707)\n * and buy-now (AGL-1720) both read this document and declare the rates as\n * Stripe `shipping_options` (`planCheckoutShipping`) — until those landed\n * nothing read it, and everything saved here was charged to nobody. Buy-now\n * resolves only for physical one-time sales; draft orders and POS still\n * resolve no shipping at all.\n *\n * WHAT A ZONE LAYOUT COSTS THE SHOPPER (AGL-1721). A session's rates are\n * charged as picked and never re-checked against the address, so the checkout\n * can only offer rates that hold for every country it will ship to. Saving\n * zones whose rates DIFFER therefore makes the storefront ask the shopper\n * where the parcel is going before it can price one, and a destination no\n * zone covers is refused outright rather than shipped for free. One zone, or\n * one '*' zone, needs neither: the shopper is asked nothing.\n *\n * AND THE MERCHANT HAS TO BE ABLE TO SEE IT (AGL-1791). Both consequences\n * were invisible here: a merchant saved zones and the checkouts they refused\n * were refused with nothing on this page saying so, which is a support ticket\n * from someone who did nothing wrong. The coverage block reads\n * `summarizeShippingCoverage` off the same `current` object the save writes,\n * so it moves as the form is typed rather than after a round trip.\n *\n * It escalates to a warning ONLY for a merchant who priced some destinations\n * and not others. A merchant whose rates reach nowhere is not misconfigured —\n * that store charges no shipping and refuses nobody — and warning them would\n * nag every store selling downloads.\n */\nexport function ShippingSettingsCard(props: ShippingSettingsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const { enqueueSnackbar } = useSnackbar()\n const {\n data: store,\n status: storeStatus,\n /**\n * The settings doc this form is seeded from is unconfirmed by the server\n * (AGL-1358). `current` is `draft ?? store?.shipping ?? {}` and the save\n * writes `{shipping: current}`, so `merge: true` protects the doc's other\n * maps and nothing inside this one — `zones` and `rates` are arrays, and\n * a merge replaces an array wholesale. Against a cached read, adding one\n * rate restores that snapshot's whole price table, and a zone that\n * disappears with it means `resolveShippingRates` matches nothing, which\n * is a checkout offering no shipping option at all.\n */\n fromCache: storeFromCache,\n } = useFirestoreDoc<any>(\n () => doc(firestore, 'hosts', hostId, 'settings', 'store'),\n [firestore, hostId],\n )\n const [draft, setDraft] = useState<CommerceModel.ShippingSettings | null>(null)\n const current: CommerceModel.ShippingSettings = draft ?? store?.shipping ?? {}\n /*\n * Live carrier rates (AGL-3612) are offered only where a plugin quotes\n * carriers for this site — the server asks core's quoter seam. A rate\n * already saved as `carrier` stays editable either way, so a merchant can\n * still see and change what checkout falls back to.\n */\n const { data: user } = useUser()\n const [carrier, setCarrier] = useState<{\n available: boolean\n services: Array<{ serviceKey: string; label: string }>\n }>({ available: false, services: [] })\n useEffect(() => {\n let live = true\n authorizedFetch(user, `/api/commerce/shipping/carrier-rates?hostId=${encodeURIComponent(hostId)}`)\n .then((response) => (response.ok ? response.json() : null))\n .then((answer) => {\n if (live && answer) setCarrier({ available: Boolean(answer.available), services: answer.services ?? [] })\n })\n .catch(() => undefined)\n return () => {\n live = false\n }\n }, [hostId, user])\n const update = (patch: Partial<CommerceModel.ShippingSettings>) =>\n setDraft({ ...current, ...patch })\n\n const updateZone = (\n index: number,\n patch: Partial<CommerceModel.ShippingZone> | null,\n ) => {\n const zones = [...(current.zones ?? [])]\n if (patch === null) {\n const removed = zones.splice(index, 1)[0]\n update({\n zones,\n rates: (current.rates ?? []).filter(\n (rate) => rate.zoneId !== removed?.id,\n ),\n })\n return\n }\n zones[index] = {\n id: Aglyn.createResourceUid(),\n name: '',\n countries: [],\n ...zones[index],\n ...patch,\n }\n update({ zones })\n }\n\n const updateRate = (\n index: number,\n patch: Partial<CommerceModel.ShippingRate> | null,\n ) => {\n const rates = [...(current.rates ?? [])]\n if (patch === null) rates.splice(index, 1)\n else\n rates[index] = {\n id: Aglyn.createResourceUid(),\n zoneId: current.zones?.[0]?.id ?? '',\n name: '',\n kind: 'flat',\n ...rates[index],\n ...patch,\n }\n update({ rates })\n }\n\n const handleSave = useCallback(async () => {\n /**\n * Refuse a save whose seed the server never confirmed (AGL-1358).\n *\n * No create path to exempt: this is a FIXED document path, so the empty\n * `{}` that `store?.shipping ?? {}` yields when the cache has never seen\n * the map is not the harmless blank a fresh uid would be — it replaces\n * the real zones and rates with nothing.\n *\n * The guard WRAPS the write — an early return is a shape you can keep\n * while losing the protection.\n */\n const verdict = await writeGuardedBySeed(\n {\n subject: 'shipping settings',\n unreadable: storeStatus === 'error',\n fromCache: storeFromCache,\n },\n async () => {\n await setDoc(\n doc(firestore, 'hosts', hostId, 'settings', 'store'),\n { shipping: current },\n { merge: true },\n )\n },\n )\n // Before `setDraft(null)`, so a refusal keeps every zone and rate that\n // was typed on screen.\n if (!verdict.ok) {\n return void enqueueSnackbar(verdict.message, {\n variant: 'warning',\n persist: false,\n })\n }\n setDraft(null)\n enqueueSnackbar('Shipping settings saved', {\n variant: 'success',\n persist: false,\n })\n }, [current, firestore, hostId, enqueueSnackbar, storeStatus, storeFromCache])\n\n /**\n * Recomputed from `current` on every render, so the block answers for what\n * is typed rather than for what was last saved — a merchant deleting the\n * zone that covered France should see France go uncovered before they\n * commit it, not after.\n */\n const coverage = CommerceModel.summarizeShippingCoverage(current)\n const countryNames = (codes: readonly string[]) =>\n codes\n .map((code) => CommerceModel.CHECKOUT_SHIPPING_COUNTRY_NAMES[code] ?? code)\n .join(', ')\n /**\n * The one-click half of the fix: a zone claiming everywhere the merchant\n * has not named. It adds the ZONE only — a rate on it prices the parcel,\n * and choosing that price is the merchant's call, not ours. A rate row\n * defaulted here would post at whatever we picked, and a blank flat rate\n * resolves to free.\n */\n const addRestOfWorldZone = () =>\n updateZone(current.zones?.length ?? 0, {\n name: 'Rest of world',\n countries: ['*'],\n })\n\n const usd = (cents: number | undefined) =>\n cents == null ? '' : String(cents / 100)\n const cents = (raw: string) =>\n raw.trim() === '' ? undefined : Math.round(Number(raw) * 100)\n\n return (\n <CardDisplay\n header={'Shipping'}\n help={pluginDocsHelp('commerce', { anchor: '#shipping--taxes' })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1.5}>\n <Typography variant=\"subtitle2\">{'Zones'}</Typography>\n {(current.zones ?? []).map((zone, index) => (\n <Stack key={zone.id} direction=\"row\" spacing={1}>\n <TextField\n label=\"Zone name\"\n value={zone.name}\n onChange={(event) =>\n updateZone(index, { name: event.target.value })\n }\n size=\"small\"\n sx={{ width: 180 }}\n />\n <TextField\n label=\"Countries\"\n value={zone.countries.join(', ')}\n onChange={(event) =>\n updateZone(index, {\n countries: event.target.value\n .split(',')\n .map((code) => code.trim().toUpperCase())\n .filter(Boolean),\n })\n }\n size=\"small\"\n sx={{ flex: 1 }}\n placeholder=\"US, CA — or * for everywhere else\"\n />\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() => updateZone(index, null)}\n >\n {'✕'}\n </Button>\n </Stack>\n ))}\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => updateZone(current.zones?.length ?? 0, {})}\n >\n {'Add zone'}\n </Button>\n\n <Divider />\n <Typography variant=\"subtitle2\">{'Rates'}</Typography>\n {(current.rates ?? []).map((rate, index) => (\n <Stack key={rate.id} spacing={1}>\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Zone\"\n value={rate.zoneId}\n onChange={(event) =>\n updateRate(index, { zoneId: event.target.value })\n }\n size=\"small\"\n select\n sx={{ width: 150 }}\n >\n {(current.zones ?? []).map((zone) => (\n <MenuItem key={zone.id} value={zone.id}>\n {zone.name || zone.countries.join(',')}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label=\"Name\"\n value={rate.name}\n onChange={(event) =>\n updateRate(index, { name: event.target.value })\n }\n size=\"small\"\n sx={{ flex: 1 }}\n placeholder=\"Standard\"\n /**\n * A rate with no name is DROPPED at checkout, silently\n * (AGL-1791): Stripe requires a `display_name`, so\n * `resolveCheckoutShippingOptions` skips the row rather than\n * emit a session Stripe would reject. Saved blank it looks\n * like a priced rate on this page and is not one anywhere\n * else, which is the same invisibility the coverage block\n * below exists to end — said on the row that causes it,\n * because the block can only report the destination it costs.\n */\n error={!rate.name.trim()}\n helperText={\n rate.name.trim() ? undefined : 'Needed — checkout drops it'\n }\n />\n <TextField\n label=\"Type\"\n value={rate.kind}\n onChange={(event) =>\n updateRate(index, {\n kind: event.target.value as CommerceModel.ShippingRate['kind'],\n })\n }\n size=\"small\"\n select\n sx={{ width: 170 }}\n >\n <MenuItem value=\"flat\">{'Flat'}</MenuItem>\n <MenuItem value=\"free_over\">{'Free over subtotal'}</MenuItem>\n <MenuItem value=\"price_tiers\">{'Subtotal tiers'}</MenuItem>\n <MenuItem value=\"weight_tiers\">{'Weight tiers'}</MenuItem>\n {carrier.available || rate.kind === 'carrier' ? (\n <MenuItem value=\"carrier\">{'Carrier rates'}</MenuItem>\n ) : null}\n </TextField>\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() => updateRate(index, null)}\n >\n {'✕'}\n </Button>\n </Stack>\n {rate.kind === 'carrier' ? (\n <CarrierRateFields\n rate={rate}\n services={carrier.services}\n available={carrier.available}\n fallbacks={(current.rates ?? []).filter(\n (other) =>\n other.id !== rate.id &&\n other.zoneId === rate.zoneId &&\n other.kind !== 'carrier',\n )}\n onChange={(patch) => updateRate(index, patch)}\n />\n ) : rate.kind === 'flat' || rate.kind === 'free_over' ? (\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Price ($)\"\n value={usd(rate.amountCents)}\n onChange={(event) =>\n updateRate(index, { amountCents: cents(event.target.value) })\n }\n size=\"small\"\n sx={{ width: 120 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n {rate.kind === 'free_over' ? (\n <TextField\n label=\"Free at subtotal ($)\"\n value={usd(rate.freeOverCents)}\n onChange={(event) =>\n updateRate(index, {\n freeOverCents: cents(event.target.value),\n })\n }\n size=\"small\"\n sx={{ width: 160 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n ) : null}\n </Stack>\n ) : (\n <Stack spacing={1} sx={{ pl: 2 }}>\n {(rate.tiers ?? []).map((tier, tierIndex) => (\n <Stack key={tierIndex} direction=\"row\" spacing={1}>\n <TextField\n label={\n rate.kind === 'weight_tiers'\n ? 'Up to (g)'\n : 'Up to subtotal ($)'\n }\n value={\n rate.kind === 'weight_tiers'\n ? tier.upTo\n : tier.upTo / 100\n }\n onChange={(event) => {\n const tiers = [...(rate.tiers ?? [])]\n const value = Number(event.target.value) || 0\n tiers[tierIndex] = {\n ...tier,\n upTo:\n rate.kind === 'weight_tiers'\n ? Math.round(value)\n : Math.round(value * 100),\n }\n updateRate(index, { tiers })\n }}\n size=\"small\"\n sx={{ width: 160 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n <TextField\n label=\"Price ($)\"\n value={tier.amountCents / 100}\n onChange={(event) => {\n const tiers = [...(rate.tiers ?? [])]\n tiers[tierIndex] = {\n ...tier,\n amountCents: Math.round(\n (Number(event.target.value) || 0) * 100,\n ),\n }\n updateRate(index, { tiers })\n }}\n size=\"small\"\n sx={{ width: 120 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() =>\n updateRate(index, {\n tiers: (rate.tiers ?? []).filter(\n (_item, itemIndex) => itemIndex !== tierIndex,\n ),\n })\n }\n >\n {'✕'}\n </Button>\n </Stack>\n ))}\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() =>\n updateRate(index, {\n tiers: [\n ...(rate.tiers ?? []),\n { upTo: 0, amountCents: 0 },\n ],\n })\n }\n >\n {'Add tier'}\n </Button>\n </Stack>\n )}\n </Stack>\n ))}\n <Button\n size=\"small\"\n disabled={(current.zones?.length ?? 0) === 0}\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => updateRate(current.rates?.length ?? 0, {})}\n >\n {'Add rate'}\n </Button>\n\n <Stack spacing={0}>\n <FormControlLabel\n control={\n <Switch\n size=\"small\"\n checked={Boolean(current.localPickup)}\n onChange={(event) =>\n update({ localPickup: event.target.checked })\n }\n />\n }\n label=\"Offer free local pickup\"\n />\n {/*\n What the toggle does NOT do, said on the toggle (AGL-2325). It\n used to silently switch off every \"we don't ship there\" refusal,\n because pickup resolved for every destination and checkout read a\n non-empty list as coverage. It no longer does — but a merchant\n reading one line of label still has to be told that turning\n collection on is not the same as adding a destination.\n */}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {\n 'A free collection choice at checkout. It does not widen where ' +\n 'you ship — a destination none of your rates reaches is still ' +\n 'turned away.'\n }\n </Typography>\n </Stack>\n\n <Divider />\n <Typography variant=\"subtitle2\">{'Coverage'}</Typography>\n {coverage.unserved.length > 0 ? (\n <Alert\n severity=\"warning\"\n action={\n coverage.hasRestOfWorldZone ? undefined : (\n <Button\n size=\"small\"\n color=\"inherit\"\n onClick={addRestOfWorldZone}\n >\n {'Add rest-of-world zone'}\n </Button>\n )\n }\n >\n <AlertTitle>\n {`Checkout turns away ${coverage.unserved.length} of the ${CommerceModel.CHECKOUT_SHIPPING_COUNTRIES.length} destinations it collects addresses for`}\n </AlertTitle>\n {`No rate reaches ${countryNames(coverage.unserved)}, so an order shipping there is refused rather than posted for free. `}\n {coverage.offersLocalPickup\n ? 'Local pickup does not cover them: it is a collection choice, not a rate, so it is offered where checkout completes and closes no gap here. '\n : ''}\n {coverage.hasRestOfWorldZone\n ? 'A rest-of-world zone is already saved, so what those destinations are missing is a rate on the zone that covers them.'\n : 'Give them a zone with a rate, or add a rest-of-world zone and price one on it.'}\n </Alert>\n ) : (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {coverage.shipsNowhere\n ? coverage.offersLocalPickup\n ? 'No rate reaches any destination, so local pickup is the only delivery choice checkout offers. Nobody is turned away and no shipping is charged.'\n : 'No rate reaches any destination, so checkout charges no shipping and turns nobody away.'\n : `Checkout can price shipping to every destination it collects an address for: ${countryNames(coverage.served)}.`}\n </Typography>\n )}\n {coverage.asksDestination ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {\n 'Rates differ by destination, so checkout asks the shopper where the parcel is going before it can price one.'\n }\n </Typography>\n ) : null}\n\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n disabled={!draft}\n onClick={handleSave}\n sx={{ alignSelf: 'flex-start' }}\n >\n {'Save shipping settings'}\n </Button>\n </Stack>\n </CardDisplay>\n )\n}\nShippingSettingsCard.displayName = 'ShippingSettingsCard'\n\nexport default ShippingSettingsCard\n\ninterface CarrierRateFieldsProps {\n rate: CommerceModel.ShippingRate\n services: Array<{ serviceKey: string; label: string }>\n available: boolean\n /** The zone's other rates, any of which checkout may fall back to. */\n fallbacks: CommerceModel.ShippingRate[]\n onChange: (patch: Partial<CommerceModel.ShippingRate>) => void\n}\n\n/**\n * A carrier rate's options (AGL-3612): which services checkout offers, what\n * is added to each quote, and the zone's rate offered when no live quote is.\n */\nfunction CarrierRateFields(props: CarrierRateFieldsProps) {\n const { rate, services, available, fallbacks, onChange } = props\n const options = rate.carrier ?? {}\n const set = (patch: Partial<CommerceModel.CarrierRateSettings>) =>\n onChange({ carrier: { ...options, ...patch } })\n const picked = new Set(options.services ?? [])\n return (\n <Stack spacing={1} sx={{ pl: 2 }}>\n {!available ? (\n <Alert severity=\"info\">\n {'Live carrier rates are not available on this site right now, so checkout offers the fallback rate.'}\n </Alert>\n ) : null}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Shoppers see each carrier’s price for their address. Leave every service unticked to offer all of them.'}\n </Typography>\n <Stack direction=\"row\" sx={{ flexWrap: 'wrap', columnGap: 2 }}>\n {services.map((service) => (\n <FormControlLabel\n key={service.serviceKey}\n control={\n <Switch\n size=\"small\"\n checked={picked.has(service.serviceKey)}\n onChange={(event) =>\n set({\n services: event.target.checked\n ? [...picked, service.serviceKey]\n : [...picked].filter((key) => key !== service.serviceKey),\n })\n }\n />\n }\n label={service.label}\n />\n ))}\n </Stack>\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Markup (%)\"\n value={options.markupPct ?? ''}\n onChange={(event) => {\n const pct = Number(event.target.value)\n set({ markupPct: Number.isFinite(pct) && pct > 0 ? Math.min(pct, 500) : 0 })\n }}\n size=\"small\"\n sx={{ width: 120 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n <TextField\n label=\"Handling fee ($)\"\n value={options.handlingCents ? options.handlingCents / 100 : ''}\n onChange={(event) => {\n const dollars = Number(event.target.value)\n set({ handlingCents: Number.isFinite(dollars) && dollars > 0 ? Math.round(dollars * 100) : 0 })\n }}\n size=\"small\"\n sx={{ width: 150 }}\n slotProps={{ htmlInput: { inputMode: 'decimal' } }}\n />\n <TextField\n select\n label=\"If no live rate\"\n value={options.fallbackRateId ?? ''}\n onChange={(event) => set({ fallbackRateId: event.target.value })}\n size=\"small\"\n sx={{ minWidth: 200 }}\n error={!options.fallbackRateId}\n helperText={\n options.fallbackRateId ? undefined : 'Pick a rate of this zone, or checkout can’t price without a quote'\n }\n >\n <MenuItem value=\"\">{'None'}</MenuItem>\n {fallbacks.map((fallback) => (\n <MenuItem key={fallback.id} value={fallback.id}>\n {fallback.name || 'Unnamed rate'}\n </MenuItem>\n ))}\n </TextField>\n </Stack>\n </Stack>\n )\n}\n"],"names":["Aglyn","CommerceModel","CardDisplay","useSnackbar","Alert","AlertTitle","Button","Divider","FormControlLabel","MenuItem","Stack","Switch","TextField","Typography","authorizedFetch","doc","setDoc","useCallback","useEffect","useState","useFirestore","useUser","useFirestoreDoc","writeGuardedBySeed","pluginDocsHelp","ShippingSettingsCard","props","draft","current","hostId","firestore","enqueueSnackbar","data","store","status","storeStatus","fromCache","storeFromCache","setDraft","shipping","user","carrier","setCarrier","available","services","live","encodeURIComponent","then","response","ok","json","answer","Boolean","catch","undefined","update","patch","updateZone","index","zones","removed","splice","rates","filter","rate","zoneId","id","createResourceUid","name","countries","updateRate","kind","handleSave","verdict","subject","unreadable","merge","message","variant","persist","coverage","summarizeShippingCoverage","countryNames","codes","map","code","CHECKOUT_SHIPPING_COUNTRY_NAMES","join","addRestOfWorldZone","length","usd","cents","String","raw","trim","Math","round","Number","header","help","anchor","contentGutterX","contentGutterY","spacing","zone","direction","label","value","onChange","event","target","size","sx","width","split","toUpperCase","flex","placeholder","color","onClick","alignSelf","select","error","helperText","CarrierRateFields","fallbacks","other","amountCents","slotProps","htmlInput","inputMode","freeOverCents","pl","tiers","tier","tierIndex","upTo","_item","itemIndex","disabled","control","checked","localPickup","unserved","severity","action","hasRestOfWorldZone","CHECKOUT_SHIPPING_COUNTRIES","offersLocalPickup","shipsNowhere","served","asksDestination","displayName","options","set","picked","Set","flexWrap","columnGap","service","has","serviceKey","key","markupPct","pct","isFinite","min","handlingCents","dollars","fallbackRateId","minWidth","fallback"],"mappings":"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"}