@aglyn/plugins-commerce 1.0.0-beta.230 → 1.0.0-beta.232

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 (609) 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/catalog-organization-card.component.js +1 -0
  39. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  40. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  41. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  42. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  43. package/src/lib/components/console/host-orders-card.component.js +88 -6
  44. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  45. package/src/lib/components/console/locations-card.component.js +164 -57
  46. package/src/lib/components/console/locations-card.component.js.map +1 -1
  47. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  48. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  49. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  50. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  51. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  52. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  53. package/src/lib/components/console/order-invoice.component.js +81 -0
  54. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  55. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  56. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  57. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  58. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  59. package/src/lib/components/console/order-returns.component.js +142 -0
  60. package/src/lib/components/console/order-returns.component.js.map +1 -0
  61. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  62. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  63. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  64. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  65. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  66. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  67. package/src/lib/components/console/order-zones.d.ts +155 -0
  68. package/src/lib/components/console/order-zones.js +40 -0
  69. package/src/lib/components/console/order-zones.js.map +1 -0
  70. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  71. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  72. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  73. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  74. package/src/lib/components/console/pos/pos-api.js +101 -0
  75. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  77. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  78. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  80. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  81. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  83. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  84. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  86. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  87. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  89. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  90. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  92. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  93. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  94. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  95. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  96. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  97. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  98. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  99. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  100. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  101. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  102. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  103. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  104. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  105. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  107. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  108. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  110. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  111. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  113. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  114. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  115. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  116. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  117. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  118. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  119. package/src/lib/components/console/pos-display-page.component.js +407 -0
  120. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  122. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  123. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  125. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  126. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  128. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  129. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  131. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  132. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  134. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  135. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  140. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  141. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  143. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  144. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  152. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  153. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  155. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  156. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  157. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  158. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  159. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  161. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  162. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  164. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  165. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  166. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  167. package/src/lib/components/console/pos-page.component.js +756 -654
  168. package/src/lib/components/console/pos-page.component.js.map +1 -1
  169. package/src/lib/components/console/pos-zones.d.ts +23 -0
  170. package/src/lib/components/console/pos-zones.js +31 -0
  171. package/src/lib/components/console/pos-zones.js.map +1 -0
  172. package/src/lib/components/console/product-editor-dialog.component.js +61 -71
  173. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  174. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  175. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  176. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  177. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  178. package/src/lib/components/console/product-register-fields.component.js +241 -0
  179. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  180. package/src/lib/components/console/product-zones.d.ts +44 -0
  181. package/src/lib/components/console/product-zones.js.map +1 -1
  182. package/src/lib/components/console/products-hub-card.component.js +23 -20
  183. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  184. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  185. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  186. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  187. package/src/lib/components/console/registers-card.component.js +24 -5
  188. package/src/lib/components/console/registers-card.component.js.map +1 -1
  189. package/src/lib/components/console/return-actions.d.ts +38 -0
  190. package/src/lib/components/console/return-actions.js +76 -0
  191. package/src/lib/components/console/return-actions.js.map +1 -0
  192. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  193. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  194. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  195. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  196. package/src/lib/components/console/return-settings-card.component.js +195 -0
  197. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  198. package/src/lib/components/console/return-zones.d.ts +87 -0
  199. package/src/lib/components/console/return-zones.js +31 -0
  200. package/src/lib/components/console/return-zones.js.map +1 -0
  201. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  202. package/src/lib/components/console/returns-card.component.js +159 -0
  203. package/src/lib/components/console/returns-card.component.js.map +1 -0
  204. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  205. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  206. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  207. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  208. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  209. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  210. package/src/lib/components/console/shipstation-card.component.js +345 -0
  211. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  212. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  213. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  214. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  215. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  216. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  217. package/src/lib/components/console/store-settings-card.component.js +2 -66
  218. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  219. package/src/lib/components/console/store-zones.d.ts +42 -0
  220. package/src/lib/components/console/store-zones.js +39 -0
  221. package/src/lib/components/console/store-zones.js.map +1 -0
  222. package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
  223. package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
  224. package/src/lib/components/order-status.d.ts +36 -0
  225. package/src/lib/components/order-status.js +502 -0
  226. package/src/lib/components/order-status.js.map +1 -0
  227. package/src/lib/components/product-detail.js +41 -2
  228. package/src/lib/components/product-detail.js.map +1 -1
  229. package/src/lib/components/return-request.d.ts +32 -0
  230. package/src/lib/components/return-request.js +576 -0
  231. package/src/lib/components/return-request.js.map +1 -0
  232. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  233. package/src/lib/components/storefront-payment-appearance.js +114 -0
  234. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  235. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  236. package/src/lib/components/storefront-payment-element.js +332 -33
  237. package/src/lib/components/storefront-payment-element.js.map +1 -1
  238. package/src/lib/constants/order-status.d.ts +22 -0
  239. package/src/lib/constants/order-status.js +22 -0
  240. package/src/lib/constants/order-status.js.map +1 -0
  241. package/src/lib/constants/return-request.d.ts +27 -0
  242. package/src/lib/constants/return-request.js +32 -0
  243. package/src/lib/constants/return-request.js.map +1 -0
  244. package/src/lib/constants/stock-movement-query.js +2 -1
  245. package/src/lib/constants/stock-movement-query.js.map +1 -1
  246. package/src/lib/declarations.console-server.js +9 -0
  247. package/src/lib/declarations.console-server.js.map +1 -1
  248. package/src/lib/declarations.server.d.ts +2 -1
  249. package/src/lib/declarations.server.js +68 -1
  250. package/src/lib/declarations.server.js.map +1 -1
  251. package/src/lib/model/buyer-notifications.d.ts +59 -0
  252. package/src/lib/model/buyer-notifications.js +97 -0
  253. package/src/lib/model/buyer-notifications.js.map +1 -0
  254. package/src/lib/model/commerce-orders.d.ts +171 -2
  255. package/src/lib/model/commerce-orders.js +26 -16
  256. package/src/lib/model/commerce-orders.js.map +1 -1
  257. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  258. package/src/lib/model/commerce-payment-methods.js +247 -0
  259. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  260. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  261. package/src/lib/model/commerce-pos-ops.js +721 -0
  262. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  263. package/src/lib/model/commerce-pos.d.ts +263 -0
  264. package/src/lib/model/commerce-pos.js +375 -0
  265. package/src/lib/model/commerce-pos.js.map +1 -0
  266. package/src/lib/model/commerce-printers.d.ts +211 -0
  267. package/src/lib/model/commerce-printers.js +181 -0
  268. package/src/lib/model/commerce-printers.js.map +1 -0
  269. package/src/lib/model/commerce-receipt.d.ts +97 -0
  270. package/src/lib/model/commerce-receipt.js +180 -0
  271. package/src/lib/model/commerce-receipt.js.map +1 -0
  272. package/src/lib/model/commerce-returns.d.ts +207 -0
  273. package/src/lib/model/commerce-returns.js +300 -0
  274. package/src/lib/model/commerce-returns.js.map +1 -0
  275. package/src/lib/model/commerce-shipping.d.ts +44 -1
  276. package/src/lib/model/commerce-shipping.js +53 -9
  277. package/src/lib/model/commerce-shipping.js.map +1 -1
  278. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  279. package/src/lib/model/commerce-tax-engine.js +129 -0
  280. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  281. package/src/lib/model/commerce.d.ts +91 -2
  282. package/src/lib/model/commerce.js +89 -1
  283. package/src/lib/model/commerce.js.map +1 -1
  284. package/src/lib/model/index.d.ts +16 -0
  285. package/src/lib/model/index.js +16 -0
  286. package/src/lib/model/index.js.map +1 -1
  287. package/src/lib/model/order-events.d.ts +154 -0
  288. package/src/lib/model/order-events.js +153 -0
  289. package/src/lib/model/order-events.js.map +1 -0
  290. package/src/lib/model/order-fulfillment.d.ts +117 -0
  291. package/src/lib/model/order-fulfillment.js +217 -0
  292. package/src/lib/model/order-fulfillment.js.map +1 -0
  293. package/src/lib/model/order-history.d.ts +58 -0
  294. package/src/lib/model/order-history.js +22 -0
  295. package/src/lib/model/order-history.js.map +1 -0
  296. package/src/lib/model/order-list-fields.d.ts +9 -1
  297. package/src/lib/model/order-list-fields.js +7 -1
  298. package/src/lib/model/order-list-fields.js.map +1 -1
  299. package/src/lib/model/order-shipping-export.d.ts +91 -0
  300. package/src/lib/model/order-shipping-export.js +192 -0
  301. package/src/lib/model/order-shipping-export.js.map +1 -0
  302. package/src/lib/model/order-status-view.d.ts +103 -0
  303. package/src/lib/model/order-status-view.js +156 -0
  304. package/src/lib/model/order-status-view.js.map +1 -0
  305. package/src/lib/model/order-webhooks.d.ts +142 -0
  306. package/src/lib/model/order-webhooks.js +91 -0
  307. package/src/lib/model/order-webhooks.js.map +1 -0
  308. package/src/lib/model/product-channel.d.ts +56 -0
  309. package/src/lib/model/product-channel.js +86 -0
  310. package/src/lib/model/product-channel.js.map +1 -0
  311. package/src/lib/model/product-modifiers.d.ts +80 -0
  312. package/src/lib/model/product-modifiers.js +140 -0
  313. package/src/lib/model/product-modifiers.js.map +1 -0
  314. package/src/lib/model/product-write.d.ts +186 -0
  315. package/src/lib/model/product-write.js +116 -0
  316. package/src/lib/model/product-write.js.map +1 -0
  317. package/src/lib/model/shippingeasy.d.ts +94 -0
  318. package/src/lib/model/shippingeasy.js +267 -0
  319. package/src/lib/model/shippingeasy.js.map +1 -0
  320. package/src/lib/model/shipstation.d.ts +125 -0
  321. package/src/lib/model/shipstation.js +399 -0
  322. package/src/lib/model/shipstation.js.map +1 -0
  323. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  324. package/src/lib/model/smart-collection-reads.js +63 -0
  325. package/src/lib/model/smart-collection-reads.js.map +1 -0
  326. package/src/lib/model/tracking-url.d.ts +74 -0
  327. package/src/lib/model/tracking-url.js +159 -0
  328. package/src/lib/model/tracking-url.js.map +1 -0
  329. package/src/lib/plugin-config.d.ts +13 -0
  330. package/src/lib/plugin-config.js +77 -5
  331. package/src/lib/plugin-config.js.map +1 -1
  332. package/src/lib/plugin.js +26 -0
  333. package/src/lib/plugin.js.map +1 -1
  334. package/src/lib/pos-ops-config.d.ts +39 -0
  335. package/src/lib/pos-ops-config.js +88 -0
  336. package/src/lib/pos-ops-config.js.map +1 -0
  337. package/src/lib/printing/print-document.d.ts +106 -0
  338. package/src/lib/printing/print-document.js +464 -0
  339. package/src/lib/printing/print-document.js.map +1 -0
  340. package/src/lib/printing/product-labels.d.ts +58 -0
  341. package/src/lib/printing/product-labels.js +116 -0
  342. package/src/lib/printing/product-labels.js.map +1 -0
  343. package/src/lib/printing/render-epson.d.ts +57 -0
  344. package/src/lib/printing/render-epson.js +135 -0
  345. package/src/lib/printing/render-epson.js.map +1 -0
  346. package/src/lib/printing/render-star.d.ts +45 -0
  347. package/src/lib/printing/render-star.js +100 -0
  348. package/src/lib/printing/render-star.js.map +1 -0
  349. package/src/lib/printing/render-text.d.ts +25 -0
  350. package/src/lib/printing/render-text.js +53 -0
  351. package/src/lib/printing/render-text.js.map +1 -0
  352. package/src/lib/server/api-v1/openapi.js +27 -4
  353. package/src/lib/server/api-v1/openapi.js.map +1 -1
  354. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  355. package/src/lib/server/api-v1/order-view.js +120 -0
  356. package/src/lib/server/api-v1/order-view.js.map +1 -0
  357. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  358. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  359. package/src/lib/server/billing-webhook.js +135 -28
  360. package/src/lib/server/billing-webhook.js.map +1 -1
  361. package/src/lib/server/cancel-order.js +29 -0
  362. package/src/lib/server/cancel-order.js.map +1 -1
  363. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  364. package/src/lib/server/carrier-rates-availability.js +76 -0
  365. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  366. package/src/lib/server/carrier-shipping.d.ts +84 -0
  367. package/src/lib/server/carrier-shipping.js +135 -0
  368. package/src/lib/server/carrier-shipping.js.map +1 -0
  369. package/src/lib/server/cart-checkout.d.ts +2 -0
  370. package/src/lib/server/cart-checkout.js +226 -22
  371. package/src/lib/server/cart-checkout.js.map +1 -1
  372. package/src/lib/server/channel-order-updates.d.ts +50 -0
  373. package/src/lib/server/channel-order-updates.js +290 -0
  374. package/src/lib/server/channel-order-updates.js.map +1 -0
  375. package/src/lib/server/channel-orders.d.ts +85 -0
  376. package/src/lib/server/channel-orders.js +543 -0
  377. package/src/lib/server/channel-orders.js.map +1 -0
  378. package/src/lib/server/checkout-extras.d.ts +64 -0
  379. package/src/lib/server/checkout-extras.js +157 -0
  380. package/src/lib/server/checkout-extras.js.map +1 -0
  381. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  382. package/src/lib/server/checkout-status.js +111 -0
  383. package/src/lib/server/checkout-status.js.map +1 -0
  384. package/src/lib/server/checkout.js +86 -9
  385. package/src/lib/server/checkout.js.map +1 -1
  386. package/src/lib/server/draft-order.js +34 -5
  387. package/src/lib/server/draft-order.js.map +1 -1
  388. package/src/lib/server/fulfill-order.d.ts +127 -10
  389. package/src/lib/server/fulfill-order.js +451 -49
  390. package/src/lib/server/fulfill-order.js.map +1 -1
  391. package/src/lib/server/legacy-feed.d.ts +28 -0
  392. package/src/lib/server/legacy-feed.js +52 -0
  393. package/src/lib/server/legacy-feed.js.map +1 -0
  394. package/src/lib/server/native-checkout.d.ts +34 -15
  395. package/src/lib/server/native-checkout.js +32 -17
  396. package/src/lib/server/native-checkout.js.map +1 -1
  397. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  398. package/src/lib/server/order-event-host-emit.js +30 -0
  399. package/src/lib/server/order-event-host-emit.js.map +1 -0
  400. package/src/lib/server/order-event-triggers.d.ts +37 -0
  401. package/src/lib/server/order-event-triggers.js +119 -0
  402. package/src/lib/server/order-event-triggers.js.map +1 -0
  403. package/src/lib/server/order-events.d.ts +62 -0
  404. package/src/lib/server/order-events.js +109 -0
  405. package/src/lib/server/order-events.js.map +1 -0
  406. package/src/lib/server/order-history.d.ts +23 -0
  407. package/src/lib/server/order-history.js +65 -0
  408. package/src/lib/server/order-history.js.map +1 -0
  409. package/src/lib/server/order-notifications.d.ts +185 -0
  410. package/src/lib/server/order-notifications.js +567 -0
  411. package/src/lib/server/order-notifications.js.map +1 -0
  412. package/src/lib/server/order-receipt-send.d.ts +39 -0
  413. package/src/lib/server/order-receipt-send.js +151 -0
  414. package/src/lib/server/order-receipt-send.js.map +1 -0
  415. package/src/lib/server/order-status-token.d.ts +31 -0
  416. package/src/lib/server/order-status-token.js +75 -0
  417. package/src/lib/server/order-status-token.js.map +1 -0
  418. package/src/lib/server/order-status.d.ts +58 -0
  419. package/src/lib/server/order-status.js +141 -0
  420. package/src/lib/server/order-status.js.map +1 -0
  421. package/src/lib/server/order-webhooks.d.ts +108 -0
  422. package/src/lib/server/order-webhooks.js +622 -0
  423. package/src/lib/server/order-webhooks.js.map +1 -0
  424. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  425. package/src/lib/server/orders-shipping-prepare.js +121 -0
  426. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  427. package/src/lib/server/payment-method-domains.d.ts +209 -0
  428. package/src/lib/server/payment-method-domains.js +444 -0
  429. package/src/lib/server/payment-method-domains.js.map +1 -0
  430. package/src/lib/server/payment-methods.d.ts +77 -0
  431. package/src/lib/server/payment-methods.js +284 -0
  432. package/src/lib/server/payment-methods.js.map +1 -0
  433. package/src/lib/server/pos-auth.d.ts +50 -0
  434. package/src/lib/server/pos-auth.js +121 -0
  435. package/src/lib/server/pos-auth.js.map +1 -0
  436. package/src/lib/server/pos-customer.d.ts +49 -0
  437. package/src/lib/server/pos-customer.js +257 -0
  438. package/src/lib/server/pos-customer.js.map +1 -0
  439. package/src/lib/server/pos-display.d.ts +57 -0
  440. package/src/lib/server/pos-display.js +419 -0
  441. package/src/lib/server/pos-display.js.map +1 -0
  442. package/src/lib/server/pos-fee-month.d.ts +34 -0
  443. package/src/lib/server/pos-fee-month.js +36 -0
  444. package/src/lib/server/pos-fee-month.js.map +1 -0
  445. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  446. package/src/lib/server/pos-ops-gate.js +295 -0
  447. package/src/lib/server/pos-ops-gate.js.map +1 -0
  448. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  449. package/src/lib/server/pos-ops-routes.js +36 -0
  450. package/src/lib/server/pos-ops-routes.js.map +1 -0
  451. package/src/lib/server/pos-order.d.ts +1 -18
  452. package/src/lib/server/pos-order.js +222 -42
  453. package/src/lib/server/pos-order.js.map +1 -1
  454. package/src/lib/server/pos-payment.d.ts +39 -0
  455. package/src/lib/server/pos-payment.js +922 -0
  456. package/src/lib/server/pos-payment.js.map +1 -0
  457. package/src/lib/server/pos-print.d.ts +82 -0
  458. package/src/lib/server/pos-print.js +193 -0
  459. package/src/lib/server/pos-print.js.map +1 -0
  460. package/src/lib/server/pos-readers.d.ts +27 -0
  461. package/src/lib/server/pos-readers.js +276 -0
  462. package/src/lib/server/pos-readers.js.map +1 -0
  463. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  464. package/src/lib/server/pos-refund-authority.js +72 -0
  465. package/src/lib/server/pos-refund-authority.js.map +1 -0
  466. package/src/lib/server/pos-return.d.ts +58 -0
  467. package/src/lib/server/pos-return.js +891 -0
  468. package/src/lib/server/pos-return.js.map +1 -0
  469. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  470. package/src/lib/server/pos-sale-stamp.js +84 -0
  471. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  472. package/src/lib/server/pos-sale.d.ts +170 -0
  473. package/src/lib/server/pos-sale.js +461 -0
  474. package/src/lib/server/pos-sale.js.map +1 -0
  475. package/src/lib/server/pos-shift.d.ts +45 -0
  476. package/src/lib/server/pos-shift.js +484 -0
  477. package/src/lib/server/pos-shift.js.map +1 -0
  478. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  479. package/src/lib/server/pos-staff-pin.js +339 -0
  480. package/src/lib/server/pos-staff-pin.js.map +1 -0
  481. package/src/lib/server/pos-stripe.d.ts +91 -0
  482. package/src/lib/server/pos-stripe.js +129 -0
  483. package/src/lib/server/pos-stripe.js.map +1 -0
  484. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  485. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  486. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  487. package/src/lib/server/pos-terminal.d.ts +218 -0
  488. package/src/lib/server/pos-terminal.js +1014 -0
  489. package/src/lib/server/pos-terminal.js.map +1 -0
  490. package/src/lib/server/print-queue.d.ts +124 -0
  491. package/src/lib/server/print-queue.js +301 -0
  492. package/src/lib/server/print-queue.js.map +1 -0
  493. package/src/lib/server/printer-poll.d.ts +75 -0
  494. package/src/lib/server/printer-poll.js +325 -0
  495. package/src/lib/server/printer-poll.js.map +1 -0
  496. package/src/lib/server/printer-secret.d.ts +39 -0
  497. package/src/lib/server/printer-secret.js +56 -0
  498. package/src/lib/server/printer-secret.js.map +1 -0
  499. package/src/lib/server/printers.d.ts +114 -0
  500. package/src/lib/server/printers.js +546 -0
  501. package/src/lib/server/printers.js.map +1 -0
  502. package/src/lib/server/product-catalog.d.ts +42 -0
  503. package/src/lib/server/product-catalog.js +309 -0
  504. package/src/lib/server/product-catalog.js.map +1 -0
  505. package/src/lib/server/product-drafts.d.ts +5 -1
  506. package/src/lib/server/product-drafts.js +3 -3
  507. package/src/lib/server/product-drafts.js.map +1 -1
  508. package/src/lib/server/product-writer.d.ts +19 -0
  509. package/src/lib/server/product-writer.js +261 -0
  510. package/src/lib/server/product-writer.js.map +1 -0
  511. package/src/lib/server/products-write.d.ts +61 -0
  512. package/src/lib/server/products-write.js +375 -0
  513. package/src/lib/server/products-write.js.map +1 -0
  514. package/src/lib/server/refund.js +110 -45
  515. package/src/lib/server/refund.js.map +1 -1
  516. package/src/lib/server/reserve.js +2 -0
  517. package/src/lib/server/reserve.js.map +1 -1
  518. package/src/lib/server/return-status-action.d.ts +37 -0
  519. package/src/lib/server/return-status-action.js +57 -0
  520. package/src/lib/server/return-status-action.js.map +1 -0
  521. package/src/lib/server/returns.d.ts +119 -0
  522. package/src/lib/server/returns.js +938 -0
  523. package/src/lib/server/returns.js.map +1 -0
  524. package/src/lib/server/shipment-records.d.ts +36 -0
  525. package/src/lib/server/shipment-records.js +289 -0
  526. package/src/lib/server/shipment-records.js.map +1 -0
  527. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  528. package/src/lib/server/shipping-connector-gates.js +97 -0
  529. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  530. package/src/lib/server/shipping-connectors.d.ts +29 -0
  531. package/src/lib/server/shipping-connectors.js +236 -0
  532. package/src/lib/server/shipping-connectors.js.map +1 -0
  533. package/src/lib/server/shippingeasy.d.ts +238 -0
  534. package/src/lib/server/shippingeasy.js +787 -0
  535. package/src/lib/server/shippingeasy.js.map +1 -0
  536. package/src/lib/server/shipstation.d.ts +129 -0
  537. package/src/lib/server/shipstation.js +483 -0
  538. package/src/lib/server/shipstation.js.map +1 -0
  539. package/src/lib/server/site-page-resolver.d.ts +5 -0
  540. package/src/lib/server/site-page-resolver.js +156 -1
  541. package/src/lib/server/site-page-resolver.js.map +1 -1
  542. package/src/lib/server/stock-levels.d.ts +21 -0
  543. package/src/lib/server/stock-levels.js +263 -0
  544. package/src/lib/server/stock-levels.js.map +1 -0
  545. package/src/lib/server/stripe-refund.d.ts +47 -0
  546. package/src/lib/server/stripe-refund.js +87 -0
  547. package/src/lib/server/stripe-refund.js.map +1 -0
  548. package/src/lib/server/supplier-update.js +46 -5
  549. package/src/lib/server/supplier-update.js.map +1 -1
  550. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  551. package/src/lib/server/tax-engine-quote.js +105 -0
  552. package/src/lib/server/tax-engine-quote.js.map +1 -0
  553. package/src/lib/server.js +143 -2
  554. package/src/lib/server.js.map +1 -1
  555. package/src/lib/site.js +12 -0
  556. package/src/lib/site.js.map +1 -1
  557. package/src/lib/subprocessors.d.ts +26 -0
  558. package/src/lib/subprocessors.js +50 -0
  559. package/src/lib/subprocessors.js.map +1 -0
  560. package/src/lib/tenant-emails.js +461 -3
  561. package/src/lib/tenant-emails.js.map +1 -1
  562. package/src/lib/testing/fake-firestore.d.ts +45 -0
  563. package/src/lib/testing/fake-firestore.js +189 -0
  564. package/src/lib/testing/fake-firestore.js.map +1 -0
  565. package/src/lib/testing/memory-firestore.d.ts +136 -0
  566. package/src/lib/testing/memory-firestore.js +282 -0
  567. package/src/lib/testing/memory-firestore.js.map +1 -0
  568. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  569. package/src/lib/testing/pos-ops-harness.js +184 -0
  570. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  571. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  572. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  573. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  574. package/src/lib/transfer/products.server.d.ts +5 -0
  575. package/src/lib/transfer/products.server.js +2 -2
  576. package/src/lib/transfer/products.server.js.map +1 -1
  577. package/src/lib/transfer/records-transfer.d.ts +11 -1
  578. package/src/lib/transfer/records-transfer.js +127 -5
  579. package/src/lib/transfer/records-transfer.js.map +1 -1
  580. package/src/lib/transfer/records.server.d.ts +9 -2
  581. package/src/lib/transfer/records.server.js +58 -7
  582. package/src/lib/transfer/records.server.js.map +1 -1
  583. package/src/lib/transfer/register-transfer-resources.js +40 -1
  584. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  585. package/src/lib/transfer/register-transfer-ui.js +4 -1
  586. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  587. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  588. package/src/lib/transfer/shipping-presets.js +156 -0
  589. package/src/lib/transfer/shipping-presets.js.map +1 -0
  590. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  591. package/src/lib/transfer/tracking-transfer.js +546 -0
  592. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  593. package/src/lib/transfer/tracking.server.d.ts +37 -0
  594. package/src/lib/transfer/tracking.server.js +393 -0
  595. package/src/lib/transfer/tracking.server.js.map +1 -0
  596. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  597. package/src/lib/transfer/transfer-keys.js +6 -2
  598. package/src/lib/transfer/transfer-keys.js.map +1 -1
  599. package/src/lib/utils/code128.d.ts +37 -0
  600. package/src/lib/utils/code128.js +199 -0
  601. package/src/lib/utils/code128.js.map +1 -0
  602. package/src/lib/utils/order-invoice.d.ts +55 -0
  603. package/src/lib/utils/order-invoice.js +127 -0
  604. package/src/lib/utils/order-invoice.js.map +1 -0
  605. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  606. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  607. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  608. package/src/lib/server/feed.js +0 -69
  609. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,243 @@
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 { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ import * as CommerceModel from "../../model/index.js";
20
+ import { useSnackbar } from "@aglyn/shared-ui-snackstack";
21
+ import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, FormControlLabel, MenuItem, Stack, TextField, Typography } from "@mui/material";
22
+ import { useCallback, useMemo, useState } from "react";
23
+ import { useUser } from "@aglyn/tenant-feature-instance";
24
+ import { postReturnAction } from "./return-actions.js";
25
+ /**
26
+ * "Start return" (AGL-3611): the merchant opens a return on the buyer's
27
+ * behalf. It starts approved — the merchant asking is the approval — and the
28
+ * route re-checks every quantity against the order and the returns already on
29
+ * it. What is offered here is `returnableLines` with no store policy, since a
30
+ * merchant may take back any product type, at any time.
31
+ */ export function StartReturnDialog(props) {
32
+ const { hostId, orderId, order, existing, open, onClose, onCreated } = props;
33
+ const { data: user } = useUser();
34
+ const { enqueueSnackbar } = useSnackbar();
35
+ const returnable = useMemo(()=>CommerceModel.returnableLines(order, existing, null), [
36
+ order,
37
+ existing
38
+ ]);
39
+ const [choices, setChoices] = useState({});
40
+ const [note, setNote] = useState('');
41
+ const [notify, setNotify] = useState(true);
42
+ const [busy, setBusy] = useState(false);
43
+ const choiceFor = (lineItemId)=>{
44
+ var _choices_lineItemId;
45
+ return (_choices_lineItemId = choices[lineItemId]) != null ? _choices_lineItemId : {
46
+ quantity: '0',
47
+ reason: 'other'
48
+ };
49
+ };
50
+ const setChoice = (lineItemId, patch)=>setChoices((prior)=>{
51
+ var _prior_lineItemId;
52
+ return _extends({}, prior, {
53
+ [lineItemId]: _extends({}, (_prior_lineItemId = prior[lineItemId]) != null ? _prior_lineItemId : {
54
+ quantity: '0',
55
+ reason: 'other'
56
+ }, patch)
57
+ });
58
+ });
59
+ const lines = returnable.map((line)=>({
60
+ lineItemId: line.lineItemId,
61
+ quantity: Math.floor(Number(choiceFor(line.lineItemId).quantity) || 0),
62
+ reason: choiceFor(line.lineItemId).reason,
63
+ returnable: line.returnable
64
+ })).filter((line)=>line.quantity > 0);
65
+ const overLimit = lines.some((line)=>line.quantity > line.returnable);
66
+ const handleClose = useCallback(()=>{
67
+ setChoices({});
68
+ setNote('');
69
+ setNotify(true);
70
+ onClose();
71
+ }, [
72
+ onClose
73
+ ]);
74
+ const handleSubmit = useCallback(async ()=>{
75
+ setBusy(true);
76
+ try {
77
+ var _outcome_payload_returnId;
78
+ const outcome = await postReturnAction(user, _extends({
79
+ hostId,
80
+ action: 'create',
81
+ orderId,
82
+ lines: lines.map(({ lineItemId, quantity, reason })=>({
83
+ lineItemId,
84
+ quantity,
85
+ reason
86
+ }))
87
+ }, note.trim() ? {
88
+ note: note.trim()
89
+ } : {}, {
90
+ notify
91
+ }));
92
+ if (!outcome.ok) {
93
+ enqueueSnackbar(outcome.message, {
94
+ variant: outcome.refused ? 'warning' : 'error',
95
+ allowDuplicate: true
96
+ });
97
+ return;
98
+ }
99
+ enqueueSnackbar('Return started', {
100
+ variant: 'success',
101
+ persist: false
102
+ });
103
+ const returnId = String((_outcome_payload_returnId = outcome.payload['returnId']) != null ? _outcome_payload_returnId : '');
104
+ handleClose();
105
+ if (returnId) onCreated == null ? void 0 : onCreated(returnId);
106
+ } finally{
107
+ setBusy(false);
108
+ }
109
+ }, [
110
+ user,
111
+ hostId,
112
+ orderId,
113
+ lines,
114
+ note,
115
+ notify,
116
+ enqueueSnackbar,
117
+ handleClose,
118
+ onCreated
119
+ ]);
120
+ return /*#__PURE__*/ _jsxs(Dialog, {
121
+ open: open,
122
+ onClose: handleClose,
123
+ maxWidth: "sm",
124
+ fullWidth: true,
125
+ children: [
126
+ /*#__PURE__*/ _jsx(DialogTitle, {
127
+ children: 'Start a return'
128
+ }),
129
+ /*#__PURE__*/ _jsxs(DialogContent, {
130
+ sx: {
131
+ display: 'flex',
132
+ flexDirection: 'column',
133
+ gap: 1.5
134
+ },
135
+ children: [
136
+ /*#__PURE__*/ _jsx(Typography, {
137
+ variant: "body2",
138
+ color: "text.secondary",
139
+ children: 'Choose what is coming back. A return you start is approved at once; ' + 'receive the parcel and refund it from the return.'
140
+ }),
141
+ returnable.map((line)=>/*#__PURE__*/ _jsxs(Stack, {
142
+ direction: "row",
143
+ spacing: 1,
144
+ sx: {
145
+ alignItems: 'center'
146
+ },
147
+ children: [
148
+ /*#__PURE__*/ _jsxs(Typography, {
149
+ variant: "body2",
150
+ sx: {
151
+ flex: 1
152
+ },
153
+ color: line.returnable ? 'text.primary' : 'text.secondary',
154
+ children: [
155
+ line.name + (line.variantLabel ? ` — ${line.variantLabel}` : ''),
156
+ line.blocked ? ` (${line.blocked})` : ''
157
+ ]
158
+ }),
159
+ /*#__PURE__*/ _jsx(TextField, {
160
+ label: `Quantity (of ${line.returnable})`,
161
+ type: "number",
162
+ size: "small",
163
+ disabled: !line.returnable,
164
+ value: choiceFor(line.lineItemId).quantity,
165
+ onChange: (event)=>setChoice(line.lineItemId, {
166
+ quantity: event.target.value
167
+ }),
168
+ error: Number(choiceFor(line.lineItemId).quantity) > line.returnable,
169
+ slotProps: {
170
+ htmlInput: {
171
+ min: 0,
172
+ max: line.returnable,
173
+ step: 1
174
+ }
175
+ },
176
+ sx: {
177
+ width: 140
178
+ }
179
+ }),
180
+ /*#__PURE__*/ _jsx(TextField, {
181
+ label: "Reason",
182
+ select: true,
183
+ size: "small",
184
+ disabled: !line.returnable,
185
+ value: choiceFor(line.lineItemId).reason,
186
+ onChange: (event)=>setChoice(line.lineItemId, {
187
+ reason: event.target.value
188
+ }),
189
+ sx: {
190
+ width: 180
191
+ },
192
+ children: CommerceModel.RETURN_REASONS.map((reason)=>/*#__PURE__*/ _jsx(MenuItem, {
193
+ value: reason,
194
+ children: CommerceModel.RETURN_REASON_LABELS[reason]
195
+ }, reason))
196
+ })
197
+ ]
198
+ }, line.lineItemId)),
199
+ /*#__PURE__*/ _jsx(TextField, {
200
+ label: "Note (optional)",
201
+ value: note,
202
+ onChange: (event)=>setNote(event.target.value),
203
+ size: "small",
204
+ multiline: true,
205
+ minRows: 2,
206
+ slotProps: {
207
+ htmlInput: {
208
+ maxLength: CommerceModel.RETURN_NOTE_MAX
209
+ }
210
+ }
211
+ }),
212
+ /*#__PURE__*/ _jsx(FormControlLabel, {
213
+ control: /*#__PURE__*/ _jsx(Checkbox, {
214
+ checked: notify,
215
+ onChange: (event)=>setNotify(event.target.checked)
216
+ }),
217
+ label: "Notify customer"
218
+ })
219
+ ]
220
+ }),
221
+ /*#__PURE__*/ _jsxs(DialogActions, {
222
+ children: [
223
+ /*#__PURE__*/ _jsx(Button, {
224
+ disabled: busy,
225
+ onClick: handleClose,
226
+ children: 'Cancel'
227
+ }),
228
+ /*#__PURE__*/ _jsx(Button, {
229
+ variant: "contained",
230
+ color: "primary",
231
+ disabled: busy || lines.length === 0 || overLimit,
232
+ onClick: handleSubmit,
233
+ children: 'Start return'
234
+ })
235
+ ]
236
+ })
237
+ ]
238
+ });
239
+ }
240
+ StartReturnDialog.displayName = 'StartReturnDialog';
241
+ export default StartReturnDialog;
242
+
243
+ //# sourceMappingURL=start-return-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/start-return-dialog.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 { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Button,\n Checkbox,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useMemo, useState } from 'react'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { postReturnAction } from './return-actions'\n\nexport interface StartReturnDialogProps {\n hostId: string\n orderId: string\n order: Pick<\n CommerceModel.HostOrder,\n 'lineItems' | 'fulfillments' | 'refundedLineItemIds'\n >\n /** The returns already on the order, which hold units against it. */\n existing: ReadonlyArray<Pick<CommerceModel.HostReturn, 'status' | 'lines' | 'refundedAtMs'>>\n open: boolean\n onClose: () => void\n /** Called with the new return's id once the route opened it. */\n onCreated?: (returnId: string) => void\n}\n\ninterface LineChoice {\n quantity: string\n reason: CommerceModel.ReturnReason\n}\n\n/**\n * \"Start return\" (AGL-3611): the merchant opens a return on the buyer's\n * behalf. It starts approved — the merchant asking is the approval — and the\n * route re-checks every quantity against the order and the returns already on\n * it. What is offered here is `returnableLines` with no store policy, since a\n * merchant may take back any product type, at any time.\n */\nexport function StartReturnDialog(props: StartReturnDialogProps) {\n const { hostId, orderId, order, existing, open, onClose, onCreated } = props\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const returnable = useMemo(\n () => CommerceModel.returnableLines(order, existing, null),\n [order, existing],\n )\n const [choices, setChoices] = useState<Record<number, LineChoice>>({})\n const [note, setNote] = useState('')\n const [notify, setNotify] = useState(true)\n const [busy, setBusy] = useState(false)\n\n const choiceFor = (lineItemId: number): LineChoice =>\n choices[lineItemId] ?? { quantity: '0', reason: 'other' }\n const setChoice = (lineItemId: number, patch: Partial<LineChoice>) =>\n setChoices((prior) => ({\n ...prior,\n [lineItemId]: { ...(prior[lineItemId] ?? { quantity: '0', reason: 'other' }), ...patch },\n }))\n\n const lines = returnable\n .map((line) => ({\n lineItemId: line.lineItemId,\n quantity: Math.floor(Number(choiceFor(line.lineItemId).quantity) || 0),\n reason: choiceFor(line.lineItemId).reason,\n returnable: line.returnable,\n }))\n .filter((line) => line.quantity > 0)\n const overLimit = lines.some((line) => line.quantity > line.returnable)\n\n const handleClose = useCallback(() => {\n setChoices({})\n setNote('')\n setNotify(true)\n onClose()\n }, [onClose])\n\n const handleSubmit = useCallback(async () => {\n setBusy(true)\n try {\n const outcome = await postReturnAction(user, {\n hostId,\n action: 'create',\n orderId,\n lines: lines.map(({ lineItemId, quantity, reason }) => ({ lineItemId, quantity, reason })),\n ...(note.trim() ? { note: note.trim() } : {}),\n notify,\n })\n if (!outcome.ok) {\n enqueueSnackbar(outcome.message, {\n variant: outcome.refused ? 'warning' : 'error',\n allowDuplicate: true,\n })\n return\n }\n enqueueSnackbar('Return started', { variant: 'success', persist: false })\n const returnId = String(outcome.payload['returnId'] ?? '')\n handleClose()\n if (returnId) onCreated?.(returnId)\n } finally {\n setBusy(false)\n }\n }, [user, hostId, orderId, lines, note, notify, enqueueSnackbar, handleClose, onCreated])\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>{'Start a return'}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Choose what is coming back. A return you start is approved at once; ' +\n 'receive the parcel and refund it from the return.'}\n </Typography>\n {returnable.map((line) => (\n <Stack key={line.lineItemId} direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography\n variant=\"body2\"\n sx={{ flex: 1 }}\n color={line.returnable ? 'text.primary' : 'text.secondary'}\n >\n {line.name + (line.variantLabel ? ` — ${line.variantLabel}` : '')}\n {line.blocked ? ` (${line.blocked})` : ''}\n </Typography>\n <TextField\n label={`Quantity (of ${line.returnable})`}\n type=\"number\"\n size=\"small\"\n disabled={!line.returnable}\n value={choiceFor(line.lineItemId).quantity}\n onChange={(event) => setChoice(line.lineItemId, { quantity: event.target.value })}\n error={Number(choiceFor(line.lineItemId).quantity) > line.returnable}\n slotProps={{ htmlInput: { min: 0, max: line.returnable, step: 1 } }}\n sx={{ width: 140 }}\n />\n <TextField\n label=\"Reason\"\n select\n size=\"small\"\n disabled={!line.returnable}\n value={choiceFor(line.lineItemId).reason}\n onChange={(event) =>\n setChoice(line.lineItemId, {\n reason: event.target.value as CommerceModel.ReturnReason,\n })\n }\n sx={{ width: 180 }}\n >\n {CommerceModel.RETURN_REASONS.map((reason) => (\n <MenuItem key={reason} value={reason}>\n {CommerceModel.RETURN_REASON_LABELS[reason]}\n </MenuItem>\n ))}\n </TextField>\n </Stack>\n ))}\n <TextField\n label=\"Note (optional)\"\n value={note}\n onChange={(event) => setNote(event.target.value)}\n size=\"small\"\n multiline\n minRows={2}\n slotProps={{ htmlInput: { maxLength: CommerceModel.RETURN_NOTE_MAX } }}\n />\n <FormControlLabel\n control={\n <Checkbox checked={notify} onChange={(event) => setNotify(event.target.checked)} />\n }\n label=\"Notify customer\"\n />\n </DialogContent>\n <DialogActions>\n <Button disabled={busy} onClick={handleClose}>\n {'Cancel'}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={busy || lines.length === 0 || overLimit}\n onClick={handleSubmit}\n >\n {'Start return'}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\nStartReturnDialog.displayName = 'StartReturnDialog'\n\nexport default StartReturnDialog\n"],"names":["CommerceModel","useSnackbar","Button","Checkbox","Dialog","DialogActions","DialogContent","DialogTitle","FormControlLabel","MenuItem","Stack","TextField","Typography","useCallback","useMemo","useState","useUser","postReturnAction","StartReturnDialog","props","hostId","orderId","order","existing","open","onClose","onCreated","data","user","enqueueSnackbar","returnable","returnableLines","choices","setChoices","note","setNote","notify","setNotify","busy","setBusy","choiceFor","lineItemId","quantity","reason","setChoice","patch","prior","lines","map","line","Math","floor","Number","filter","overLimit","some","handleClose","handleSubmit","outcome","action","trim","ok","message","variant","refused","allowDuplicate","persist","returnId","String","payload","maxWidth","fullWidth","sx","display","flexDirection","gap","color","direction","spacing","alignItems","flex","name","variantLabel","blocked","label","type","size","disabled","value","onChange","event","target","error","slotProps","htmlInput","min","max","step","width","select","RETURN_REASONS","RETURN_REASON_LABELS","multiline","minRows","maxLength","RETURN_NOTE_MAX","control","checked","onClick","length","displayName"],"mappings":"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"}
@@ -227,7 +227,8 @@ const REASON_OPTIONS = Object.entries(STOCK_MOVEMENT_REASON_LABEL).map(([value,
227
227
  color: "text.secondary",
228
228
  children: [
229
229
  row.orderId ? `order ${row.orderId}` : null,
230
- row.locationId ? `at ${row.locationId}` : null
230
+ row.locationId ? `at ${row.locationId}` : null,
231
+ row.source ? `counted by ${row.source}` : null
231
232
  ].filter(Boolean).join(' · ') || '—'
232
233
  })
233
234
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/stock-movements-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 { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport ListFilterChips from '@aglyn/shared-ui-jsx/components/list-filter-chips.component'\nimport { ListPagination } from '@aglyn/shared-ui-jsx/components/list-pagination.component'\nimport {\n ListQueryNotices,\n listQueryRefusals,\n} from '@aglyn/shared-ui-jsx/components/list-query-notices.component'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { hiddenFilterVisibility } from '@aglyn/shared-ui-jsx/const/list-filter'\nimport { listFilterGridColumns } from '@aglyn/shared-ui-jsx/const/list-grid-filter'\nimport { useListGridFilter } from '@aglyn/shared-ui-jsx/hooks/use-list-grid-filter'\nimport { Stack, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { collection } from 'firebase/firestore'\nimport { useMemo } from 'react'\nimport {\n ceilingedWindow,\n collectionCeiling,\n useFirestore,\n useFirestoreCollection,\n} from '@aglyn/tenant-feature-instance'\nimport { useListQuery } from '@aglyn/tenant-feature-instance/hooks/use-list-query'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport {\n STOCK_MOVEMENT_FILTER_FIELDS,\n STOCK_MOVEMENT_FILTER_HEADERS,\n STOCK_MOVEMENT_QUERY,\n STOCK_MOVEMENT_REASON_LABEL,\n STOCK_MOVEMENT_SELECT_FIELDS,\n} from '../../constants/stock-movement-query'\n\nexport interface StockMovementsCardProps {\n hostId: string\n}\n\n/**\n * How many products the card reads to NAME its rows and offer the Product\n * filter's choices. A picker's reach, not the ledger's: the ledger itself is\n * paged by its query and reaches every movement whatever this holds.\n */\nconst PRODUCT_NAMES_CEILING = 500\n/** A site's locations, which the plan caps well under this. */\nconst LOCATION_CEILING = 25\n\nconst movementsHelp = pluginDocsHelp('commerce', {\n anchor: '#stock-movements',\n title: 'Stock movements',\n excerpt:\n 'Every change to a tracked count — sales, returns, cancellations and ' +\n 'hand adjustments — newest first, with the reason each one was made.',\n})\n\nconst REASON_OPTIONS = Object.entries(STOCK_MOVEMENT_REASON_LABEL).map(([value, label]) => ({\n value,\n label,\n}))\n\n/** The columns the grid draws; every other declared field is a hidden filter column. */\nconst VISIBLE_COLUMNS = ['atMs', 'productId', 'delta', 'reason', 'source']\n\ntype MovementRow = CommerceModel.InventoryAdjustment & { $id: string }\n\n/**\n * Stock movements (AGL-2341) — the adjustment history that had no history\n * view.\n *\n * `hosts/{hostId}/inventoryAdjustments` has three writers: the products\n * hub's \"Adjust stock\" dialog, `decrementVariantStock` (the sale, whether the\n * checkout webhook or the POS sold it), and the restock in `cancel-order.ts`.\n * The hub's own comment calls the collection \"adjustment history\".\n *\n * Its only reader was arithmetic: `cancel-order.ts` projects `appliedDelta`\n * off the `reason: 'sale'` rows to cap what a cancellation may put back. No\n * surface displayed a single one of them. A merchant whose count disagreed\n * with the shelf had no way to see what moved it, when, or why — and the one\n * number that reconciles the discrepancy was written on every adjustment and\n * unreachable.\n *\n * `delta` is what the merchant's history says moved; `appliedDelta` is what\n * the count could actually give up when the floor in `adjustVariantInventory`\n * absorbed part of it, which happens on a backorder product selling past\n * zero. They differ rarely and they differ importantly — three sold out of a\n * count of zero is exactly the state a merchant is trying to explain — so\n * both are shown when they disagree and only `delta` when they do not.\n *\n * ## Every filter is on the query (AGL-3321)\n *\n * The ledger used to read its hundred newest movements and filter those, so\n * \"Damaged\" searched a hundred rows and answered \"none\" about a ledger full\n * of older ones. Now the Filters panel's clauses are the query's `where`s —\n * see `STOCK_MOVEMENT_QUERY` for what each one costs — and the footer pages\n * the query's answer, so page three of \"Damaged\" is the third page of damage\n * the ledger holds, however far back it goes.\n */\nexport function StockMovementsCard(props: StockMovementsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n\n // Names, so a row reads as \"Desk lamp\" rather than a 20-character id, and\n // the Product filter's choices.\n const { data: productDocs } = useFirestoreCollection<any>(\n () =>\n collectionCeiling(\n collection(firestore, 'hosts', hostId, 'products'),\n PRODUCT_NAMES_CEILING,\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () =>\n collectionCeiling(\n collection(firestore, 'hosts', hostId, 'locations'),\n LOCATION_CEILING,\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const products = useMemo(\n () => ceilingedWindow<any>(productDocs ?? undefined, PRODUCT_NAMES_CEILING).rows,\n [productDocs],\n )\n const productNames = useMemo(() => {\n const names = new Map<string, string>()\n for (const product of products) {\n names.set(product.$id, product.name ?? product.$id)\n }\n return names\n }, [products])\n\n const filterOptions = useMemo(\n () => ({\n productId: [...productNames]\n .map(([value, label]) => ({ value, label }))\n .sort((a, b) => a.label.localeCompare(b.label)),\n reason: REASON_OPTIONS,\n locationId: ceilingedWindow<any>(locationDocs ?? undefined, LOCATION_CEILING).rows.map(\n (location: any) => ({ value: location.$id, label: location.name ?? location.$id }),\n ),\n }),\n [productNames, locationDocs],\n )\n\n const gridFilter = useListGridFilter({ selectFields: STOCK_MOVEMENT_SELECT_FIELDS })\n const {\n rows: movementRows,\n hasMore,\n page,\n setPage,\n pageSize,\n setPageSize,\n plan,\n status,\n } = useListQuery<MovementRow>({\n collection: collection(firestore, 'hosts', hostId, 'inventoryAdjustments'),\n declaration: STOCK_MOVEMENT_QUERY,\n request: { clauses: gridFilter.clauses },\n deps: [firestore, hostId],\n idField: '$id',\n })\n const movements = useMemo(\n () =>\n movementRows.map((row) => ({\n ...row,\n productName: productNames.get(row.productId) ?? row.productId,\n })),\n [movementRows, productNames],\n )\n\n const columns = useMemo(\n () =>\n listFilterGridColumns(\n [\n {\n field: 'atMs',\n headerName: 'When',\n width: 190,\n renderCell: ({ row }: { row: MovementRow }) =>\n row.atMs ? new Date(Number(row.atMs)).toLocaleString() : '—',\n },\n {\n field: 'productId',\n headerName: 'Product',\n flex: 1,\n minWidth: 180,\n renderCell: ({ row }: { row: MovementRow & { productName: string } }) => (\n <span>\n {row.productName}\n {row.variantId ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {` · ${row.variantId}`}\n </Typography>\n ) : null}\n </span>\n ),\n },\n {\n field: 'delta',\n headerName: 'Change',\n type: 'number',\n width: 150,\n align: 'right',\n headerAlign: 'right',\n renderCell: ({ row }: { row: MovementRow }) => {\n const delta = Number(row.delta ?? 0)\n const applied = Number(row.appliedDelta ?? delta)\n return (\n <span>\n {/*\n * The sign is carried explicitly. \"3\" and \"-3\" are the same\n * width and opposite facts, and a merchant scanning a column\n * for the movement that broke their count reads the sign\n * before the number.\n */}\n <Typography\n variant=\"body2\"\n color={delta < 0 ? 'error.main' : 'success.main'}\n component=\"span\"\n >\n {delta > 0 ? `+${delta}` : String(delta)}\n </Typography>\n {applied !== delta ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {` (${applied > 0 ? `+${applied}` : applied} applied)`}\n </Typography>\n ) : null}\n </span>\n )\n },\n },\n {\n field: 'reason',\n headerName: 'Reason',\n width: 150,\n renderCell: ({ row }: { row: MovementRow }) =>\n STOCK_MOVEMENT_REASON_LABEL[row.reason] ?? row.reason,\n },\n {\n field: 'source',\n headerName: 'Source',\n flex: 1,\n minWidth: 160,\n renderCell: ({ row }: { row: MovementRow }) => (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {[\n row.orderId ? `order ${row.orderId}` : null,\n row.locationId ? `at ${row.locationId}` : null,\n ]\n .filter(Boolean)\n .join(' · ') || '—'}\n </Typography>\n ),\n },\n ] as GridColDef[],\n STOCK_MOVEMENT_FILTER_FIELDS,\n filterOptions,\n STOCK_MOVEMENT_FILTER_HEADERS,\n ),\n [filterOptions],\n )\n\n const filtering = gridFilter.clauses.length > 0\n // The ledger is empty only when an UNFILTERED first page came back empty;\n // a filter that matches nothing keeps the grid, its chips and its panel.\n const empty = status === 'success' && !filtering && page === 0 && movements.length === 0\n\n return (\n <CardDisplay header=\"Stock movements\" help={movementsHelp} contentGutterX contentGutterY>\n <Stack spacing={2}>\n {empty ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No stock movements recorded yet. Sales, returns, cancellations ' +\n 'and hand adjustments all land here.'}\n </Typography>\n ) : (\n <>\n <ListFilterChips\n fields={STOCK_MOVEMENT_FILTER_FIELDS}\n headers={STOCK_MOVEMENT_FILTER_HEADERS}\n clauses={gridFilter.clauses}\n onChange={gridFilter.setClauses}\n options={filterOptions}\n />\n <ListQueryNotices\n refused={listQueryRefusals(plan.refused, {\n fields: STOCK_MOVEMENT_FILTER_FIELDS,\n headers: STOCK_MOVEMENT_FILTER_HEADERS,\n options: filterOptions,\n })}\n notices={plan.notices}\n />\n <ListTable\n aria-label=\"Stock movements\"\n rows={movements}\n columns={columns}\n /*\n * The grid must NOT also filter or sort. The query answers\n * both, and the ledger has one order — newest first — which\n * the query already holds.\n */\n filterMode=\"server\"\n filterModel={gridFilter.filterModel}\n onFilterModelChange={gridFilter.onFilterModelChange}\n sortingMode=\"server\"\n disableColumnSorting\n // `ListPagination` below pages the query.\n hideFooter\n noRowsLabel=\"No stock movements match these filters\"\n initialState={{\n columns: {\n columnVisibilityModel: hiddenFilterVisibility(\n STOCK_MOVEMENT_FILTER_FIELDS,\n VISIBLE_COLUMNS,\n ),\n },\n }}\n />\n <ListPagination\n page={page}\n pageSize={pageSize}\n rowCount={movements.length}\n hasMore={hasMore}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </>\n )}\n </Stack>\n </CardDisplay>\n )\n}\nStockMovementsCard.displayName = 'StockMovementsCard'\n\nexport default StockMovementsCard\n"],"names":["CardDisplay","ListFilterChips","ListPagination","ListQueryNotices","listQueryRefusals","ListTable","hiddenFilterVisibility","listFilterGridColumns","useListGridFilter","Stack","Typography","collection","useMemo","ceilingedWindow","collectionCeiling","useFirestore","useFirestoreCollection","useListQuery","pluginDocsHelp","STOCK_MOVEMENT_FILTER_FIELDS","STOCK_MOVEMENT_FILTER_HEADERS","STOCK_MOVEMENT_QUERY","STOCK_MOVEMENT_REASON_LABEL","STOCK_MOVEMENT_SELECT_FIELDS","PRODUCT_NAMES_CEILING","LOCATION_CEILING","movementsHelp","anchor","title","excerpt","REASON_OPTIONS","Object","entries","map","value","label","VISIBLE_COLUMNS","StockMovementsCard","props","hostId","firestore","data","productDocs","idField","locationDocs","products","undefined","rows","productNames","names","Map","product","set","$id","name","filterOptions","productId","sort","a","b","localeCompare","reason","locationId","location","gridFilter","selectFields","movementRows","hasMore","page","setPage","pageSize","setPageSize","plan","status","declaration","request","clauses","deps","movements","row","productName","get","columns","field","headerName","width","renderCell","atMs","Date","Number","toLocaleString","flex","minWidth","span","variantId","variant","color","type","align","headerAlign","delta","applied","appliedDelta","component","String","orderId","filter","Boolean","join","filtering","length","empty","header","help","contentGutterX","contentGutterY","spacing","fields","headers","onChange","setClauses","options","refused","notices","aria-label","filterMode","filterModel","onFilterModelChange","sortingMode","disableColumnSorting","hideFooter","noRowsLabel","initialState","columnVisibilityModel","rowCount","onPageChange","onPageSizeChange","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/stock-movements-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 { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport ListFilterChips from '@aglyn/shared-ui-jsx/components/list-filter-chips.component'\nimport { ListPagination } from '@aglyn/shared-ui-jsx/components/list-pagination.component'\nimport {\n ListQueryNotices,\n listQueryRefusals,\n} from '@aglyn/shared-ui-jsx/components/list-query-notices.component'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { hiddenFilterVisibility } from '@aglyn/shared-ui-jsx/const/list-filter'\nimport { listFilterGridColumns } from '@aglyn/shared-ui-jsx/const/list-grid-filter'\nimport { useListGridFilter } from '@aglyn/shared-ui-jsx/hooks/use-list-grid-filter'\nimport { Stack, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { collection } from 'firebase/firestore'\nimport { useMemo } from 'react'\nimport {\n ceilingedWindow,\n collectionCeiling,\n useFirestore,\n useFirestoreCollection,\n} from '@aglyn/tenant-feature-instance'\nimport { useListQuery } from '@aglyn/tenant-feature-instance/hooks/use-list-query'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport {\n STOCK_MOVEMENT_FILTER_FIELDS,\n STOCK_MOVEMENT_FILTER_HEADERS,\n STOCK_MOVEMENT_QUERY,\n STOCK_MOVEMENT_REASON_LABEL,\n STOCK_MOVEMENT_SELECT_FIELDS,\n} from '../../constants/stock-movement-query'\n\nexport interface StockMovementsCardProps {\n hostId: string\n}\n\n/**\n * How many products the card reads to NAME its rows and offer the Product\n * filter's choices. A picker's reach, not the ledger's: the ledger itself is\n * paged by its query and reaches every movement whatever this holds.\n */\nconst PRODUCT_NAMES_CEILING = 500\n/** A site's locations, which the plan caps well under this. */\nconst LOCATION_CEILING = 25\n\nconst movementsHelp = pluginDocsHelp('commerce', {\n anchor: '#stock-movements',\n title: 'Stock movements',\n excerpt:\n 'Every change to a tracked count — sales, returns, cancellations and ' +\n 'hand adjustments — newest first, with the reason each one was made.',\n})\n\nconst REASON_OPTIONS = Object.entries(STOCK_MOVEMENT_REASON_LABEL).map(([value, label]) => ({\n value,\n label,\n}))\n\n/** The columns the grid draws; every other declared field is a hidden filter column. */\nconst VISIBLE_COLUMNS = ['atMs', 'productId', 'delta', 'reason', 'source']\n\ntype MovementRow = CommerceModel.InventoryAdjustment & { $id: string }\n\n/**\n * Stock movements (AGL-2341) — the adjustment history that had no history\n * view.\n *\n * `hosts/{hostId}/inventoryAdjustments` has three writers: the products\n * hub's \"Adjust stock\" dialog, `decrementVariantStock` (the sale, whether the\n * checkout webhook or the POS sold it), and the restock in `cancel-order.ts`.\n * The hub's own comment calls the collection \"adjustment history\".\n *\n * Its only reader was arithmetic: `cancel-order.ts` projects `appliedDelta`\n * off the `reason: 'sale'` rows to cap what a cancellation may put back. No\n * surface displayed a single one of them. A merchant whose count disagreed\n * with the shelf had no way to see what moved it, when, or why — and the one\n * number that reconciles the discrepancy was written on every adjustment and\n * unreachable.\n *\n * `delta` is what the merchant's history says moved; `appliedDelta` is what\n * the count could actually give up when the floor in `adjustVariantInventory`\n * absorbed part of it, which happens on a backorder product selling past\n * zero. They differ rarely and they differ importantly — three sold out of a\n * count of zero is exactly the state a merchant is trying to explain — so\n * both are shown when they disagree and only `delta` when they do not.\n *\n * ## Every filter is on the query (AGL-3321)\n *\n * The ledger used to read its hundred newest movements and filter those, so\n * \"Damaged\" searched a hundred rows and answered \"none\" about a ledger full\n * of older ones. Now the Filters panel's clauses are the query's `where`s —\n * see `STOCK_MOVEMENT_QUERY` for what each one costs — and the footer pages\n * the query's answer, so page three of \"Damaged\" is the third page of damage\n * the ledger holds, however far back it goes.\n */\nexport function StockMovementsCard(props: StockMovementsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n\n // Names, so a row reads as \"Desk lamp\" rather than a 20-character id, and\n // the Product filter's choices.\n const { data: productDocs } = useFirestoreCollection<any>(\n () =>\n collectionCeiling(\n collection(firestore, 'hosts', hostId, 'products'),\n PRODUCT_NAMES_CEILING,\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () =>\n collectionCeiling(\n collection(firestore, 'hosts', hostId, 'locations'),\n LOCATION_CEILING,\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const products = useMemo(\n () => ceilingedWindow<any>(productDocs ?? undefined, PRODUCT_NAMES_CEILING).rows,\n [productDocs],\n )\n const productNames = useMemo(() => {\n const names = new Map<string, string>()\n for (const product of products) {\n names.set(product.$id, product.name ?? product.$id)\n }\n return names\n }, [products])\n\n const filterOptions = useMemo(\n () => ({\n productId: [...productNames]\n .map(([value, label]) => ({ value, label }))\n .sort((a, b) => a.label.localeCompare(b.label)),\n reason: REASON_OPTIONS,\n locationId: ceilingedWindow<any>(locationDocs ?? undefined, LOCATION_CEILING).rows.map(\n (location: any) => ({ value: location.$id, label: location.name ?? location.$id }),\n ),\n }),\n [productNames, locationDocs],\n )\n\n const gridFilter = useListGridFilter({ selectFields: STOCK_MOVEMENT_SELECT_FIELDS })\n const {\n rows: movementRows,\n hasMore,\n page,\n setPage,\n pageSize,\n setPageSize,\n plan,\n status,\n } = useListQuery<MovementRow>({\n collection: collection(firestore, 'hosts', hostId, 'inventoryAdjustments'),\n declaration: STOCK_MOVEMENT_QUERY,\n request: { clauses: gridFilter.clauses },\n deps: [firestore, hostId],\n idField: '$id',\n })\n const movements = useMemo(\n () =>\n movementRows.map((row) => ({\n ...row,\n productName: productNames.get(row.productId) ?? row.productId,\n })),\n [movementRows, productNames],\n )\n\n const columns = useMemo(\n () =>\n listFilterGridColumns(\n [\n {\n field: 'atMs',\n headerName: 'When',\n width: 190,\n renderCell: ({ row }: { row: MovementRow }) =>\n row.atMs ? new Date(Number(row.atMs)).toLocaleString() : '—',\n },\n {\n field: 'productId',\n headerName: 'Product',\n flex: 1,\n minWidth: 180,\n renderCell: ({ row }: { row: MovementRow & { productName: string } }) => (\n <span>\n {row.productName}\n {row.variantId ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {` · ${row.variantId}`}\n </Typography>\n ) : null}\n </span>\n ),\n },\n {\n field: 'delta',\n headerName: 'Change',\n type: 'number',\n width: 150,\n align: 'right',\n headerAlign: 'right',\n renderCell: ({ row }: { row: MovementRow }) => {\n const delta = Number(row.delta ?? 0)\n const applied = Number(row.appliedDelta ?? delta)\n return (\n <span>\n {/*\n * The sign is carried explicitly. \"3\" and \"-3\" are the same\n * width and opposite facts, and a merchant scanning a column\n * for the movement that broke their count reads the sign\n * before the number.\n */}\n <Typography\n variant=\"body2\"\n color={delta < 0 ? 'error.main' : 'success.main'}\n component=\"span\"\n >\n {delta > 0 ? `+${delta}` : String(delta)}\n </Typography>\n {applied !== delta ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {` (${applied > 0 ? `+${applied}` : applied} applied)`}\n </Typography>\n ) : null}\n </span>\n )\n },\n },\n {\n field: 'reason',\n headerName: 'Reason',\n width: 150,\n renderCell: ({ row }: { row: MovementRow }) =>\n STOCK_MOVEMENT_REASON_LABEL[row.reason] ?? row.reason,\n },\n {\n field: 'source',\n headerName: 'Source',\n flex: 1,\n minWidth: 160,\n renderCell: ({ row }: { row: MovementRow }) => (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {[\n row.orderId ? `order ${row.orderId}` : null,\n row.locationId ? `at ${row.locationId}` : null,\n row.source ? `counted by ${row.source}` : null,\n ]\n .filter(Boolean)\n .join(' · ') || '—'}\n </Typography>\n ),\n },\n ] as GridColDef[],\n STOCK_MOVEMENT_FILTER_FIELDS,\n filterOptions,\n STOCK_MOVEMENT_FILTER_HEADERS,\n ),\n [filterOptions],\n )\n\n const filtering = gridFilter.clauses.length > 0\n // The ledger is empty only when an UNFILTERED first page came back empty;\n // a filter that matches nothing keeps the grid, its chips and its panel.\n const empty = status === 'success' && !filtering && page === 0 && movements.length === 0\n\n return (\n <CardDisplay header=\"Stock movements\" help={movementsHelp} contentGutterX contentGutterY>\n <Stack spacing={2}>\n {empty ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No stock movements recorded yet. Sales, returns, cancellations ' +\n 'and hand adjustments all land here.'}\n </Typography>\n ) : (\n <>\n <ListFilterChips\n fields={STOCK_MOVEMENT_FILTER_FIELDS}\n headers={STOCK_MOVEMENT_FILTER_HEADERS}\n clauses={gridFilter.clauses}\n onChange={gridFilter.setClauses}\n options={filterOptions}\n />\n <ListQueryNotices\n refused={listQueryRefusals(plan.refused, {\n fields: STOCK_MOVEMENT_FILTER_FIELDS,\n headers: STOCK_MOVEMENT_FILTER_HEADERS,\n options: filterOptions,\n })}\n notices={plan.notices}\n />\n <ListTable\n aria-label=\"Stock movements\"\n rows={movements}\n columns={columns}\n /*\n * The grid must NOT also filter or sort. The query answers\n * both, and the ledger has one order — newest first — which\n * the query already holds.\n */\n filterMode=\"server\"\n filterModel={gridFilter.filterModel}\n onFilterModelChange={gridFilter.onFilterModelChange}\n sortingMode=\"server\"\n disableColumnSorting\n // `ListPagination` below pages the query.\n hideFooter\n noRowsLabel=\"No stock movements match these filters\"\n initialState={{\n columns: {\n columnVisibilityModel: hiddenFilterVisibility(\n STOCK_MOVEMENT_FILTER_FIELDS,\n VISIBLE_COLUMNS,\n ),\n },\n }}\n />\n <ListPagination\n page={page}\n pageSize={pageSize}\n rowCount={movements.length}\n hasMore={hasMore}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </>\n )}\n </Stack>\n </CardDisplay>\n )\n}\nStockMovementsCard.displayName = 'StockMovementsCard'\n\nexport default StockMovementsCard\n"],"names":["CardDisplay","ListFilterChips","ListPagination","ListQueryNotices","listQueryRefusals","ListTable","hiddenFilterVisibility","listFilterGridColumns","useListGridFilter","Stack","Typography","collection","useMemo","ceilingedWindow","collectionCeiling","useFirestore","useFirestoreCollection","useListQuery","pluginDocsHelp","STOCK_MOVEMENT_FILTER_FIELDS","STOCK_MOVEMENT_FILTER_HEADERS","STOCK_MOVEMENT_QUERY","STOCK_MOVEMENT_REASON_LABEL","STOCK_MOVEMENT_SELECT_FIELDS","PRODUCT_NAMES_CEILING","LOCATION_CEILING","movementsHelp","anchor","title","excerpt","REASON_OPTIONS","Object","entries","map","value","label","VISIBLE_COLUMNS","StockMovementsCard","props","hostId","firestore","data","productDocs","idField","locationDocs","products","undefined","rows","productNames","names","Map","product","set","$id","name","filterOptions","productId","sort","a","b","localeCompare","reason","locationId","location","gridFilter","selectFields","movementRows","hasMore","page","setPage","pageSize","setPageSize","plan","status","declaration","request","clauses","deps","movements","row","productName","get","columns","field","headerName","width","renderCell","atMs","Date","Number","toLocaleString","flex","minWidth","span","variantId","variant","color","type","align","headerAlign","delta","applied","appliedDelta","component","String","orderId","source","filter","Boolean","join","filtering","length","empty","header","help","contentGutterX","contentGutterY","spacing","fields","headers","onChange","setClauses","options","refused","notices","aria-label","filterMode","filterModel","onFilterModelChange","sortingMode","disableColumnSorting","hideFooter","noRowsLabel","initialState","columnVisibilityModel","rowCount","onPageChange","onPageSizeChange","displayName"],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */ 'use client';
17
17
  import { _ as _extends } from "@swc/helpers/_/_extends";
18
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
19
  import { CardDisplay } from "@aglyn/shared-ui-jsx";
20
20
  import { useSnackbar } from "@aglyn/shared-ui-snackstack";
21
21
  import { Button, FormControlLabel, MenuItem, Stack, Switch, TextField, Typography } from "@mui/material";
@@ -23,7 +23,7 @@ import { doc } from "firebase/firestore";
23
23
  import { useCallback, useState } from "react";
24
24
  import { useFirestore, useUser } from "@aglyn/tenant-feature-instance";
25
25
  import { useFirestoreDoc, writeGuardedBySeed } from "@aglyn/tenant-feature-instance";
26
- import { hostPublicOrigin, pluginDocsHelp } from "@aglyn/aglyn";
26
+ import { pluginDocsHelp } from "@aglyn/aglyn";
27
27
  import { writeSiteWideChange } from "@aglyn/tenant-feature-instance/hooks/helpers/site-wide-change";
28
28
  /**
29
29
  * Store settings (AGL-295) on `hosts/{hostId}/settings/store`: the PDP
@@ -62,27 +62,6 @@ import { writeSiteWideChange } from "@aglyn/tenant-feature-instance/hooks/helper
62
62
  receiptFooter: (_ref4 = store == null ? void 0 : store.receiptFooter) != null ? _ref4 : ''
63
63
  };
64
64
  const update = (patch)=>setDraft(_extends({}, current, patch));
65
- /**
66
- * Google Merchant Center feed address (AGL-2249).
67
- *
68
- * `server/feed.ts` has served this since AGL-299, and the only place the
69
- * URL was ever written down was that file's own docblock — so the feature
70
- * was built, deployed, and undiscoverable. A feed nobody can find is a
71
- * shopping channel nobody switches on.
72
- *
73
- * Through `hostPublicOrigin` rather than a hand-built string, because a
74
- * store on a custom domain must be told ITS name: the feed's `<link>`
75
- * elements are built from the request host, so submitting the `.aglyn.app`
76
- * address for a site that serves on `shop.example.com` would put the wrong
77
- * domain on every item in Merchant Center.
78
- *
79
- * Undefined until the host doc lands, and undefined forever for a host with
80
- * neither a cname nor a subdomain — `hostPublicOrigin` returns undefined
81
- * rather than a half-built URL, and a copyable half-URL is worse than none.
82
- */ const feedUrl = host ? (()=>{
83
- const origin = hostPublicOrigin(host);
84
- return origin ? `${origin}/api/commerce/feed?hostId=${hostId}` : undefined;
85
- })() : undefined;
86
65
  // Host screen directory: {screenId: path} (AGL-292 template pick).
87
66
  const screenEntries = Object.entries((_ref5 = host == null ? void 0 : host.screens) != null ? _ref5 : {}).sort(([, a], [, b])=>String(a).localeCompare(String(b)));
88
67
  const handleSave = useCallback(async ()=>{
@@ -259,49 +238,6 @@ import { writeSiteWideChange } from "@aglyn/tenant-feature-instance/hooks/helper
259
238
  alignSelf: 'flex-start'
260
239
  },
261
240
  children: 'Save store settings'
262
- }),
263
- /*#__PURE__*/ _jsxs(Stack, {
264
- spacing: 0.5,
265
- children: [
266
- /*#__PURE__*/ _jsx(Typography, {
267
- variant: "subtitle2",
268
- children: 'Product feed'
269
- }),
270
- feedUrl ? /*#__PURE__*/ _jsxs(_Fragment, {
271
- children: [
272
- /*#__PURE__*/ _jsx(TextField, {
273
- label: "Google Merchant Center feed URL",
274
- value: feedUrl,
275
- size: "small",
276
- slotProps: {
277
- input: {
278
- readOnly: true
279
- }
280
- },
281
- onFocus: (event)=>event.target.select(),
282
- helperText: 'Paste this into Merchant Center → Products → Feeds as a ' + 'scheduled fetch. It lists every active product with price ' + 'and availability, and refreshes itself.'
283
- }),
284
- /*#__PURE__*/ _jsx(Button, {
285
- size: "small",
286
- sx: {
287
- alignSelf: 'flex-start'
288
- },
289
- onClick: ()=>{
290
- var _navigator_clipboard;
291
- void ((_navigator_clipboard = navigator.clipboard) == null ? void 0 : _navigator_clipboard.writeText(feedUrl).then(()=>enqueueSnackbar('Feed URL copied', {
292
- variant: 'success',
293
- persist: false
294
- })));
295
- },
296
- children: 'Copy feed URL'
297
- })
298
- ]
299
- }) : /*#__PURE__*/ _jsx(Typography, {
300
- variant: "body2",
301
- color: "text.secondary",
302
- children: 'Publish this site to a subdomain or custom domain to get its ' + 'Google Merchant Center feed URL.'
303
- })
304
- ]
305
241
  })
306
242
  ]
307
243
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/store-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 { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Button,\n FormControlLabel,\n MenuItem,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { doc } from 'firebase/firestore'\nimport { useCallback, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n useFirestoreDoc,\n writeGuardedBySeed,\n} from '@aglyn/tenant-feature-instance'\nimport { hostPublicOrigin, pluginDocsHelp } from '@aglyn/aglyn'\nimport { writeSiteWideChange } from '@aglyn/tenant-feature-instance/hooks/helpers/site-wide-change'\n\nexport interface StoreSettingsCardProps {\n hostId: string\n}\n\ninterface StoreSettings {\n /** Screen rendered for /products/{slug} with product tokens (AGL-292). */\n pdpScreenId?: string\n /** Screen rendered for /collections/{slug} (AGL-298). */\n collectionScreenId?: string\n currency?: string\n guestCheckout?: boolean\n termsUrl?: string\n receiptFooter?: string\n}\n\n/**\n * Store settings (AGL-295) on `hosts/{hostId}/settings/store`: the PDP\n * template screen (drives /products/{slug}), currency display, checkout\n * preferences, and receipt branding. Tax and shipping have their own\n * cards; store password/maintenance live in Site Protection.\n */\nexport function StoreSettingsCard(props: StoreSettingsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\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}` and the save writes all\n * six keys, so `merge: true` protects only the tax and shipping maps that\n * belong to other cards — never this card's own fields. Against a cached\n * read, changing the currency rewrites `guestCheckout`, and the two\n * template ids fall back to `|| null`, which is how a storefront's\n * product and collection URLs start returning 404.\n */\n fromCache: storeFromCache,\n } = useFirestoreDoc<any>(\n () => doc(firestore, 'hosts', hostId, 'settings', 'store'),\n [firestore, hostId],\n )\n const { data: host } = useFirestoreDoc<any>(\n () => doc(firestore, 'hosts', hostId),\n [firestore, hostId],\n )\n const [draft, setDraft] = useState<StoreSettings | null>(null)\n const current: StoreSettings = draft ?? {\n pdpScreenId: store?.pdpScreenId ?? '',\n collectionScreenId: store?.collectionScreenId ?? '',\n currency: store?.currency ?? 'USD',\n guestCheckout: store?.guestCheckout !== false,\n termsUrl: store?.termsUrl ?? '',\n receiptFooter: store?.receiptFooter ?? '',\n }\n const update = (patch: Partial<StoreSettings>) =>\n setDraft({ ...current, ...patch })\n\n /**\n * Google Merchant Center feed address (AGL-2249).\n *\n * `server/feed.ts` has served this since AGL-299, and the only place the\n * URL was ever written down was that file's own docblock — so the feature\n * was built, deployed, and undiscoverable. A feed nobody can find is a\n * shopping channel nobody switches on.\n *\n * Through `hostPublicOrigin` rather than a hand-built string, because a\n * store on a custom domain must be told ITS name: the feed's `<link>`\n * elements are built from the request host, so submitting the `.aglyn.app`\n * address for a site that serves on `shop.example.com` would put the wrong\n * domain on every item in Merchant Center.\n *\n * Undefined until the host doc lands, and undefined forever for a host with\n * neither a cname nor a subdomain — `hostPublicOrigin` returns undefined\n * rather than a half-built URL, and a copyable half-URL is worse than none.\n */\n const feedUrl = host\n ? (() => {\n const origin = hostPublicOrigin(host)\n return origin\n ? `${origin}/api/commerce/feed?hostId=${hostId}`\n : undefined\n })()\n : undefined\n\n // Host screen directory: {screenId: path} (AGL-292 template pick).\n const screenEntries = Object.entries(\n (host?.screens ?? {}) as Record<string, string>,\n ).sort(([, a], [, b]) => String(a).localeCompare(String(b)))\n\n const handleSave = useCallback(async () => {\n /**\n * Refuse a save whose seed the server never confirmed (AGL-1358).\n *\n * There is no create path to exempt, and that is deliberate rather than\n * an oversight: unlike a new row at a fresh uid, this writes a FIXED\n * document path, so the all-defaults `current` produced when the cache\n * has never seen this doc is not the harmless blank a fresh uid would\n * be. It would put `USD`, guest checkout on and two null template ids\n * over whatever the server really holds.\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: 'store settings',\n unreadable: storeStatus === 'error',\n fromCache: storeFromCache,\n },\n async () => {\n // The product and collection templates, the currency and the\n // checkout rules render on the live store with no publish step, so\n // the save carries the site's cache drop with it.\n await writeSiteWideChange({\n firestore,\n user,\n hostId,\n write: (batch) =>\n batch.set(\n doc(firestore, 'hosts', hostId, 'settings', 'store'),\n {\n pdpScreenId: current.pdpScreenId || null,\n collectionScreenId: current.collectionScreenId || null,\n currency: current.currency ?? 'USD',\n guestCheckout: current.guestCheckout !== false,\n termsUrl: current.termsUrl || null,\n receiptFooter: current.receiptFooter || null,\n },\n { merge: true },\n ),\n })\n },\n )\n // Before `setDraft(null)`, so a refusal keeps every typed value on\n // screen. A save that silently does nothing sends the user back to\n // retype a form that will be refused again just as quietly.\n if (!verdict.ok) {\n return void enqueueSnackbar(verdict.message, {\n variant: 'warning',\n persist: false,\n })\n }\n setDraft(null)\n enqueueSnackbar('Store settings saved', {\n variant: 'success',\n persist: false,\n })\n }, [\n current,\n firestore,\n hostId,\n user,\n enqueueSnackbar,\n storeStatus,\n storeFromCache,\n ])\n\n return (\n <CardDisplay\n header={'Store settings'}\n help={pluginDocsHelp('commerce')}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1.5}>\n <TextField\n label=\"Product page template\"\n value={current.pdpScreenId ?? ''}\n onChange={(event) => update({ pdpScreenId: event.target.value })}\n size=\"small\"\n select\n helperText={\n 'Page rendered at /products/{slug} — design it in the ' +\n 'Besigner with the Product detail block and {{product.*}} tokens.'\n }\n >\n <MenuItem value=\"\">{'None (product URLs 404)'}</MenuItem>\n {screenEntries.map(([screenId, path]) => (\n <MenuItem key={screenId} value={screenId}>\n {`/${path === '/' ? '' : path}`}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label=\"Collection page template\"\n value={current.collectionScreenId ?? ''}\n onChange={(event) =>\n update({ collectionScreenId: event.target.value })\n }\n size=\"small\"\n select\n helperText={\n 'Page rendered at /collections/{slug} — drop a Product grid ' +\n 'with source \"A collection\" and {{collection.*}} tokens.'\n }\n >\n <MenuItem value=\"\">{'None (collection URLs 404)'}</MenuItem>\n {screenEntries.map(([screenId, path]) => (\n <MenuItem key={screenId} value={screenId}>\n {`/${path === '/' ? '' : path}`}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label=\"Currency\"\n value={current.currency ?? 'USD'}\n onChange={(event) => update({ currency: event.target.value })}\n size=\"small\"\n select\n sx={{ maxWidth: 200 }}\n helperText=\"Charges settle in USD; more currencies are coming\"\n >\n <MenuItem value=\"USD\">{'USD ($)'}</MenuItem>\n </TextField>\n <FormControlLabel\n control={\n <Switch\n size=\"small\"\n checked={current.guestCheckout !== false}\n onChange={(event) =>\n update({ guestCheckout: event.target.checked })\n }\n />\n }\n label=\"Allow guest checkout (no account required)\"\n />\n <TextField\n label=\"Terms URL\"\n value={current.termsUrl ?? ''}\n onChange={(event) => update({ termsUrl: event.target.value })}\n size=\"small\"\n placeholder=\"/terms\"\n helperText=\"Linked from checkout when set\"\n />\n <TextField\n label=\"Receipt footer\"\n value={current.receiptFooter ?? ''}\n onChange={(event) => update({ receiptFooter: event.target.value })}\n size=\"small\"\n multiline\n minRows={2}\n placeholder=\"Thanks for supporting our shop!\"\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Password protection and maintenance mode live under Site ' +\n 'Protection.'}\n </Typography>\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 store settings'}\n </Button>\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\">{'Product feed'}</Typography>\n {feedUrl ? (\n <>\n <TextField\n label=\"Google Merchant Center feed URL\"\n value={feedUrl}\n size=\"small\"\n slotProps={{ input: { readOnly: true } }}\n onFocus={(event) => event.target.select()}\n helperText={\n 'Paste this into Merchant Center → Products → Feeds as a ' +\n 'scheduled fetch. It lists every active product with price ' +\n 'and availability, and refreshes itself.'\n }\n />\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => {\n void navigator.clipboard?.writeText(feedUrl).then(() =>\n enqueueSnackbar('Feed URL copied', {\n variant: 'success',\n persist: false,\n }),\n )\n }}\n >\n {'Copy feed URL'}\n </Button>\n </>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Publish this site to a subdomain or custom domain to get its ' +\n 'Google Merchant Center feed URL.'}\n </Typography>\n )}\n </Stack>\n </Stack>\n </CardDisplay>\n )\n}\nStoreSettingsCard.displayName = 'StoreSettingsCard'\n\nexport default StoreSettingsCard\n"],"names":["CardDisplay","useSnackbar","Button","FormControlLabel","MenuItem","Stack","Switch","TextField","Typography","doc","useCallback","useState","useFirestore","useUser","useFirestoreDoc","writeGuardedBySeed","hostPublicOrigin","pluginDocsHelp","writeSiteWideChange","StoreSettingsCard","props","current","hostId","firestore","data","user","enqueueSnackbar","store","status","storeStatus","fromCache","storeFromCache","host","draft","setDraft","pdpScreenId","collectionScreenId","currency","guestCheckout","termsUrl","receiptFooter","update","patch","feedUrl","origin","undefined","screenEntries","Object","entries","screens","sort","a","b","String","localeCompare","handleSave","verdict","subject","unreadable","write","batch","set","merge","ok","message","variant","persist","header","help","contentGutterX","contentGutterY","spacing","label","value","onChange","event","target","size","select","helperText","map","screenId","path","sx","maxWidth","control","checked","placeholder","multiline","minRows","color","disabled","onClick","alignSelf","slotProps","input","readOnly","onFocus","navigator","clipboard","writeText","then","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/store-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 { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Button,\n FormControlLabel,\n MenuItem,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { doc } from 'firebase/firestore'\nimport { useCallback, 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'\nimport { writeSiteWideChange } from '@aglyn/tenant-feature-instance/hooks/helpers/site-wide-change'\n\nexport interface StoreSettingsCardProps {\n hostId: string\n}\n\ninterface StoreSettings {\n /** Screen rendered for /products/{slug} with product tokens (AGL-292). */\n pdpScreenId?: string\n /** Screen rendered for /collections/{slug} (AGL-298). */\n collectionScreenId?: string\n currency?: string\n guestCheckout?: boolean\n termsUrl?: string\n receiptFooter?: string\n}\n\n/**\n * Store settings (AGL-295) on `hosts/{hostId}/settings/store`: the PDP\n * template screen (drives /products/{slug}), currency display, checkout\n * preferences, and receipt branding. Tax and shipping have their own\n * cards; store password/maintenance live in Site Protection.\n */\nexport function StoreSettingsCard(props: StoreSettingsCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\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}` and the save writes all\n * six keys, so `merge: true` protects only the tax and shipping maps that\n * belong to other cards — never this card's own fields. Against a cached\n * read, changing the currency rewrites `guestCheckout`, and the two\n * template ids fall back to `|| null`, which is how a storefront's\n * product and collection URLs start returning 404.\n */\n fromCache: storeFromCache,\n } = useFirestoreDoc<any>(\n () => doc(firestore, 'hosts', hostId, 'settings', 'store'),\n [firestore, hostId],\n )\n const { data: host } = useFirestoreDoc<any>(\n () => doc(firestore, 'hosts', hostId),\n [firestore, hostId],\n )\n const [draft, setDraft] = useState<StoreSettings | null>(null)\n const current: StoreSettings = draft ?? {\n pdpScreenId: store?.pdpScreenId ?? '',\n collectionScreenId: store?.collectionScreenId ?? '',\n currency: store?.currency ?? 'USD',\n guestCheckout: store?.guestCheckout !== false,\n termsUrl: store?.termsUrl ?? '',\n receiptFooter: store?.receiptFooter ?? '',\n }\n const update = (patch: Partial<StoreSettings>) =>\n setDraft({ ...current, ...patch })\n\n // Host screen directory: {screenId: path} (AGL-292 template pick).\n const screenEntries = Object.entries(\n (host?.screens ?? {}) as Record<string, string>,\n ).sort(([, a], [, b]) => String(a).localeCompare(String(b)))\n\n const handleSave = useCallback(async () => {\n /**\n * Refuse a save whose seed the server never confirmed (AGL-1358).\n *\n * There is no create path to exempt, and that is deliberate rather than\n * an oversight: unlike a new row at a fresh uid, this writes a FIXED\n * document path, so the all-defaults `current` produced when the cache\n * has never seen this doc is not the harmless blank a fresh uid would\n * be. It would put `USD`, guest checkout on and two null template ids\n * over whatever the server really holds.\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: 'store settings',\n unreadable: storeStatus === 'error',\n fromCache: storeFromCache,\n },\n async () => {\n // The product and collection templates, the currency and the\n // checkout rules render on the live store with no publish step, so\n // the save carries the site's cache drop with it.\n await writeSiteWideChange({\n firestore,\n user,\n hostId,\n write: (batch) =>\n batch.set(\n doc(firestore, 'hosts', hostId, 'settings', 'store'),\n {\n pdpScreenId: current.pdpScreenId || null,\n collectionScreenId: current.collectionScreenId || null,\n currency: current.currency ?? 'USD',\n guestCheckout: current.guestCheckout !== false,\n termsUrl: current.termsUrl || null,\n receiptFooter: current.receiptFooter || null,\n },\n { merge: true },\n ),\n })\n },\n )\n // Before `setDraft(null)`, so a refusal keeps every typed value on\n // screen. A save that silently does nothing sends the user back to\n // retype a form that will be refused again just as quietly.\n if (!verdict.ok) {\n return void enqueueSnackbar(verdict.message, {\n variant: 'warning',\n persist: false,\n })\n }\n setDraft(null)\n enqueueSnackbar('Store settings saved', {\n variant: 'success',\n persist: false,\n })\n }, [\n current,\n firestore,\n hostId,\n user,\n enqueueSnackbar,\n storeStatus,\n storeFromCache,\n ])\n\n return (\n <CardDisplay\n header={'Store settings'}\n help={pluginDocsHelp('commerce')}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1.5}>\n <TextField\n label=\"Product page template\"\n value={current.pdpScreenId ?? ''}\n onChange={(event) => update({ pdpScreenId: event.target.value })}\n size=\"small\"\n select\n helperText={\n 'Page rendered at /products/{slug} — design it in the ' +\n 'Besigner with the Product detail block and {{product.*}} tokens.'\n }\n >\n <MenuItem value=\"\">{'None (product URLs 404)'}</MenuItem>\n {screenEntries.map(([screenId, path]) => (\n <MenuItem key={screenId} value={screenId}>\n {`/${path === '/' ? '' : path}`}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label=\"Collection page template\"\n value={current.collectionScreenId ?? ''}\n onChange={(event) =>\n update({ collectionScreenId: event.target.value })\n }\n size=\"small\"\n select\n helperText={\n 'Page rendered at /collections/{slug} — drop a Product grid ' +\n 'with source \"A collection\" and {{collection.*}} tokens.'\n }\n >\n <MenuItem value=\"\">{'None (collection URLs 404)'}</MenuItem>\n {screenEntries.map(([screenId, path]) => (\n <MenuItem key={screenId} value={screenId}>\n {`/${path === '/' ? '' : path}`}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label=\"Currency\"\n value={current.currency ?? 'USD'}\n onChange={(event) => update({ currency: event.target.value })}\n size=\"small\"\n select\n sx={{ maxWidth: 200 }}\n helperText=\"Charges settle in USD; more currencies are coming\"\n >\n <MenuItem value=\"USD\">{'USD ($)'}</MenuItem>\n </TextField>\n <FormControlLabel\n control={\n <Switch\n size=\"small\"\n checked={current.guestCheckout !== false}\n onChange={(event) =>\n update({ guestCheckout: event.target.checked })\n }\n />\n }\n label=\"Allow guest checkout (no account required)\"\n />\n <TextField\n label=\"Terms URL\"\n value={current.termsUrl ?? ''}\n onChange={(event) => update({ termsUrl: event.target.value })}\n size=\"small\"\n placeholder=\"/terms\"\n helperText=\"Linked from checkout when set\"\n />\n <TextField\n label=\"Receipt footer\"\n value={current.receiptFooter ?? ''}\n onChange={(event) => update({ receiptFooter: event.target.value })}\n size=\"small\"\n multiline\n minRows={2}\n placeholder=\"Thanks for supporting our shop!\"\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Password protection and maintenance mode live under Site ' +\n 'Protection.'}\n </Typography>\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 store settings'}\n </Button>\n </Stack>\n </CardDisplay>\n )\n}\nStoreSettingsCard.displayName = 'StoreSettingsCard'\n\nexport default StoreSettingsCard\n"],"names":["CardDisplay","useSnackbar","Button","FormControlLabel","MenuItem","Stack","Switch","TextField","Typography","doc","useCallback","useState","useFirestore","useUser","useFirestoreDoc","writeGuardedBySeed","pluginDocsHelp","writeSiteWideChange","StoreSettingsCard","props","current","hostId","firestore","data","user","enqueueSnackbar","store","status","storeStatus","fromCache","storeFromCache","host","draft","setDraft","pdpScreenId","collectionScreenId","currency","guestCheckout","termsUrl","receiptFooter","update","patch","screenEntries","Object","entries","screens","sort","a","b","String","localeCompare","handleSave","verdict","subject","unreadable","write","batch","set","merge","ok","message","variant","persist","header","help","contentGutterX","contentGutterY","spacing","label","value","onChange","event","target","size","select","helperText","map","screenId","path","sx","maxWidth","control","checked","placeholder","multiline","minRows","color","disabled","onClick","alignSelf","displayName"],"mappings":"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"}
@@ -0,0 +1,42 @@
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
+ */
17
+ /**
18
+ * Two more zones the store's console hosts (AGL-3612): `ordersBulk`, beside
19
+ * the orders list's bulk actions, and `commerceSettings`, at the foot of the
20
+ * store's Settings. A shipping plugin's batch labels and its label settings
21
+ * are the first widgets; another plugin restates these props rather than
22
+ * importing this package.
23
+ */
24
+ /** What `ordersBulk` hands a widget: the orders ticked in the list. */
25
+ export interface ConsoleOrdersBulkZoneProps {
26
+ hostId: string;
27
+ /** The org the page names; `undefined` where the host does not know it. */
28
+ orgId: string | undefined;
29
+ /** The ticked orders' ids, in the list's order. */
30
+ selectedOrderIds: readonly string[];
31
+ /** The store's name, for anything printed. */
32
+ storeName: string;
33
+ }
34
+ /** What `commerceSettings` hands a widget: the site. */
35
+ export interface ConsoleCommerceSettingsZoneProps {
36
+ hostId: string;
37
+ orgId: string | undefined;
38
+ }
39
+ export declare const ORDERS_BULK_ZONE: import("@aglyn/aglyn/plugin-manager/plugin-zones").PluginZone<ConsoleOrdersBulkZoneProps>;
40
+ export declare const COMMERCE_SETTINGS_ZONE: import("@aglyn/aglyn/plugin-manager/plugin-zones").PluginZone<ConsoleCommerceSettingsZoneProps>;
41
+ /** Declares both, from the console registrar. */
42
+ export declare function registerCommerceStoreZones(): void;