@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 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/register-hardware-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as CommerceModel from '../../model'\nimport { CardDisplay, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n FormControlLabel,\n MenuItem,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { collection, limit, orderBy, query, where } from 'firebase/firestore'\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n useFirestore,\n useFirestoreCollection,\n useUser,\n} from '@aglyn/tenant-feature-instance'\n\n/**\n * The Hardware card for one register (AGL-3619): the cloud receipt printers\n * paired with it, with their live status and recent jobs, and the way to add\n * one — brand, model, MAC or ID — and get the URL to paste into the printer;\n * then, read-only, the card readers and customer displays the register uses.\n *\n * Every write goes through `/api/commerce/printers`: the printer documents\n * and the queue are server-written, so this card only reads Firestore.\n */\n\ntype PrinterRow = CommerceModel.PosPrinter & { $id: string }\ntype JobRow = CommerceModel.PrintJob & { $id: string }\n\nconst STATE_COLOR: Record<string, 'success' | 'warning' | 'error' | 'default'> =\n {\n online: 'success',\n paper_low: 'warning',\n paper_out: 'error',\n cover_open: 'error',\n error: 'error',\n offline: 'default',\n unknown: 'default',\n }\n\nconst JOB_LABELS: Record<CommerceModel.PrintJobKind, string> = {\n receipt: 'Receipt',\n kitchen: 'Kitchen ticket',\n drawer: 'Open drawer',\n test: 'Test print',\n report: 'Shift report',\n}\n\n/** \"just now\", \"3 min ago\", \"2 h ago\". */\nexport function seenAgo(atMs: number | undefined, nowMs: number): string {\n if (!atMs) return 'never'\n const seconds = Math.max(0, Math.round((nowMs - atMs) / 1000))\n if (seconds < 45) return 'just now'\n const minutes = Math.round(seconds / 60)\n if (minutes < 60) return `${minutes} min ago`\n const hours = Math.round(minutes / 60)\n if (hours < 48) return `${hours} h ago`\n return `${Math.round(hours / 24)} days ago`\n}\n\nfunction useNow(intervalMs: number): number {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs)\n return () => clearInterval(id)\n }, [intervalMs])\n return now\n}\n\nfunction usePrintersApi(hostId: string) {\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n return useCallback(\n async (\n body: Record<string, unknown>,\n ): Promise<Record<string, any> | null> => {\n try {\n const response = await authorizedFetch(user, '/api/commerce/printers', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, ...body }),\n })\n const payload = await response.json().catch(() => ({}))\n if (!response.ok) {\n enqueueSnackbar(\n payload?.error ?? 'The printer could not be updated',\n {\n variant: 'warning',\n persist: false,\n },\n )\n return null\n }\n return payload\n } catch {\n enqueueSnackbar(\n 'The printer could not be reached. Check your connection.',\n {\n variant: 'warning',\n persist: false,\n },\n )\n return null\n }\n },\n [user, hostId, enqueueSnackbar],\n )\n}\n\n/** Where each brand's poll URL goes, step by step. */\nexport function printerSetupSteps(brand: CommerceModel.PrinterBrand): string[] {\n return brand === 'star'\n ? [\n 'Open the printer’s web page: print a self-test (hold FEED while switching on) to find its IP address, then browse to it and sign in (default user root, password public, or the password on the printer’s label).',\n 'Go to Settings → CloudPRNT. Turn CloudPRNT on and paste the URL below as the Server URL.',\n 'Set the polling interval to 5 seconds, then Submit and Save → Restart device.',\n 'Come back here: the printer shows Online within a minute. Send a test print.',\n ]\n : [\n 'Open EPSON TMNet WebConfig: browse to the printer’s IP address (print a status sheet by holding FEED while switching on).',\n 'Open Server Direct Print (under Web Service Settings on most models). Select Enable and enter the ID below.',\n 'Paste the URL below as Server 1 URL and set the interval to 5 seconds. Submit, then reset the printer.',\n 'Come back here: the printer shows Online within a minute. Send a test print.',\n ]\n}\n\ninterface PrinterFormState {\n brand: CommerceModel.PrinterBrand\n name: string\n model: string\n deviceId: string\n paperWidthMm: CommerceModel.PrinterPaperWidth\n autoPrintReceipts: boolean\n kickDrawer: boolean\n kitchenTickets: boolean\n logoKey: string\n}\n\nconst EMPTY_FORM: PrinterFormState = {\n brand: 'star',\n name: '',\n model: '',\n deviceId: '',\n paperWidthMm: 80,\n autoPrintReceipts: true,\n kickDrawer: true,\n kitchenTickets: false,\n logoKey: '',\n}\n\nfunction PrinterForm(props: {\n value: PrinterFormState\n onChange: (next: PrinterFormState) => void\n brandLocked?: boolean\n}) {\n const { value, onChange, brandLocked } = props\n const set = <K extends keyof PrinterFormState>(\n key: K,\n next: PrinterFormState[K],\n ) => onChange({ ...value, [key]: next })\n return (\n <Stack spacing={2} sx={{ pt: 1 }}>\n <TextField\n select\n label=\"Brand\"\n value={value.brand}\n disabled={brandLocked}\n onChange={(event) =>\n set('brand', event.target.value as CommerceModel.PrinterBrand)\n }\n >\n {CommerceModel.PRINTER_BRANDS.map((brand) => (\n <MenuItem key={brand} value={brand}>\n {CommerceModel.PRINTER_BRAND_LABELS[brand]}\n </MenuItem>\n ))}\n </TextField>\n <Autocomplete\n freeSolo\n options={[...CommerceModel.PRINTER_MODEL_SUGGESTIONS[value.brand]]}\n value={value.model}\n onInputChange={(_event, next) => set('model', next)}\n renderInput={(params) => <TextField {...params} label=\"Model\" />}\n />\n <TextField\n label=\"Name\"\n value={value.name}\n placeholder=\"Counter printer\"\n onChange={(event) => set('name', event.target.value)}\n />\n <TextField\n label={\n value.brand === 'star' ? 'MAC address' : 'Server Direct Print ID'\n }\n value={value.deviceId}\n placeholder={value.brand === 'star' ? '00:11:62:12:34:56' : 'counter-1'}\n helperText={\n value.brand === 'star'\n ? 'The Ethernet MAC on the self-test print, even if the printer uses Wi-Fi.'\n : 'Any ID you choose (letters, digits, - _ .), entered again in WebConfig.'\n }\n onChange={(event) => set('deviceId', event.target.value)}\n />\n <TextField\n select\n label=\"Paper\"\n value={value.paperWidthMm}\n onChange={(event) =>\n set('paperWidthMm', Number(event.target.value) === 58 ? 58 : 80)\n }\n >\n <MenuItem value={80}>{'80 mm (3 1/8 in)'}</MenuItem>\n <MenuItem value={58}>{'58 mm (2 1/4 in)'}</MenuItem>\n </TextField>\n <TextField\n label=\"Stored logo (optional)\"\n value={value.logoKey}\n placeholder={value.brand === 'star' ? '1' : '48,48'}\n helperText={\n value.brand === 'star'\n ? 'The logo number saved in the printer with Star Quick Setup Utility.'\n : 'The key saved in the printer with Epson TM Utility, as two numbers.'\n }\n onChange={(event) => set('logoKey', event.target.value)}\n />\n <FormControlLabel\n control={\n <Switch\n checked={value.autoPrintReceipts}\n onChange={(event) => set('autoPrintReceipts', event.target.checked)}\n />\n }\n label=\"Print a receipt for every sale on this register\"\n />\n <FormControlLabel\n control={\n <Switch\n checked={value.kickDrawer}\n onChange={(event) => set('kickDrawer', event.target.checked)}\n />\n }\n label=\"A cash drawer is plugged into this printer\"\n />\n <FormControlLabel\n control={\n <Switch\n checked={value.kitchenTickets}\n onChange={(event) => set('kitchenTickets', event.target.checked)}\n />\n }\n label=\"Print a kitchen ticket for every sale (items and quantities, no prices)\"\n />\n </Stack>\n )\n}\n\nfunction PollUrlPanel(props: {\n credentials: {\n brand: CommerceModel.PrinterBrand\n pollUrl: string\n deviceId: string\n }\n}) {\n const { credentials } = props\n const { enqueueSnackbar } = useSnackbar()\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(credentials.pollUrl)\n enqueueSnackbar('Copied', { variant: 'success', persist: false })\n } catch {\n enqueueSnackbar('Select the URL and copy it', {\n variant: 'info',\n persist: false,\n })\n }\n }\n return (\n <Stack spacing={1.5}>\n <Alert severity=\"info\">\n {'This URL is the printer’s password: anyone with it can collect this register’s receipts. ' +\n 'Regenerate it if it is ever shared.'}\n </Alert>\n <TextField\n label={\n credentials.brand === 'star'\n ? 'CloudPRNT Server URL'\n : 'Server Direct Print URL'\n }\n value={credentials.pollUrl}\n multiline\n slotProps={{ htmlInput: { readOnly: true } }}\n />\n {credentials.brand === 'epson' ? (\n <TextField\n label=\"ID\"\n value={credentials.deviceId}\n slotProps={{ htmlInput: { readOnly: true } }}\n />\n ) : null}\n <Box>\n <Button size=\"small\" onClick={copy}>\n {'Copy URL'}\n </Button>\n </Box>\n <Box component=\"ol\" sx={{ pl: 2.5, m: 0 }}>\n {printerSetupSteps(credentials.brand).map((step) => (\n <Typography\n component=\"li\"\n variant=\"body2\"\n key={step}\n sx={{ mb: 0.5 }}\n >\n {step}\n </Typography>\n ))}\n </Box>\n </Stack>\n )\n}\n\nfunction PrinterRowView(props: {\n printer: PrinterRow\n now: number\n call: ReturnType<typeof usePrintersApi>\n onSettings: (printer: PrinterRow) => void\n}) {\n const { printer, now, call, onSettings } = props\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const state = CommerceModel.printerDisplayState(printer.status, now)\n const label =\n state === 'offline' ? 'Offline' : CommerceModel.PRINTER_STATE_LABELS[state]\n const send = async (action: 'test' | 'drawer') => {\n const result = await call({ action, printerId: printer.$id })\n if (result) {\n enqueueSnackbar(\n action === 'test' ? 'Test print sent' : 'Drawer kick sent',\n {\n variant: 'success',\n persist: false,\n },\n )\n }\n }\n const remove = async () => {\n const confirmed = await confirm({\n title: `Remove ${printer.name}?`,\n description:\n 'Its URL stops working and anything it has not printed is canceled.',\n confirmationText: 'Remove',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (confirmed) await call({ action: 'remove', printerId: printer.$id })\n }\n return (\n <Stack spacing={0.5}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', flexWrap: 'wrap', rowGap: 1 }}\n >\n <Typography\n variant=\"body2\"\n sx={{ flex: '1 1 160px', minWidth: 0 }}\n noWrap\n >\n {printer.name}\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · ${printer.brand === 'star' ? 'Star' : 'Epson'}${printer.model ? ` ${printer.model}` : ''}`}\n </Typography>\n </Typography>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={STATE_COLOR[state]}\n label={label}\n />\n <Button size=\"small\" onClick={() => send('test')}>\n {'Test print'}\n </Button>\n {printer.kickDrawer ? (\n <Button size=\"small\" onClick={() => send('drawer')}>\n {'Open drawer'}\n </Button>\n ) : null}\n <Button size=\"small\" onClick={() => onSettings(printer)}>\n {'Settings'}\n </Button>\n <Button size=\"small\" color=\"error\" onClick={remove}>\n {'Remove'}\n </Button>\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {printer.status?.atMs\n ? `Last seen ${seenAgo(printer.status.atMs, now)}${printer.status.detail ? ` · ${printer.status.detail}` : ''}`\n : 'Waiting for the printer to poll — paste its URL into the printer to finish.'}\n {printer.autoPrintReceipts ? ' · Prints every sale' : ''}\n {printer.kickDrawer ? ' · Cash drawer' : ''}\n {printer.kitchenTickets ? ' · Kitchen tickets' : ''}\n </Typography>\n </Stack>\n )\n}\n\nexport interface RegisterHardwareCardProps {\n hostId: string\n registerId: string\n registerName: string\n}\n\ntype ReaderRow = {\n $id: string\n label?: string\n deviceType?: string\n status?: string\n registerId?: string\n}\ntype DisplayRow = { id: string; label: string; lastSeenAtMs: number }\n\n/** A customer display that polled within this long is shown as connected. */\nconst DISPLAY_CONNECTED_MS = 120_000\n\n/**\n * The register's other devices, read-only: the Stripe Terminal card readers\n * assigned to it and the customer displays paired with it. Each is added and\n * removed where it is set up; this list is the one place a manager sees\n * everything plugged into the till. Nothing renders when there are none.\n */\nexport function RegisterOtherDevices(props: {\n hostId: string\n registerId: string\n now: number\n}) {\n const { hostId, registerId, now } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { data: readerDocs } = useFirestoreCollection<ReaderRow>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'terminalReaders'),\n where('registerId', '==', registerId),\n limit(10),\n ),\n [firestore, hostId, registerId],\n { idField: '$id' },\n )\n const [displays, setDisplays] = useState<DisplayRow[]>([])\n useEffect(() => {\n if (!user) return\n let live = true\n void (async () => {\n try {\n const response = await authorizedFetch(user as any, '/api/commerce/pos-display', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, registerId, action: 'displays' }),\n })\n if (!response.ok) return\n const answer = (await response.json().catch(() => ({}))) as { displays?: DisplayRow[] }\n if (live) setDisplays(Array.isArray(answer.displays) ? answer.displays : [])\n } catch {\n // Offline: the list stays as it was; the printers above still show.\n }\n })()\n return () => {\n live = false\n }\n }, [user, hostId, registerId])\n const readers = readerDocs ?? []\n if (!readers.length && !displays.length) return null\n return (\n <>\n <Divider />\n <Typography variant=\"subtitle2\">{'Card readers and customer displays'}</Typography>\n {readers.map((reader) => (\n <Stack key={reader.$id} direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" sx={{ flex: 1, minWidth: 0 }} noWrap>\n {reader.label || 'Card reader'}\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · Card reader${reader.deviceType ? ` · ${reader.deviceType}` : ''}`}\n </Typography>\n </Typography>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={reader.status === 'online' ? 'success' : 'default'}\n label={reader.status === 'online' ? 'Online' : 'Offline'}\n />\n </Stack>\n ))}\n {displays.map((display) => {\n const connected = now - display.lastSeenAtMs < DISPLAY_CONNECTED_MS\n return (\n <Stack key={display.id} direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" sx={{ flex: 1, minWidth: 0 }} noWrap>\n {display.label || 'Customer display'}\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · Customer display · seen ${seenAgo(display.lastSeenAtMs, now)}`}\n </Typography>\n </Typography>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={connected ? 'success' : 'default'}\n label={connected ? 'Connected' : 'Offline'}\n />\n </Stack>\n )\n })}\n </>\n )\n}\nRegisterOtherDevices.displayName = 'RegisterOtherDevices'\n\nexport function RegisterHardwareCard(props: RegisterHardwareCardProps) {\n const { hostId, registerId, registerName } = props\n const firestore = useFirestore()\n const call = usePrintersApi(hostId)\n const now = useNow(15_000)\n const { data: printerDocs } = useFirestoreCollection<PrinterRow>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'printers'),\n where('registerId', '==', registerId),\n limit(4),\n ),\n [firestore, hostId, registerId],\n { idField: '$id' },\n )\n const { data: jobDocs } = useFirestoreCollection<JobRow>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'printJobs'),\n where('registerId', '==', registerId),\n orderBy('createdAtMs', 'desc'),\n limit(6),\n ),\n [firestore, hostId, registerId],\n { idField: '$id' },\n )\n const printers = [...(printerDocs ?? [])].sort(\n (a, b) => a.createdAtMs - b.createdAtMs,\n )\n const jobs = jobDocs ?? []\n\n const [adding, setAdding] = useState(false)\n const [form, setForm] = useState<PrinterFormState>(EMPTY_FORM)\n const [editing, setEditing] = useState<PrinterRow | null>(null)\n const [credentials, setCredentials] = useState<{\n brand: CommerceModel.PrinterBrand\n pollUrl: string\n deviceId: string\n } | null>(null)\n const [busy, setBusy] = useState(false)\n\n const openAdd = () => {\n setForm(EMPTY_FORM)\n setCredentials(null)\n setAdding(true)\n }\n const create = async () => {\n setBusy(true)\n const created = await call({ action: 'create', registerId, ...form })\n setBusy(false)\n if (created) setCredentials(created as any)\n }\n const openSettings = async (printer: PrinterRow) => {\n setEditing(printer)\n setForm({\n brand: printer.brand,\n name: printer.name,\n model: printer.model ?? '',\n deviceId: printer.deviceId,\n paperWidthMm: printer.paperWidthMm ?? 80,\n autoPrintReceipts: printer.autoPrintReceipts,\n kickDrawer: printer.kickDrawer,\n kitchenTickets: Boolean(printer.kitchenTickets),\n logoKey: printer.logoKey ?? '',\n })\n setCredentials(null)\n const shown = await call({ action: 'credentials', printerId: printer.$id })\n if (shown) setCredentials(shown as any)\n }\n const save = async () => {\n if (!editing) return\n setBusy(true)\n const { brand: _brand, ...settings } = form\n const saved = await call({\n action: 'update',\n printerId: editing.$id,\n ...settings,\n })\n setBusy(false)\n if (saved) setEditing(null)\n }\n const regenerate = async () => {\n if (!editing) return\n const next = await call({ action: 'regenerate', printerId: editing.$id })\n if (next) setCredentials(next as any)\n }\n const cancelJob = (job: JobRow) => () =>\n void call({ action: 'cancel', jobId: job.$id })\n const printerName = (id: string) =>\n printers.find((printer) => printer.$id === id)?.name ?? 'Removed printer'\n\n return (\n <CardDisplay\n header={`Hardware · ${registerName}`}\n help={pluginDocsHelp('posHardware', { anchor: '#receipt-printers' })}\n HeaderProps={{\n action: (\n <Button\n size=\"small\"\n onClick={openAdd}\n disabled={printers.length >= 4}\n >\n {'Add printer'}\n </Button>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1.5}>\n <Typography variant=\"subtitle2\">{'Receipt printers'}</Typography>\n {printers.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Pair a Star CloudPRNT or Epson Server Direct Print printer to print receipts from this register ' +\n 'on any device, with no driver, and to open its cash drawer on cash sales.'}\n </Typography>\n ) : (\n printers.map((printer) => (\n <PrinterRowView\n key={printer.$id}\n printer={printer}\n now={now}\n call={call}\n onSettings={openSettings}\n />\n ))\n )}\n {jobs.length ? (\n <>\n <Divider />\n <Typography variant=\"subtitle2\">{'Recent print jobs'}</Typography>\n {jobs.map((job) => (\n <Stack\n key={job.$id}\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center' }}\n >\n <Typography\n variant=\"body2\"\n sx={{ flex: 1, minWidth: 0 }}\n noWrap\n >\n {JOB_LABELS[job.kind]}\n {job.receipt?.orderNumber\n ? ` #${job.receipt.orderNumber}`\n : ''}\n <Typography\n component=\"span\"\n variant=\"caption\"\n color=\"text.secondary\"\n >\n {` · ${printerName(job.printerId)} · ${seenAgo(job.createdAtMs, now)}`}\n {job.error ? ` · ${job.error}` : ''}\n </Typography>\n </Typography>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={\n job.status === 'done'\n ? 'success'\n : job.status === 'failed'\n ? 'error'\n : 'default'\n }\n label={CommerceModel.PRINT_JOB_STATUS_LABELS[job.status]}\n />\n {job.status === 'queued' ? (\n <Button size=\"small\" onClick={cancelJob(job)}>\n {'Cancel'}\n </Button>\n ) : null}\n </Stack>\n ))}\n </>\n ) : null}\n <RegisterOtherDevices hostId={hostId} registerId={registerId} now={now} />\n </Stack>\n\n <Dialog\n open={adding}\n onClose={() => setAdding(false)}\n fullWidth\n maxWidth=\"sm\"\n >\n <DialogTitle>\n {credentials\n ? 'Connect the printer'\n : `Add a printer to ${registerName}`}\n </DialogTitle>\n <DialogContent>\n {credentials ? (\n <PollUrlPanel credentials={credentials} />\n ) : (\n <PrinterForm value={form} onChange={setForm} />\n )}\n </DialogContent>\n <DialogActions>\n {credentials ? (\n <Button onClick={() => setAdding(false)}>{'Done'}</Button>\n ) : (\n <>\n <Button onClick={() => setAdding(false)}>{'Cancel'}</Button>\n <Button\n onClick={create}\n disabled={busy || !form.name.trim() || !form.deviceId.trim()}\n >\n {'Add printer'}\n </Button>\n </>\n )}\n </DialogActions>\n </Dialog>\n\n <Dialog\n open={Boolean(editing)}\n onClose={() => setEditing(null)}\n fullWidth\n maxWidth=\"sm\"\n >\n <DialogTitle>{editing?.name ?? 'Printer'}</DialogTitle>\n <DialogContent>\n <PrinterForm value={form} onChange={setForm} brandLocked />\n <Divider sx={{ my: 2 }} />\n {credentials ? <PollUrlPanel credentials={credentials} /> : null}\n </DialogContent>\n <DialogActions>\n <Button color=\"warning\" onClick={regenerate}>\n {'Regenerate URL'}\n </Button>\n <Box sx={{ flex: 1 }} />\n <Button onClick={() => setEditing(null)}>{'Cancel'}</Button>\n <Button onClick={save} disabled={busy || !form.name.trim()}>\n {'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n </CardDisplay>\n )\n}\nRegisterHardwareCard.displayName = 'RegisterHardwareCard'\n\n/** One Hardware card per register on the site. */\nexport function RegisterHardwareCards(props: { hostId: string }) {\n const { hostId } = props\n const firestore = useFirestore()\n const { data: registerDocs } = useFirestoreCollection<{\n $id: string\n name?: string\n }>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const registers = [...(registerDocs ?? [])].sort((a, b) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n if (!registers.length) return null\n return (\n <Stack spacing={3}>\n {registers.map((register) => (\n <RegisterHardwareCard\n key={register.$id}\n hostId={hostId}\n registerId={register.$id}\n registerName={register.name || 'Register'}\n />\n ))}\n </Stack>\n )\n}\n\nexport default RegisterHardwareCards\n"],"names":["CommerceModel","CardDisplay","useConfirmationContext","useSnackbar","authorizedFetch","pluginDocsHelp","Alert","Autocomplete","Box","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","Divider","FormControlLabel","MenuItem","Stack","Switch","TextField","Typography","collection","limit","orderBy","query","where","useCallback","useEffect","useState","useFirestore","useFirestoreCollection","useUser","STATE_COLOR","online","paper_low","paper_out","cover_open","error","offline","unknown","JOB_LABELS","receipt","kitchen","drawer","test","report","seenAgo","atMs","nowMs","seconds","Math","max","round","minutes","hours","useNow","intervalMs","now","setNow","Date","id","setInterval","clearInterval","usePrintersApi","hostId","data","user","enqueueSnackbar","body","response","method","headers","JSON","stringify","payload","json","catch","ok","variant","persist","printerSetupSteps","brand","EMPTY_FORM","name","model","deviceId","paperWidthMm","autoPrintReceipts","kickDrawer","kitchenTickets","logoKey","PrinterForm","props","value","onChange","brandLocked","set","key","next","spacing","sx","pt","select","label","disabled","event","target","PRINTER_BRANDS","map","PRINTER_BRAND_LABELS","freeSolo","options","PRINTER_MODEL_SUGGESTIONS","onInputChange","_event","renderInput","params","placeholder","helperText","Number","control","checked","PollUrlPanel","credentials","copy","navigator","clipboard","writeText","pollUrl","severity","multiline","slotProps","htmlInput","readOnly","size","onClick","component","pl","m","step","mb","PrinterRowView","printer","call","onSettings","confirm","state","printerDisplayState","status","PRINTER_STATE_LABELS","send","action","result","printerId","$id","remove","confirmed","title","description","confirmationText","confirmationButtonProps","color","then","direction","alignItems","flexWrap","rowGap","flex","minWidth","noWrap","detail","DISPLAY_CONNECTED_MS","RegisterOtherDevices","registerId","firestore","readerDocs","idField","displays","setDisplays","live","answer","Array","isArray","readers","length","reader","deviceType","display","connected","lastSeenAtMs","displayName","RegisterHardwareCard","registerName","printerDocs","jobDocs","printers","sort","a","b","createdAtMs","jobs","adding","setAdding","form","setForm","editing","setEditing","setCredentials","busy","setBusy","openAdd","create","created","openSettings","Boolean","shown","save","_brand","settings","saved","regenerate","cancelJob","job","jobId","printerName","find","header","help","anchor","HeaderProps","contentGutterX","contentGutterY","kind","orderNumber","PRINT_JOB_STATUS_LABELS","open","onClose","fullWidth","maxWidth","trim","my","RegisterHardwareCards","registerDocs","registers","String","localeCompare","register"],"mappings":"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"}
@@ -21,9 +21,10 @@ import * as CommerceModel from "../../model/index.js";
21
21
  import { CardDisplay, useConfirmationContext } from "@aglyn/shared-ui-jsx";
22
22
  import { useSnackbar } from "@aglyn/shared-ui-snackstack";
23
23
  import { Button, Chip, MenuItem, Stack, TextField, Typography } from "@mui/material";
24
- import { collection, deleteDoc, doc, getCountFromServer, limit, query } from "firebase/firestore";
24
+ import { collection, getCountFromServer, limit, query } from "firebase/firestore";
25
25
  import { useCallback, useEffect, useState } from "react";
26
- import { useFirestore, useFirestoreCollection, useHostResourceApi, useOrgPlan } from "@aglyn/tenant-feature-instance";
26
+ import { useFirestore, useFirestoreCollection, useHostResourceApi, useOrgPlan, useUser } from "@aglyn/tenant-feature-instance";
27
+ import { posReadersCall } from "./pos/pos-api.js";
27
28
  import { pluginDocsHelp } from "@aglyn/aglyn";
28
29
  /**
29
30
  * POS registers (AGL-472): named registers under `hosts/{hostId}/registers`,
@@ -40,6 +41,7 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
40
41
  */ export function RegistersCard(props) {
41
42
  const { hostId } = props;
42
43
  const firestore = useFirestore();
44
+ const { data: user } = useUser();
43
45
  const { enqueueSnackbar } = useSnackbar();
44
46
  const { confirm } = useConfirmationContext();
45
47
  const createHostResource = useHostResourceApi();
@@ -171,14 +173,31 @@ import { pluginDocsHelp } from "@aglyn/aglyn";
171
173
  }
172
174
  }).then(()=>true).catch(()=>false);
173
175
  if (!confirmed) return;
174
- await deleteDoc(doc(firestore, 'hosts', hostId, 'registers', register.$id));
176
+ // On the server (AGL-3617): the rules have refused a client delete of a
177
+ // register since AGL-1775, so this button failed for every merchant.
178
+ // The route also signs out the register's customer displays.
179
+ try {
180
+ await posReadersCall(user, {
181
+ action: 'remove-register',
182
+ hostId,
183
+ registerId: register.$id
184
+ });
185
+ } catch (error) {
186
+ var _ref;
187
+ enqueueSnackbar((_ref = error == null ? void 0 : error.message) != null ? _ref : 'Could not remove the register', {
188
+ variant: 'warning',
189
+ persist: false
190
+ });
191
+ return;
192
+ }
175
193
  // A HARD delete, so the slot really is freed on both sides — the
176
194
  // one-shot aggregate has to be told (AGL-1716/AGL-1738).
177
195
  setRegisterCountEpoch((epoch)=>epoch + 1);
178
196
  }, [
179
197
  confirm,
180
- firestore,
181
- hostId
198
+ user,
199
+ hostId,
200
+ enqueueSnackbar
182
201
  ]);
183
202
  const locationName = (id)=>{
184
203
  var _locations_find;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/registers-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport { CardDisplay, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { Button, Chip, MenuItem, Stack, TextField, Typography } from '@mui/material'\nimport {\n collection,\n deleteDoc,\n doc,\n getCountFromServer,\n limit,\n query,\n} from 'firebase/firestore'\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n useFirestore,\n useFirestoreCollection,\n useHostResourceApi,\n useOrgPlan,\n} from '@aglyn/tenant-feature-instance'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\n\nexport interface RegistersCardProps {\n hostId: string\n}\n\n/**\n * POS registers (AGL-472): named registers under `hosts/{hostId}/registers`,\n * capped by the plan's `posRegisters` quota (Pro 1, Business 2, Advanced 5)\n * PLUS the register seats the org has allocated to this site out of the\n * purchased $89/mo pool (AGL-1775). Creation rides the quota-enforcing\n * resources API so the cap is authoritative; every POS sale stamps its\n * register so takings are attributable.\n *\n * The add-on used to raise the org-level entitlement, which every site\n * inherited — one purchase, `hostLimit` registers. It is a pool now, and the\n * message below tells an owner which of the two things to do about an\n * exhausted one: assign a seat they already own, or buy another.\n */\nexport function RegistersCard(props: RegistersCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const createHostResource = useHostResourceApi()\n const { org, ready: planReady } = useOrgPlan(hostId)\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'locations'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n const locations = locationDocs ?? []\n /**\n * The register HEAD-COUNT is a server aggregate, not the length of the\n * capped listener (AGL-1738, the ninth instance of AGL-1716's AGL-1706\n * shape — filed as latent, made real when the clamp was declined).\n *\n * The listener is `limit(25)` and the stock `posRegisters` bands top out\n * at agency's 20 — under the window — but the $89/mo register add-on is\n * sold flat up to `POS_REGISTERS_ADDON_MAX` (50) on any plan carrying\n * `pos`, so an agency org's effective limit reaches 70. From the 26th\n * register the listener saturates and the card understated usage in the\n * flattering direction while `api/hosts/resources`, which counts the\n * collection, refused the add.\n *\n * Re-read after an add AND a delete: registers are hard-deleted here\n * (like locations, unlike the soft-deleting cards), so a removal really\n * does free a slot on both sides, and a one-shot that missed it would\n * keep refusing.\n */\n const [registerCountEpoch, setRegisterCountEpoch] = useState(0)\n const [serverRegisterCount, setServerRegisterCount] = useState<number | null>(\n null,\n )\n useEffect(() => {\n let active = true\n void getCountFromServer(collection(firestore, 'hosts', hostId, 'registers'))\n .then((snapshot) => {\n if (active) setServerRegisterCount(snapshot.data().count)\n })\n .catch(() => {\n // Falls back to the loaded rows — a LOWER bound and the prior\n // behaviour, never 0, which reads as \"no registers used\" on a site\n // that is over its cap.\n })\n return () => {\n active = false\n }\n }, [firestore, hostId, registerCountEpoch])\n const registerCount = serverRegisterCount ?? registers.length\n // Per SITE (AGL-1775), not the org-level value: the plan's cap plus this\n // host's allocated seats. The allocation rides the SAME org doc `useOrgPlan`\n // already returns, so there is no second read to be loading or to fail —\n // and an unallocated (or not-yet-arrived) org resolves to the plan cap,\n // never to the pool.\n const quota = Aglyn.checkHostRegisterQuota(org, hostId, registerCount)\n const registerPool = Aglyn.resolveRegisterSeatPool(org)\n // Registers beyond the plan cap (e.g. after a downgrade) can't transact —\n // pos-order.ts blocks them by creation rank (AGL-482); mirror that here.\n //\n // Only once the org doc has arrived (AGL-1064). An absent org resolves to\n // the free tier's `posRegisters: 0`, which would badge EVERY register\n // \"Over plan limit\" for the first render or two of every mount.\n const withinCap = planReady\n ? CommerceModel.registersWithinCap(registers, quota.limit)\n : new Set<string>(registers.map((register: any) => register.$id))\n const [name, setName] = useState('')\n const [locationId, setLocationId] = useState('')\n\n const handleAdd = useCallback(async () => {\n if (!name.trim()) return\n // The button is disabled until the plan is known; this guards the case\n // where a click and the org doc race (AGL-1064).\n if (!planReady) return\n if (!quota.allowed) {\n // Three different answers, because the fix differs (AGL-1775). An\n // exhausted POOL is a purchase; an UNASSIGNED seat the org already owns\n // is a click, and telling that owner to buy another would sell them a\n // register they are already paying for.\n return void enqueueSnackbar(\n quota.limit === 0\n ? 'POS registers require the Pro plan or above — see Billing'\n : registerPool.available > 0\n ? `This site can run ${quota.limit} register${\n quota.limit === 1 ? '' : 's'\n } — you have ${registerPool.available} unassigned register seat${\n registerPool.available === 1 ? '' : 's'\n }; assign one to this site in Billing → Add-ons`\n : `This site can run ${quota.limit} register${\n quota.limit === 1 ? '' : 's'\n } and every purchased seat is assigned — add another from ` +\n 'Billing → Add-ons ($89/mo each)',\n { variant: 'info', persist: false },\n )\n }\n try {\n // Creation rides the quota-enforcing resources API (AGL-472/473).\n await createHostResource({\n hostId,\n resource: 'register',\n data: {\n name: name.trim().slice(0, 80),\n ...(locationId ? { locationId } : {}),\n } satisfies CommerceModel.PosRegister,\n })\n setName('')\n setLocationId('')\n setRegisterCountEpoch((epoch) => epoch + 1)\n } catch (error: any) {\n enqueueSnackbar(error?.message ?? 'Could not add register', {\n variant: 'warning',\n persist: false,\n })\n }\n }, [\n name,\n locationId,\n planReady,\n quota,\n hostId,\n createHostResource,\n enqueueSnackbar,\n ])\n\n const handleDelete = useCallback(\n (register: any) => async () => {\n const confirmed = await confirm({\n title: 'Remove this register?',\n description:\n `\"${register.name}\" stops being available at checkout. Past ` +\n 'sales keep their register tag.',\n confirmationText: 'Remove',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (!confirmed) return\n await deleteDoc(doc(firestore, 'hosts', hostId, 'registers', register.$id))\n // A HARD delete, so the slot really is freed on both sides — the\n // one-shot aggregate has to be told (AGL-1716/AGL-1738).\n setRegisterCountEpoch((epoch) => epoch + 1)\n },\n [confirm, firestore, hostId],\n )\n\n const locationName = (id: string) =>\n locations.find((location: any) => location.$id === id)?.name\n\n return (\n <CardDisplay\n header={'POS registers'}\n help={pluginDocsHelp('pos', { anchor: '#registers' })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1}>\n {registers.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Name each till or device that takes in-person payments. Every ' +\n 'POS sale is tagged with its register for end-of-day takings.'}\n </Typography>\n ) : (\n registers.map((register: any) => {\n const overCap = !withinCap.has(register.$id)\n return (\n <Stack\n key={register.$id}\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', opacity: overCap ? 0.6 : 1 }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1 }} noWrap>\n {register.name}\n {register.locationId && locationName(register.locationId) ? (\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · ${locationName(register.locationId)}`}\n </Typography>\n ) : null}\n </Typography>\n {overCap ? (\n <Chip\n label=\"Over plan limit\"\n size=\"small\"\n color=\"warning\"\n variant=\"outlined\"\n />\n ) : null}\n <Button size=\"small\" color=\"error\" onClick={handleDelete(register)}>\n {'Remove'}\n </Button>\n </Stack>\n )\n })\n )}\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"New register\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n size=\"small\"\n sx={{ flex: 1 }}\n placeholder=\"Front counter\"\n />\n {locations.length > 1 ? (\n <TextField\n select\n label=\"Location\"\n value={locationId}\n onChange={(event) => setLocationId(event.target.value)}\n size=\"small\"\n sx={{ minWidth: 140 }}\n >\n <MenuItem value=\"\">{'Any'}</MenuItem>\n {locations.map((location: any) => (\n <MenuItem key={location.$id} value={location.$id}>\n {location.name}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <Button\n size=\"small\"\n disabled={!name.trim() || !planReady}\n onClick={handleAdd}\n >\n {'Add'}\n </Button>\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {/* The site's registers, not this card's rows (AGL-1738) — the\n readout and the gate must agree, and the gate now counts. */}\n {planReady\n ? `${registerCount}/${\n quota.limit === Aglyn.UNLIMITED ? '∞' : quota.limit\n } registers on your plan`\n : `${registerCount} register${\n registerCount === 1 ? '' : 's'\n } · checking your plan…`}\n </Typography>\n </Stack>\n </CardDisplay>\n )\n}\nRegistersCard.displayName = 'RegistersCard'\n\nexport default RegistersCard\n"],"names":["Aglyn","CommerceModel","CardDisplay","useConfirmationContext","useSnackbar","Button","Chip","MenuItem","Stack","TextField","Typography","collection","deleteDoc","doc","getCountFromServer","limit","query","useCallback","useEffect","useState","useFirestore","useFirestoreCollection","useHostResourceApi","useOrgPlan","pluginDocsHelp","RegistersCard","props","hostId","firestore","enqueueSnackbar","confirm","createHostResource","org","ready","planReady","data","registerDocs","idField","locationDocs","registers","sort","a","b","String","name","localeCompare","locations","registerCountEpoch","setRegisterCountEpoch","serverRegisterCount","setServerRegisterCount","active","then","snapshot","count","catch","registerCount","length","quota","checkHostRegisterQuota","registerPool","resolveRegisterSeatPool","withinCap","registersWithinCap","Set","map","register","$id","setName","locationId","setLocationId","handleAdd","trim","allowed","available","variant","persist","resource","slice","epoch","error","message","handleDelete","confirmed","title","description","confirmationText","confirmationButtonProps","color","locationName","id","find","location","header","help","anchor","contentGutterX","contentGutterY","spacing","overCap","has","direction","sx","alignItems","opacity","flex","noWrap","component","label","size","onClick","value","onChange","event","target","placeholder","select","minWidth","disabled","UNLIMITED","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/registers-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport { CardDisplay, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { Button, Chip, MenuItem, Stack, TextField, Typography } from '@mui/material'\nimport {\n collection,\n getCountFromServer,\n limit,\n query,\n} from 'firebase/firestore'\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n useFirestore,\n useFirestoreCollection,\n useHostResourceApi,\n useOrgPlan,\n useUser,\n} from '@aglyn/tenant-feature-instance'\nimport { posReadersCall } from './pos/pos-api'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\n\nexport interface RegistersCardProps {\n hostId: string\n}\n\n/**\n * POS registers (AGL-472): named registers under `hosts/{hostId}/registers`,\n * capped by the plan's `posRegisters` quota (Pro 1, Business 2, Advanced 5)\n * PLUS the register seats the org has allocated to this site out of the\n * purchased $89/mo pool (AGL-1775). Creation rides the quota-enforcing\n * resources API so the cap is authoritative; every POS sale stamps its\n * register so takings are attributable.\n *\n * The add-on used to raise the org-level entitlement, which every site\n * inherited — one purchase, `hostLimit` registers. It is a pool now, and the\n * message below tells an owner which of the two things to do about an\n * exhausted one: assign a seat they already own, or buy another.\n */\nexport function RegistersCard(props: RegistersCardProps) {\n const { hostId } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const createHostResource = useHostResourceApi()\n const { org, ready: planReady } = useOrgPlan(hostId)\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'locations'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n const locations = locationDocs ?? []\n /**\n * The register HEAD-COUNT is a server aggregate, not the length of the\n * capped listener (AGL-1738, the ninth instance of AGL-1716's AGL-1706\n * shape — filed as latent, made real when the clamp was declined).\n *\n * The listener is `limit(25)` and the stock `posRegisters` bands top out\n * at agency's 20 — under the window — but the $89/mo register add-on is\n * sold flat up to `POS_REGISTERS_ADDON_MAX` (50) on any plan carrying\n * `pos`, so an agency org's effective limit reaches 70. From the 26th\n * register the listener saturates and the card understated usage in the\n * flattering direction while `api/hosts/resources`, which counts the\n * collection, refused the add.\n *\n * Re-read after an add AND a delete: registers are hard-deleted here\n * (like locations, unlike the soft-deleting cards), so a removal really\n * does free a slot on both sides, and a one-shot that missed it would\n * keep refusing.\n */\n const [registerCountEpoch, setRegisterCountEpoch] = useState(0)\n const [serverRegisterCount, setServerRegisterCount] = useState<number | null>(\n null,\n )\n useEffect(() => {\n let active = true\n void getCountFromServer(collection(firestore, 'hosts', hostId, 'registers'))\n .then((snapshot) => {\n if (active) setServerRegisterCount(snapshot.data().count)\n })\n .catch(() => {\n // Falls back to the loaded rows — a LOWER bound and the prior\n // behaviour, never 0, which reads as \"no registers used\" on a site\n // that is over its cap.\n })\n return () => {\n active = false\n }\n }, [firestore, hostId, registerCountEpoch])\n const registerCount = serverRegisterCount ?? registers.length\n // Per SITE (AGL-1775), not the org-level value: the plan's cap plus this\n // host's allocated seats. The allocation rides the SAME org doc `useOrgPlan`\n // already returns, so there is no second read to be loading or to fail —\n // and an unallocated (or not-yet-arrived) org resolves to the plan cap,\n // never to the pool.\n const quota = Aglyn.checkHostRegisterQuota(org, hostId, registerCount)\n const registerPool = Aglyn.resolveRegisterSeatPool(org)\n // Registers beyond the plan cap (e.g. after a downgrade) can't transact —\n // pos-order.ts blocks them by creation rank (AGL-482); mirror that here.\n //\n // Only once the org doc has arrived (AGL-1064). An absent org resolves to\n // the free tier's `posRegisters: 0`, which would badge EVERY register\n // \"Over plan limit\" for the first render or two of every mount.\n const withinCap = planReady\n ? CommerceModel.registersWithinCap(registers, quota.limit)\n : new Set<string>(registers.map((register: any) => register.$id))\n const [name, setName] = useState('')\n const [locationId, setLocationId] = useState('')\n\n const handleAdd = useCallback(async () => {\n if (!name.trim()) return\n // The button is disabled until the plan is known; this guards the case\n // where a click and the org doc race (AGL-1064).\n if (!planReady) return\n if (!quota.allowed) {\n // Three different answers, because the fix differs (AGL-1775). An\n // exhausted POOL is a purchase; an UNASSIGNED seat the org already owns\n // is a click, and telling that owner to buy another would sell them a\n // register they are already paying for.\n return void enqueueSnackbar(\n quota.limit === 0\n ? 'POS registers require the Pro plan or above — see Billing'\n : registerPool.available > 0\n ? `This site can run ${quota.limit} register${\n quota.limit === 1 ? '' : 's'\n } — you have ${registerPool.available} unassigned register seat${\n registerPool.available === 1 ? '' : 's'\n }; assign one to this site in Billing → Add-ons`\n : `This site can run ${quota.limit} register${\n quota.limit === 1 ? '' : 's'\n } and every purchased seat is assigned — add another from ` +\n 'Billing → Add-ons ($89/mo each)',\n { variant: 'info', persist: false },\n )\n }\n try {\n // Creation rides the quota-enforcing resources API (AGL-472/473).\n await createHostResource({\n hostId,\n resource: 'register',\n data: {\n name: name.trim().slice(0, 80),\n ...(locationId ? { locationId } : {}),\n } satisfies CommerceModel.PosRegister,\n })\n setName('')\n setLocationId('')\n setRegisterCountEpoch((epoch) => epoch + 1)\n } catch (error: any) {\n enqueueSnackbar(error?.message ?? 'Could not add register', {\n variant: 'warning',\n persist: false,\n })\n }\n }, [\n name,\n locationId,\n planReady,\n quota,\n hostId,\n createHostResource,\n enqueueSnackbar,\n ])\n\n const handleDelete = useCallback(\n (register: any) => async () => {\n const confirmed = await confirm({\n title: 'Remove this register?',\n description:\n `\"${register.name}\" stops being available at checkout. Past ` +\n 'sales keep their register tag.',\n confirmationText: 'Remove',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (!confirmed) return\n // On the server (AGL-3617): the rules have refused a client delete of a\n // register since AGL-1775, so this button failed for every merchant.\n // The route also signs out the register's customer displays.\n try {\n await posReadersCall(user, { action: 'remove-register', hostId, registerId: register.$id })\n } catch (error: any) {\n enqueueSnackbar(error?.message ?? 'Could not remove the register', {\n variant: 'warning',\n persist: false,\n })\n return\n }\n // A HARD delete, so the slot really is freed on both sides — the\n // one-shot aggregate has to be told (AGL-1716/AGL-1738).\n setRegisterCountEpoch((epoch) => epoch + 1)\n },\n [confirm, user, hostId, enqueueSnackbar],\n )\n\n const locationName = (id: string) =>\n locations.find((location: any) => location.$id === id)?.name\n\n return (\n <CardDisplay\n header={'POS registers'}\n help={pluginDocsHelp('pos', { anchor: '#registers' })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={1}>\n {registers.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Name each till or device that takes in-person payments. Every ' +\n 'POS sale is tagged with its register for end-of-day takings.'}\n </Typography>\n ) : (\n registers.map((register: any) => {\n const overCap = !withinCap.has(register.$id)\n return (\n <Stack\n key={register.$id}\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', opacity: overCap ? 0.6 : 1 }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1 }} noWrap>\n {register.name}\n {register.locationId && locationName(register.locationId) ? (\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · ${locationName(register.locationId)}`}\n </Typography>\n ) : null}\n </Typography>\n {overCap ? (\n <Chip\n label=\"Over plan limit\"\n size=\"small\"\n color=\"warning\"\n variant=\"outlined\"\n />\n ) : null}\n <Button size=\"small\" color=\"error\" onClick={handleDelete(register)}>\n {'Remove'}\n </Button>\n </Stack>\n )\n })\n )}\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"New register\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n size=\"small\"\n sx={{ flex: 1 }}\n placeholder=\"Front counter\"\n />\n {locations.length > 1 ? (\n <TextField\n select\n label=\"Location\"\n value={locationId}\n onChange={(event) => setLocationId(event.target.value)}\n size=\"small\"\n sx={{ minWidth: 140 }}\n >\n <MenuItem value=\"\">{'Any'}</MenuItem>\n {locations.map((location: any) => (\n <MenuItem key={location.$id} value={location.$id}>\n {location.name}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <Button\n size=\"small\"\n disabled={!name.trim() || !planReady}\n onClick={handleAdd}\n >\n {'Add'}\n </Button>\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {/* The site's registers, not this card's rows (AGL-1738) — the\n readout and the gate must agree, and the gate now counts. */}\n {planReady\n ? `${registerCount}/${\n quota.limit === Aglyn.UNLIMITED ? '∞' : quota.limit\n } registers on your plan`\n : `${registerCount} register${\n registerCount === 1 ? '' : 's'\n } · checking your plan…`}\n </Typography>\n </Stack>\n </CardDisplay>\n )\n}\nRegistersCard.displayName = 'RegistersCard'\n\nexport default RegistersCard\n"],"names":["Aglyn","CommerceModel","CardDisplay","useConfirmationContext","useSnackbar","Button","Chip","MenuItem","Stack","TextField","Typography","collection","getCountFromServer","limit","query","useCallback","useEffect","useState","useFirestore","useFirestoreCollection","useHostResourceApi","useOrgPlan","useUser","posReadersCall","pluginDocsHelp","RegistersCard","props","hostId","firestore","data","user","enqueueSnackbar","confirm","createHostResource","org","ready","planReady","registerDocs","idField","locationDocs","registers","sort","a","b","String","name","localeCompare","locations","registerCountEpoch","setRegisterCountEpoch","serverRegisterCount","setServerRegisterCount","active","then","snapshot","count","catch","registerCount","length","quota","checkHostRegisterQuota","registerPool","resolveRegisterSeatPool","withinCap","registersWithinCap","Set","map","register","$id","setName","locationId","setLocationId","handleAdd","trim","allowed","available","variant","persist","resource","slice","epoch","error","message","handleDelete","confirmed","title","description","confirmationText","confirmationButtonProps","color","action","registerId","locationName","id","find","location","header","help","anchor","contentGutterX","contentGutterY","spacing","overCap","has","direction","sx","alignItems","opacity","flex","noWrap","component","label","size","onClick","value","onChange","event","target","placeholder","select","minWidth","disabled","UNLIMITED","displayName"],"mappings":"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"}
@@ -0,0 +1,38 @@
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
+ /** The console's door to returns: `POST /api/commerce/returns`. */
18
+ export declare const RETURNS_ROUTE = "/api/commerce/returns";
19
+ /** What the route answered, or why it did not. */
20
+ export interface ReturnActionOutcome {
21
+ ok: boolean;
22
+ /** The route's answer; empty when it refused. */
23
+ payload: Record<string, any>;
24
+ /** Words for a failure; empty on success. */
25
+ message: string;
26
+ /** A 4xx: the route refused and wrote nothing. */
27
+ refused: boolean;
28
+ }
29
+ /**
30
+ * Posts one returns action — `{ hostId, action, … }` — with the member's ID
31
+ * token, and words a failure the way the order dialog does: a 4xx carries the
32
+ * route's own reason and wrote nothing; a 500 with the route's word is a
33
+ * rolled-back transaction, safe to retry; an answer with no word, or none at
34
+ * all, leaves the outcome unknown.
35
+ */
36
+ export declare function postReturnAction(user: unknown, body: Record<string, unknown>): Promise<ReturnActionOutcome>;
37
+ /** A money amount in the store's currency. */
38
+ export declare function formatMoney(cents: number, currency: string): string;
@@ -0,0 +1,76 @@
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
+ */ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
17
+ /** The console's door to returns: `POST /api/commerce/returns`. */ export const RETURNS_ROUTE = '/api/commerce/returns';
18
+ /**
19
+ * Posts one returns action — `{ hostId, action, … }` — with the member's ID
20
+ * token, and words a failure the way the order dialog does: a 4xx carries the
21
+ * route's own reason and wrote nothing; a 500 with the route's word is a
22
+ * rolled-back transaction, safe to retry; an answer with no word, or none at
23
+ * all, leaves the outcome unknown.
24
+ */ export async function postReturnAction(user, body) {
25
+ let response;
26
+ try {
27
+ response = await authorizedFetch(user, RETURNS_ROUTE, {
28
+ method: 'POST',
29
+ headers: {
30
+ 'Content-Type': 'application/json'
31
+ },
32
+ body: JSON.stringify(body)
33
+ });
34
+ } catch (error) {
35
+ console.error(error);
36
+ return {
37
+ ok: false,
38
+ payload: {},
39
+ refused: false,
40
+ message: 'The request did not complete, so it is not known whether the return changed. ' + 'Reopen it to check — retrying is safe.'
41
+ };
42
+ }
43
+ const payload = await response.json().catch(()=>({}));
44
+ if (response.ok) return {
45
+ ok: true,
46
+ payload: payload != null ? payload : {},
47
+ message: '',
48
+ refused: false
49
+ };
50
+ if (payload == null ? void 0 : payload.error) {
51
+ return {
52
+ ok: false,
53
+ payload: {},
54
+ refused: response.status < 500,
55
+ message: response.status < 500 ? String(payload.error) : `${payload.error} Nothing changed.`
56
+ };
57
+ }
58
+ return {
59
+ ok: false,
60
+ payload: {},
61
+ refused: false,
62
+ message: `The return could not be updated (${response.status}), and it is not known whether it changed. Reopen it to check — retrying is safe.`
63
+ };
64
+ }
65
+ /** A money amount in the store's currency. */ export function formatMoney(cents, currency) {
66
+ try {
67
+ return new Intl.NumberFormat('en-US', {
68
+ style: 'currency',
69
+ currency
70
+ }).format(cents / 100);
71
+ } catch (unused) {
72
+ return `$${(cents / 100).toFixed(2)}`;
73
+ }
74
+ }
75
+
76
+ //# sourceMappingURL=return-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/return-actions.ts"],"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\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\n\n/** The console's door to returns: `POST /api/commerce/returns`. */\nexport const RETURNS_ROUTE = '/api/commerce/returns'\n\n/** What the route answered, or why it did not. */\nexport interface ReturnActionOutcome {\n ok: boolean\n /** The route's answer; empty when it refused. */\n payload: Record<string, any>\n /** Words for a failure; empty on success. */\n message: string\n /** A 4xx: the route refused and wrote nothing. */\n refused: boolean\n}\n\n/**\n * Posts one returns action — `{ hostId, action, … }` — with the member's ID\n * token, and words a failure the way the order dialog does: a 4xx carries the\n * route's own reason and wrote nothing; a 500 with the route's word is a\n * rolled-back transaction, safe to retry; an answer with no word, or none at\n * all, leaves the outcome unknown.\n */\nexport async function postReturnAction(\n user: unknown,\n body: Record<string, unknown>,\n): Promise<ReturnActionOutcome> {\n let response: Response\n try {\n response = await authorizedFetch(user as never, RETURNS_ROUTE, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n } catch (error) {\n console.error(error)\n return {\n ok: false,\n payload: {},\n refused: false,\n message:\n 'The request did not complete, so it is not known whether the return changed. ' +\n 'Reopen it to check — retrying is safe.',\n }\n }\n const payload: any = await response.json().catch(() => ({}))\n if (response.ok) return { ok: true, payload: payload ?? {}, message: '', refused: false }\n if (payload?.error) {\n return {\n ok: false,\n payload: {},\n refused: response.status < 500,\n message:\n response.status < 500\n ? String(payload.error)\n : `${payload.error} Nothing changed.`,\n }\n }\n return {\n ok: false,\n payload: {},\n refused: false,\n message: `The return could not be updated (${response.status}), and it is not known whether it changed. Reopen it to check — retrying is safe.`,\n }\n}\n\n/** A money amount in the store's currency. */\nexport function formatMoney(cents: number, currency: string): string {\n try {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(cents / 100)\n } catch {\n return `$${(cents / 100).toFixed(2)}`\n }\n}\n"],"names":["authorizedFetch","RETURNS_ROUTE","postReturnAction","user","body","response","method","headers","JSON","stringify","error","console","ok","payload","refused","message","json","catch","status","String","formatMoney","cents","currency","Intl","NumberFormat","style","format","toFixed"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,eAAe,QAAQ,2CAA0C;AAE1E,iEAAiE,GACjE,OAAO,MAAMC,gBAAgB,wBAAuB;AAapD;;;;;;CAMC,GACD,OAAO,eAAeC,iBACpBC,IAAa,EACbC,IAA6B;IAE7B,IAAIC;IACJ,IAAI;QACFA,WAAW,MAAML,gBAAgBG,MAAeF,eAAe;YAC7DK,QAAQ;YACRC,SAAS;gBAAE,gBAAgB;YAAmB;YAC9CH,MAAMI,KAAKC,SAAS,CAACL;QACvB;IACF,EAAE,OAAOM,OAAO;QACdC,QAAQD,KAAK,CAACA;QACd,OAAO;YACLE,IAAI;YACJC,SAAS,CAAC;YACVC,SAAS;YACTC,SACE,kFACA;QACJ;IACF;IACA,MAAMF,UAAe,MAAMR,SAASW,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;IACzD,IAAIZ,SAASO,EAAE,EAAE,OAAO;QAAEA,IAAI;QAAMC,OAAO,EAAEA,kBAAAA,UAAW,CAAC;QAAGE,SAAS;QAAID,SAAS;IAAM;IACxF,IAAID,2BAAAA,QAASH,KAAK,EAAE;QAClB,OAAO;YACLE,IAAI;YACJC,SAAS,CAAC;YACVC,SAAST,SAASa,MAAM,GAAG;YAC3BH,SACEV,SAASa,MAAM,GAAG,MACdC,OAAON,QAAQH,KAAK,IACpB,GAAGG,QAAQH,KAAK,CAAC,iBAAiB,CAAC;QAC3C;IACF;IACA,OAAO;QACLE,IAAI;QACJC,SAAS,CAAC;QACVC,SAAS;QACTC,SAAS,CAAC,iCAAiC,EAAEV,SAASa,MAAM,CAAC,iFAAiF,CAAC;IACjJ;AACF;AAEA,4CAA4C,GAC5C,OAAO,SAASE,YAAYC,KAAa,EAAEC,QAAgB;IACzD,IAAI;QACF,OAAO,IAAIC,KAAKC,YAAY,CAAC,SAAS;YAAEC,OAAO;YAAYH;QAAS,GAAGI,MAAM,CAACL,QAAQ;IACxF,EAAE,eAAM;QACN,OAAO,CAAC,CAAC,EAAE,AAACA,CAAAA,QAAQ,GAAE,EAAGM,OAAO,CAAC,IAAI;IACvC;AACF"}
@@ -0,0 +1,34 @@
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
+ export interface ReturnDetailDialogProps {
18
+ hostId: string;
19
+ /** The return to show; `null` keeps the dialog closed. */
20
+ returnId: string | null;
21
+ onClose: () => void;
22
+ }
23
+ /**
24
+ * One return (AGL-3611): what is coming back and why, the notes on both
25
+ * sides, the label and the restock, its timeline, and the actions its state
26
+ * allows (`canTransitionReturn`). Every action is the returns route — the
27
+ * return is never written from here — and the dialog reads the return live,
28
+ * so what the route wrote is what it shows next.
29
+ */
30
+ export declare function ReturnDetailDialog(props: ReturnDetailDialogProps): import("react").JSX.Element;
31
+ export declare namespace ReturnDetailDialog {
32
+ var displayName: string;
33
+ }
34
+ export default ReturnDetailDialog;