@aglyn/plugins-commerce 1.0.0-beta.285 → 1.0.0-beta.288
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.
- package/README.md +1 -1
- package/package.json +13 -13
- package/src/lib/components/cart.js +25 -12
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/commerce-console-page.js +70 -13
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +2 -1
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-webhooks-card.component.js +1 -1
- package/src/lib/components/console/order-webhooks-card.component.js.map +1 -1
- package/src/lib/components/console/payment-methods-card.component.js +1 -1
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +5 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +18 -12
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-api.d.ts +76 -5
- package/src/lib/components/console/pos/pos-hardware-api.js +53 -11
- package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-buyer.component.d.ts +18 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js +629 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.d.ts +162 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js +122 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js +251 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.js +50 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
- package/src/lib/components/console/pos-cellular-control.component.d.ts +41 -0
- package/src/lib/components/console/pos-cellular-control.component.js +211 -0
- package/src/lib/components/console/pos-cellular-control.component.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +9 -1
- package/src/lib/components/console/pos-devices-card.component.js +47 -15
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +6 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +8 -1
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
- package/src/lib/components/console/pos-display-page.component.d.ts +13 -0
- package/src/lib/components/console/pos-display-page.component.js +44 -2
- package/src/lib/components/console/pos-display-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-card.component.d.ts +12 -4
- package/src/lib/components/console/pos-hardware-card.component.js +157 -36
- package/src/lib/components/console/pos-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +360 -80
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-terms-page.component.d.ts +34 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js +257 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.d.ts +27 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js +104 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.d.ts +24 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js +205 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +297 -201
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +3 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +260 -92
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +9 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +15 -6
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.d.ts +25 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js +136 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +6 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +48 -31
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -1
- package/src/lib/components/console/pos-page.component.d.ts +1 -1
- package/src/lib/components/console/pos-page.component.js +63 -12
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -1
- package/src/lib/components/console/product-check-in-fields.component.d.ts +4 -2
- package/src/lib/components/console/product-check-in-fields.component.js +60 -14
- package/src/lib/components/console/product-check-in-fields.component.js.map +1 -1
- package/src/lib/components/console/product-editor-dialog.component.js +44 -1
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-hardware-sku-field.component.d.ts +19 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js +92 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js.map +1 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.d.ts +22 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js +94 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +4 -0
- package/src/lib/components/console/product-register-fields.component.js +31 -2
- package/src/lib/components/console/product-register-fields.component.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +11 -2
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +11 -0
- package/src/lib/components/console/register-hardware-card.component.js +56 -27
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/reservation-guests-dialog.component.d.ts +28 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js +189 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js.map +1 -0
- package/src/lib/components/console/reservations-card.component.d.ts +9 -0
- package/src/lib/components/console/reservations-card.component.js +158 -23
- package/src/lib/components/console/reservations-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -1
- package/src/lib/components/console/shipstation-card.component.d.ts +1 -1
- package/src/lib/components/console/shipstation-card.component.js +3 -3
- package/src/lib/components/console/shipstation-card.component.js.map +1 -1
- package/src/lib/components/product-detail.d.ts +4 -0
- package/src/lib/components/product-detail.js +40 -5
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/product-reviews.js +28 -11
- package/src/lib/components/product-reviews.js.map +1 -1
- package/src/lib/components/reservation-widget.js +28 -5
- package/src/lib/components/reservation-widget.js.map +1 -1
- package/src/lib/components/use-day-picker.d.ts +25 -0
- package/src/lib/components/use-day-picker.js +57 -0
- package/src/lib/components/use-day-picker.js.map +1 -0
- package/src/lib/constants/operator-alerts.d.ts +55 -0
- package/src/lib/constants/operator-alerts.js +156 -1
- package/src/lib/constants/operator-alerts.js.map +1 -1
- package/src/lib/declarations.console-server.js +54 -1
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +4 -2
- package/src/lib/declarations.js +15 -4
- package/src/lib/declarations.js.map +1 -1
- package/src/lib/declarations.server.js +9 -0
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/commerce-cart.d.ts +9 -1
- package/src/lib/model/commerce-cart.js +4 -3
- package/src/lib/model/commerce-cart.js.map +1 -1
- package/src/lib/model/commerce-check-in-product.d.ts +26 -0
- package/src/lib/model/commerce-check-in-product.js +64 -2
- package/src/lib/model/commerce-check-in-product.js.map +1 -1
- package/src/lib/model/commerce-check-in-record.d.ts +127 -0
- package/src/lib/model/commerce-check-in-record.js +36 -0
- package/src/lib/model/commerce-check-in-record.js.map +1 -0
- package/src/lib/model/commerce-check-in.d.ts +91 -87
- package/src/lib/model/commerce-check-in.js +186 -62
- package/src/lib/model/commerce-check-in.js.map +1 -1
- package/src/lib/model/commerce-kiosk-offer.d.ts +31 -0
- package/src/lib/model/commerce-kiosk-offer.js +35 -0
- package/src/lib/model/commerce-kiosk-offer.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +76 -0
- package/src/lib/model/commerce-orders.js +6 -0
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-pos-day-report.d.ts +54 -1
- package/src/lib/model/commerce-pos-day-report.js +39 -2
- package/src/lib/model/commerce-pos-day-report.js.map +1 -1
- package/src/lib/model/commerce-pos-offline.d.ts +1 -1
- package/src/lib/model/commerce-pos-offline.js +6 -1
- package/src/lib/model/commerce-pos-offline.js.map +1 -1
- package/src/lib/model/commerce-pos-ops.js +3 -2
- package/src/lib/model/commerce-pos-ops.js.map +1 -1
- package/src/lib/model/commerce-pos.d.ts +36 -3
- package/src/lib/model/commerce-pos.js +14 -6
- package/src/lib/model/commerce-pos.js.map +1 -1
- package/src/lib/model/commerce-receipt.js +3 -2
- package/src/lib/model/commerce-receipt.js.map +1 -1
- package/src/lib/model/commerce-reservations.d.ts +69 -4
- package/src/lib/model/commerce-reservations.js +57 -5
- package/src/lib/model/commerce-reservations.js.map +1 -1
- package/src/lib/model/commerce.d.ts +66 -0
- package/src/lib/model/commerce.js +15 -0
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/order-list-fields.d.ts +11 -0
- package/src/lib/model/order-list-fields.js +17 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/own-store-tax-summary.d.ts +152 -0
- package/src/lib/model/own-store-tax-summary.js +288 -0
- package/src/lib/model/own-store-tax-summary.js.map +1 -0
- package/src/lib/model/plugin-permissions.d.ts +74 -0
- package/src/lib/model/plugin-permissions.js +224 -7
- package/src/lib/model/plugin-permissions.js.map +1 -1
- package/src/lib/model/pos-cellular.d.ts +223 -0
- package/src/lib/model/pos-cellular.js +293 -0
- package/src/lib/model/pos-cellular.js.map +1 -0
- package/src/lib/model/pos-hardware-in-person.d.ts +98 -0
- package/src/lib/model/pos-hardware-in-person.js +224 -0
- package/src/lib/model/pos-hardware-in-person.js.map +1 -0
- package/src/lib/model/pos-hardware-tax-summary.d.ts +166 -0
- package/src/lib/model/pos-hardware-tax-summary.js +225 -0
- package/src/lib/model/pos-hardware-tax-summary.js.map +1 -0
- package/src/lib/model/pos-hardware-terms.d.ts +74 -0
- package/src/lib/model/pos-hardware-terms.js +115 -0
- package/src/lib/model/pos-hardware-terms.js.map +1 -0
- package/src/lib/model/pos-hardware.d.ts +349 -7
- package/src/lib/model/pos-hardware.js +291 -20
- package/src/lib/model/pos-hardware.js.map +1 -1
- package/src/lib/model/product-write.d.ts +10 -0
- package/src/lib/model/product-write.js +4 -2
- package/src/lib/model/product-write.js.map +1 -1
- package/src/lib/model/workspace-site-permissions.d.ts +26 -0
- package/src/lib/model/workspace-site-permissions.js +81 -0
- package/src/lib/model/workspace-site-permissions.js.map +1 -0
- package/src/lib/plugin.js +16 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/billing-webhook.js +25 -1
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +7 -5
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/cart-checkout.js +20 -8
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/cart.js +29 -0
- package/src/lib/server/cart.js.map +1 -1
- package/src/lib/server/checkout.js +42 -13
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/collection-membership.d.ts +4 -0
- package/src/lib/server/collection-membership.js +5 -10
- package/src/lib/server/collection-membership.js.map +1 -1
- package/src/lib/server/commerce-site-keys.d.ts +48 -0
- package/src/lib/server/commerce-site-keys.js +61 -0
- package/src/lib/server/commerce-site-keys.js.map +1 -0
- package/src/lib/server/draft-order.js +8 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.js +7 -5
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/gift-cards.js +8 -5
- package/src/lib/server/gift-cards.js.map +1 -1
- package/src/lib/server/local-fulfillment-status.js +9 -6
- package/src/lib/server/local-fulfillment-status.js.map +1 -1
- package/src/lib/server/member-post.js +6 -5
- package/src/lib/server/member-post.js.map +1 -1
- package/src/lib/server/membership-admin-password.d.ts +4 -2
- package/src/lib/server/membership-admin-password.js +10 -8
- package/src/lib/server/membership-admin-password.js.map +1 -1
- package/src/lib/server/membership-admin-remove.d.ts +7 -5
- package/src/lib/server/membership-admin-remove.js +9 -9
- package/src/lib/server/membership-admin-remove.js.map +1 -1
- package/src/lib/server/order-notifications.js +5 -2
- package/src/lib/server/order-notifications.js.map +1 -1
- package/src/lib/server/order-print.js +7 -5
- package/src/lib/server/order-print.js.map +1 -1
- package/src/lib/server/order-receipt-send.js +8 -5
- package/src/lib/server/order-receipt-send.js.map +1 -1
- package/src/lib/server/order-webhooks.js +8 -8
- package/src/lib/server/order-webhooks.js.map +1 -1
- package/src/lib/server/orders-shipping-prepare.js +9 -6
- package/src/lib/server/orders-shipping-prepare.js.map +1 -1
- package/src/lib/server/own-store-tax-return-source.d.ts +47 -0
- package/src/lib/server/own-store-tax-return-source.js +312 -0
- package/src/lib/server/own-store-tax-return-source.js.map +1 -0
- package/src/lib/server/payment-methods.js +13 -9
- package/src/lib/server/payment-methods.js.map +1 -1
- package/src/lib/server/pos-auth.d.ts +37 -6
- package/src/lib/server/pos-auth.js +40 -15
- package/src/lib/server/pos-auth.js.map +1 -1
- package/src/lib/server/pos-cellular-billing.d.ts +81 -0
- package/src/lib/server/pos-cellular-billing.js +711 -0
- package/src/lib/server/pos-cellular-billing.js.map +1 -0
- package/src/lib/server/pos-cellular-notify.d.ts +47 -0
- package/src/lib/server/pos-cellular-notify.js +150 -0
- package/src/lib/server/pos-cellular-notify.js.map +1 -0
- package/src/lib/server/pos-cellular.d.ts +88 -0
- package/src/lib/server/pos-cellular.js +339 -0
- package/src/lib/server/pos-cellular.js.map +1 -0
- package/src/lib/server/pos-check-in.d.ts +5 -1
- package/src/lib/server/pos-check-in.js +296 -28
- package/src/lib/server/pos-check-in.js.map +1 -1
- package/src/lib/server/pos-day-report.js +29 -3
- package/src/lib/server/pos-day-report.js.map +1 -1
- package/src/lib/server/pos-display.d.ts +16 -0
- package/src/lib/server/pos-display.js +129 -2
- package/src/lib/server/pos-display.js.map +1 -1
- package/src/lib/server/pos-hardware-admin.d.ts +10 -1
- package/src/lib/server/pos-hardware-admin.js +250 -84
- package/src/lib/server/pos-hardware-admin.js.map +1 -1
- package/src/lib/server/pos-hardware-attach.d.ts +105 -0
- package/src/lib/server/pos-hardware-attach.js +443 -0
- package/src/lib/server/pos-hardware-attach.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-lookup.d.ts +58 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js +180 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-record.d.ts +29 -0
- package/src/lib/server/pos-hardware-buyer-record.js +86 -0
- package/src/lib/server/pos-hardware-buyer-record.js.map +1 -0
- package/src/lib/server/pos-hardware-cancel.d.ts +58 -0
- package/src/lib/server/pos-hardware-cancel.js +147 -0
- package/src/lib/server/pos-hardware-cancel.js.map +1 -0
- package/src/lib/server/pos-hardware-closure-notices.d.ts +27 -0
- package/src/lib/server/pos-hardware-closure-notices.js +85 -0
- package/src/lib/server/pos-hardware-closure-notices.js.map +1 -0
- package/src/lib/server/pos-hardware-closure.d.ts +60 -0
- package/src/lib/server/pos-hardware-closure.js +153 -0
- package/src/lib/server/pos-hardware-closure.js.map +1 -0
- package/src/lib/server/pos-hardware-in-person.d.ts +61 -0
- package/src/lib/server/pos-hardware-in-person.js +236 -0
- package/src/lib/server/pos-hardware-in-person.js.map +1 -0
- package/src/lib/server/pos-hardware-notify.d.ts +40 -2
- package/src/lib/server/pos-hardware-notify.js +195 -14
- package/src/lib/server/pos-hardware-notify.js.map +1 -1
- package/src/lib/server/pos-hardware-readers.d.ts +115 -0
- package/src/lib/server/pos-hardware-readers.js +430 -0
- package/src/lib/server/pos-hardware-readers.js.map +1 -0
- package/src/lib/server/pos-hardware-returns.d.ts +116 -0
- package/src/lib/server/pos-hardware-returns.js +502 -0
- package/src/lib/server/pos-hardware-returns.js.map +1 -0
- package/src/lib/server/pos-hardware-sale-fields.d.ts +28 -0
- package/src/lib/server/pos-hardware-sale-fields.js +44 -0
- package/src/lib/server/pos-hardware-sale-fields.js.map +1 -0
- package/src/lib/server/pos-hardware-sale.d.ts +54 -0
- package/src/lib/server/pos-hardware-sale.js +369 -0
- package/src/lib/server/pos-hardware-sale.js.map +1 -0
- package/src/lib/server/pos-hardware-tax-return-source.d.ts +99 -0
- package/src/lib/server/pos-hardware-tax-return-source.js +462 -0
- package/src/lib/server/pos-hardware-tax-return-source.js.map +1 -0
- package/src/lib/server/pos-hardware-terms.d.ts +64 -0
- package/src/lib/server/pos-hardware-terms.js +154 -0
- package/src/lib/server/pos-hardware-terms.js.map +1 -0
- package/src/lib/server/pos-hardware-user-eraser.d.ts +3 -0
- package/src/lib/server/pos-hardware-user-eraser.js +31 -7
- package/src/lib/server/pos-hardware-user-eraser.js.map +1 -1
- package/src/lib/server/pos-hardware-webhook.d.ts +5 -0
- package/src/lib/server/pos-hardware-webhook.js +51 -6
- package/src/lib/server/pos-hardware-webhook.js.map +1 -1
- package/src/lib/server/pos-hardware.d.ts +74 -1
- package/src/lib/server/pos-hardware.js +175 -10
- package/src/lib/server/pos-hardware.js.map +1 -1
- package/src/lib/server/pos-kiosk.d.ts +2 -0
- package/src/lib/server/pos-kiosk.js +17 -12
- package/src/lib/server/pos-kiosk.js.map +1 -1
- package/src/lib/server/pos-offline-card-order.d.ts +64 -0
- package/src/lib/server/pos-offline-card-order.js +102 -0
- package/src/lib/server/pos-offline-card-order.js.map +1 -0
- package/src/lib/server/pos-offline-card-reconcile.d.ts +67 -1
- package/src/lib/server/pos-offline-card-reconcile.js +215 -18
- package/src/lib/server/pos-offline-card-reconcile.js.map +1 -1
- package/src/lib/server/pos-offline-sync.d.ts +39 -0
- package/src/lib/server/pos-offline-sync.js +190 -55
- package/src/lib/server/pos-offline-sync.js.map +1 -1
- package/src/lib/server/pos-ops-gate.d.ts +28 -9
- package/src/lib/server/pos-ops-gate.js +50 -19
- package/src/lib/server/pos-ops-gate.js.map +1 -1
- package/src/lib/server/pos-ops-routes.js +24 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -1
- package/src/lib/server/pos-order-refund-ids.d.ts +28 -0
- package/src/lib/server/pos-order-refund-ids.js +31 -0
- package/src/lib/server/pos-order-refund-ids.js.map +1 -0
- package/src/lib/server/pos-order.js +52 -49
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.js +1 -1
- package/src/lib/server/pos-payment.js.map +1 -1
- package/src/lib/server/pos-reader-splash-admin.js +30 -32
- package/src/lib/server/pos-reader-splash-admin.js.map +1 -1
- package/src/lib/server/pos-reader-splash-images-route.d.ts +17 -0
- package/src/lib/server/pos-reader-splash-images-route.js +113 -0
- package/src/lib/server/pos-reader-splash-images-route.js.map +1 -0
- package/src/lib/server/pos-reader-splash-images.d.ts +51 -0
- package/src/lib/server/pos-reader-splash-images.js +123 -0
- package/src/lib/server/pos-reader-splash-images.js.map +1 -0
- package/src/lib/server/pos-reader-splash.d.ts +68 -1
- package/src/lib/server/pos-reader-splash.js +182 -11
- package/src/lib/server/pos-reader-splash.js.map +1 -1
- package/src/lib/server/pos-readers.d.ts +29 -0
- package/src/lib/server/pos-readers.js +134 -35
- package/src/lib/server/pos-readers.js.map +1 -1
- package/src/lib/server/pos-refund-authority.d.ts +3 -1
- package/src/lib/server/pos-refund-authority.js +3 -2
- package/src/lib/server/pos-refund-authority.js.map +1 -1
- package/src/lib/server/pos-return.d.ts +10 -0
- package/src/lib/server/pos-return.js +29 -7
- package/src/lib/server/pos-return.js.map +1 -1
- package/src/lib/server/pos-sale.js +6 -1
- package/src/lib/server/pos-sale.js.map +1 -1
- package/src/lib/server/pos-shift.js +11 -0
- package/src/lib/server/pos-shift.js.map +1 -1
- package/src/lib/server/pos-staff-pin.js +29 -24
- package/src/lib/server/pos-staff-pin.js.map +1 -1
- package/src/lib/server/pos-terminal.d.ts +14 -4
- package/src/lib/server/pos-terminal.js +34 -38
- package/src/lib/server/pos-terminal.js.map +1 -1
- package/src/lib/server/printers.d.ts +7 -3
- package/src/lib/server/printers.js +18 -12
- package/src/lib/server/printers.js.map +1 -1
- package/src/lib/server/product-drafts.d.ts +11 -1
- package/src/lib/server/product-drafts.js +12 -8
- package/src/lib/server/product-drafts.js.map +1 -1
- package/src/lib/server/product.d.ts +15 -1
- package/src/lib/server/product.js +16 -3
- package/src/lib/server/product.js.map +1 -1
- package/src/lib/server/products-write.d.ts +26 -2
- package/src/lib/server/products-write.js +19 -7
- package/src/lib/server/products-write.js.map +1 -1
- package/src/lib/server/refund.js +55 -42
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reservation-availability-query.d.ts +8 -0
- package/src/lib/server/reservation-availability-query.js +11 -1
- package/src/lib/server/reservation-availability-query.js.map +1 -1
- package/src/lib/server/reservation-availability.d.ts +1 -1
- package/src/lib/server/reservation-availability.js +7 -2
- package/src/lib/server/reservation-availability.js.map +1 -1
- package/src/lib/server/reservation-guests.d.ts +32 -0
- package/src/lib/server/reservation-guests.js +285 -0
- package/src/lib/server/reservation-guests.js.map +1 -0
- package/src/lib/server/reservation-walk-in.d.ts +11 -1
- package/src/lib/server/reservation-walk-in.js +56 -12
- package/src/lib/server/reservation-walk-in.js.map +1 -1
- package/src/lib/server/reserve.js +18 -5
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/returns.js +9 -6
- package/src/lib/server/returns.js.map +1 -1
- package/src/lib/server/reviews.d.ts +22 -2
- package/src/lib/server/reviews.js +88 -20
- package/src/lib/server/reviews.js.map +1 -1
- package/src/lib/server/shipping-connectors.js +10 -11
- package/src/lib/server/shipping-connectors.js.map +1 -1
- package/src/lib/server/site-page-resolver.js +20 -3
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/store-day.d.ts +33 -0
- package/src/lib/server/store-day.js +46 -0
- package/src/lib/server/store-day.js.map +1 -0
- package/src/lib/server/store-setup-ai-writer.d.ts +2 -1
- package/src/lib/server/store-setup-ai-writer.js +5 -6
- package/src/lib/server/store-setup-ai-writer.js.map +1 -1
- package/src/lib/server/storefront-tax.d.ts +13 -0
- package/src/lib/server/storefront-tax.js +8 -1
- package/src/lib/server/storefront-tax.js.map +1 -1
- package/src/lib/server/tax-return-source.d.ts +32 -3
- package/src/lib/server/tax-return-source.js +99 -20
- package/src/lib/server/tax-return-source.js.map +1 -1
- package/src/lib/server.js +100 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/fake-firestore.js +58 -16
- package/src/lib/testing/fake-firestore.js.map +1 -1
- package/src/lib/testing/pos-ops-memory-firestore.js +18 -4
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -1
- package/src/lib/testing/site-register-permissions.d.ts +29 -0
- package/src/lib/testing/site-register-permissions.js +38 -0
- package/src/lib/testing/site-register-permissions.js.map +1 -0
- package/src/lib/transfer/tracking.server.js +8 -5
- package/src/lib/transfer/tracking.server.js.map +1 -1
- package/src/lib/utils/add-to-cart.d.ts +2 -0
- package/src/lib/utils/add-to-cart.js +6 -3
- package/src/lib/utils/add-to-cart.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-check-ins-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 { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useFirestore, useFirestoreCollection, useUser } from '@aglyn/tenant-feature-instance'\nimport { Alert, Button, Chip, Stack, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport type { Dayjs } from 'dayjs'\nimport { collection, documentId, limit, orderBy, query } from 'firebase/firestore'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n checkInItemLabel,\n checkInTimeLabel,\n describeWristband,\n POS_CHECK_IN_ROUTE,\n type CheckInDayTotals,\n type CheckInRow,\n} from '../../../model/commerce-check-in'\nimport { escapeHtml } from '../../../utils/escape-html'\nimport CommerceStatTile from '../commerce-stat-tile.component'\nimport { EntitlementGatedCard } from '../entitlement-gate.component'\nimport { POS_RECEIPT_STYLES } from './pos-receipt'\nimport { printPosDocument } from './pos-shift-report.component'\n\n/*==========================================\n * TODAY'S CHECK-INS (AGL-4043): who is due at the window on a day, who is\n * checked in, by whom and with which wristband, from\n * `GET /api/commerce/pos-check-in`. The day is a whole, bounded list, so\n * the grid sorts it by any column itself.\n *=========================================*/\n\nexport interface PosCheckInsCardProps {\n hostId: string\n /** The viewer may work the register: what the route's gate asks. */\n canManagePos?: boolean\n}\n\nconst HEADER = \"Today's check-ins\"\nconst HELP = pluginDocsHelp('posOperations', { anchor: '#check-in-at-the-window' })\nconst DAY_FORMAT = 'YYYY-MM-DD'\n\ninterface DayList {\n dayKey: string\n timeZone: string\n totals: CheckInDayTotals\n checkIns: CheckInRow[]\n truncated?: boolean\n}\n\ntype Answer =\n | { state: 'idle' | 'loading' }\n | { state: 'ready'; list: DayList }\n | { state: 'error'; error: string }\n\n/** The day's list as a printable 80 mm document, like the day totals. */\nexport function posCheckInsDocument(list: DayList): string {\n const rows = list.checkIns\n .map(\n (row) =>\n `<div class=\"row\"><span>${escapeHtml(`${row.customerName || row.customerEmail || 'Customer'} · ${checkInItemLabel(row)}`)}</span>` +\n `<span>${escapeHtml(\n row.status === 'checked_in'\n ? [checkInTimeLabel(row.checkedInAtMs, list.timeZone), describeWristband(row.wristband)].filter(Boolean).join(' ')\n : '—',\n )}</span></div>`,\n )\n .join('')\n return (\n '<!doctype html><html><head><meta charset=\"utf-8\">' +\n `<title>CHECK-INS</title><style>${POS_RECEIPT_STYLES}</style></head><body>` +\n `<div class=\"receipt\"><div class=\"center\"><div class=\"title\">CHECK-INS</div>` +\n `<div class=\"muted\">${escapeHtml(list.dayKey)} · ${list.totals.checkedIn} of ${list.totals.expected} checked in</div></div>` +\n `<hr class=\"rule\">${rows}</div></body></html>`\n )\n}\n\nfunction PosCheckInsBody(props: PosCheckInsCardProps) {\n const { hostId, canManagePos = false } = props\n const { data: user } = useUser()\n const [day, setDay] = useState<Dayjs | null>(null)\n const [answer, setAnswer] = useState<Answer>({ state: 'idle' })\n const [exporting, setExporting] = useState(false)\n\n const url = useCallback(\n (format?: 'csv') => {\n const params = new URLSearchParams({ hostId })\n if (day?.isValid()) params.set('day', day.format(DAY_FORMAT))\n if (format) params.set('format', format)\n return `${POS_CHECK_IN_ROUTE}?${params.toString()}`\n },\n [hostId, day],\n )\n\n const load = useCallback(async () => {\n if (!user || !canManagePos) return\n setAnswer({ state: 'loading' })\n try {\n const response = await authorizedFetch(user as never, url(), { method: 'GET' })\n const body = (await response.json().catch(() => ({}))) as Partial<DayList> & { error?: string }\n setAnswer(\n response.ok && body.checkIns\n ? { state: 'ready', list: body as DayList }\n : { state: 'error', error: body.error || 'The check-ins could not be read.' },\n )\n } catch {\n setAnswer({ state: 'error', error: 'The check-ins could not be read. Check the connection.' })\n }\n }, [user, canManagePos, url])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const list = answer.state === 'ready' ? answer.list : null\n const columns = useMemo<GridColDef[]>(\n () => [\n {\n field: 'customerName',\n headerName: 'Name',\n flex: 1,\n minWidth: 150,\n valueGetter: (_value: unknown, row: CheckInRow) => row.customerName || row.customerEmail || '',\n },\n {\n field: 'itemName',\n headerName: 'Item',\n flex: 1,\n minWidth: 160,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInItemLabel(row),\n },\n {\n field: 'orderLabel',\n headerName: 'Order',\n minWidth: 100,\n valueGetter: (_value: unknown, row: CheckInRow) => row.orderLabel ?? (row.source === 'reservation' ? 'Stay' : ''),\n },\n {\n field: 'status',\n headerName: 'Status',\n minWidth: 120,\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.status === 'checked_in' ? (\n <Chip size=\"small\" color=\"success\" label=\"Checked in\" />\n ) : (\n <Chip size=\"small\" variant=\"outlined\" label=\"Expected\" />\n ),\n },\n {\n field: 'checkedInAtMs',\n headerName: 'Checked in at',\n type: 'number',\n minWidth: 120,\n valueFormatter: (value: number | null) => (list ? checkInTimeLabel(value, list.timeZone) : ''),\n },\n { field: 'checkedInByName', headerName: 'By', minWidth: 120 },\n {\n field: 'wristband',\n headerName: 'Wristband',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => describeWristband(row.wristband),\n },\n ],\n [list],\n )\n const rows = useMemo(() => (list ? list.checkIns.map((row) => ({ ...row, $id: row.id })) : []), [list])\n\n const exportCsv = async () => {\n if (!user || !list) return\n setExporting(true)\n try {\n const response = await authorizedFetch(user as never, url('csv'), { method: 'GET' })\n if (!response.ok) {\n const body = (await response.json().catch(() => ({}))) as { error?: string }\n setAnswer({ state: 'error', error: body.error || 'The spreadsheet could not be made.' })\n return\n }\n const blob = new Blob([await response.text()], { type: 'text/csv;charset=utf-8' })\n const href = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = href\n link.download = `check-ins-${list.dayKey}.csv`\n link.click()\n window.setTimeout(() => URL.revokeObjectURL(href), 1000)\n } finally {\n setExporting(false)\n }\n }\n\n return (\n <CardDisplay\n header={HEADER}\n help={HELP}\n HeaderProps={{\n action: (\n <Stack direction=\"row\" spacing={1}>\n <Button size=\"small\" onClick={() => void load()} disabled={!canManagePos || answer.state === 'loading'}>\n {'Refresh'}\n </Button>\n <Button size=\"small\" onClick={() => void exportCsv()} disabled={!list || exporting}>\n {'Export CSV'}\n </Button>\n <Button size=\"small\" onClick={() => list && printPosDocument(posCheckInsDocument(list))} disabled={!list}>\n {'Print'}\n </Button>\n </Stack>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2.5}>\n {!canManagePos ? (\n <Alert severity=\"info\">\n {'Check-ins are for members who can use the register: a site admin or editor with the \"Use the point of sale\" permission.'}\n </Alert>\n ) : null}\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'center' } }}>\n <DatePicker\n label=\"Day\"\n value={day}\n onChange={setDay}\n disabled={!canManagePos}\n slotProps={{ textField: { size: 'small' } }}\n />\n <Button size=\"small\" disabled={!canManagePos || !day} onClick={() => setDay(null)}>\n {'Today'}\n </Button>\n </Stack>\n </LocalizationProvider>\n {answer.state === 'loading' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Reading who is due…'}\n </Typography>\n ) : null}\n {answer.state === 'error' ? <Alert severity=\"warning\">{answer.error}</Alert> : null}\n {list ? (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${list.dayKey} · ${list.timeZone} · passes and stays that need check-in`}\n </Typography>\n {list.truncated ? (\n <Alert severity=\"warning\">\n {'This day has more check-ins than one list reads; some are missing here.'}\n </Alert>\n ) : null}\n <Stack direction=\"row\" spacing={3} sx={{ flexWrap: 'wrap', rowGap: 1.5 }}>\n <CommerceStatTile label=\"Expected\" value={String(list.totals.expected)} />\n <CommerceStatTile label=\"Checked in\" value={String(list.totals.checkedIn)} />\n <CommerceStatTile label=\"Still to come\" value={String(list.totals.expected - list.totals.checkedIn)} />\n </Stack>\n <ListTable\n aria-label=\"Check-ins on this day\"\n rows={rows}\n columns={columns}\n noRowsLabel=\"Nobody is due to check in on this day\"\n />\n </>\n ) : null}\n </Stack>\n </CardDisplay>\n )\n}\n\n/**\n * Today's check-ins (AGL-4043): beside the day totals, for a store with a\n * register, on a plan with the point of sale.\n */\nexport function PosCheckInsCard(props: PosCheckInsCardProps) {\n const firestore = useFirestore()\n // Whether the store has a register at all, as the day totals ask it.\n const { data: registers, status } = useFirestoreCollection<any>(\n () =>\n query(collection(firestore, 'hosts', props.hostId, 'registers'), orderBy(documentId()), limit(1)),\n [firestore, props.hostId],\n { idField: '$id' },\n )\n if (status === 'success' && !registers?.length) return null\n return (\n <EntitlementGatedCard\n hostId={props.hostId}\n feature=\"pos\"\n header={HEADER}\n help={HELP}\n upsell={'Checking in passes, camping and stays at the window, with wristbands, comes with the point of sale.'}\n >\n <PosCheckInsBody {...props} />\n </EntitlementGatedCard>\n )\n}\n\nPosCheckInsCard.displayName = 'PosCheckInsCard'\n\nexport default PosCheckInsCard\n"],"names":["pluginDocsHelp","CardDisplay","ListTable","authorizedFetch","useFirestore","useFirestoreCollection","useUser","Alert","Button","Chip","Stack","Typography","AdapterDayjs","DatePicker","LocalizationProvider","collection","documentId","limit","orderBy","query","useCallback","useEffect","useMemo","useState","checkInItemLabel","checkInTimeLabel","describeWristband","POS_CHECK_IN_ROUTE","escapeHtml","CommerceStatTile","EntitlementGatedCard","POS_RECEIPT_STYLES","printPosDocument","HEADER","HELP","anchor","DAY_FORMAT","posCheckInsDocument","list","rows","checkIns","map","row","customerName","customerEmail","status","checkedInAtMs","timeZone","wristband","filter","Boolean","join","dayKey","totals","checkedIn","expected","PosCheckInsBody","props","hostId","canManagePos","data","user","day","setDay","answer","setAnswer","state","exporting","setExporting","url","format","params","URLSearchParams","isValid","set","toString","load","response","method","body","json","catch","ok","error","columns","field","headerName","flex","minWidth","valueGetter","_value","orderLabel","source","renderCell","size","color","label","variant","type","valueFormatter","value","$id","id","exportCsv","blob","Blob","text","href","URL","createObjectURL","link","document","createElement","download","click","window","setTimeout","revokeObjectURL","header","help","HeaderProps","action","direction","spacing","onClick","disabled","contentGutterX","contentGutterY","severity","dateAdapter","xs","sm","sx","alignItems","onChange","slotProps","textField","truncated","flexWrap","rowGap","String","aria-label","noRowsLabel","PosCheckInsCard","firestore","registers","idField","length","feature","upsell","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-check-ins-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 { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useFirestore, useFirestoreCollection, useUser } from '@aglyn/tenant-feature-instance'\nimport { Alert, Button, Chip, Stack, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport type { Dayjs } from 'dayjs'\nimport { collection, documentId, limit, orderBy, query } from 'firebase/firestore'\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useState } from 'react'\nimport { zonedDayKey } from '@aglyn/shared-util-timestamp/zoned-time'\nimport {\n checkInItemLabel,\n checkInRainCheckIsOpen,\n checkInStatusLabel,\n checkInTimeLabel,\n describeWristband,\n POS_CHECK_IN_ROUTE,\n rainCheckLabel,\n type CheckInDayTotals,\n type CheckInRow,\n} from '../../../model/commerce-check-in'\nimport { callPosOps } from './pos-ops-api'\nimport type { StayCheckInMode } from '../../../model/commerce-reservations'\nimport { PosRainCheckDialog } from './pos-rain-check-dialog.component'\nimport { escapeHtml } from '../../../utils/escape-html'\nimport CommerceStatTile from '../commerce-stat-tile.component'\nimport { EntitlementGatedCard } from '../entitlement-gate.component'\nimport { POS_RECEIPT_STYLES } from './pos-receipt'\nimport { printPosDocument } from './pos-shift-report.component'\n\n/*==========================================\n * TODAY'S CHECK-INS (AGL-4043): who is due at the window on a day, who is\n * checked in, by whom and with which wristband, from\n * `GET /api/commerce/pos-check-in`. The day is a whole, bounded list, so\n * the grid sorts it by any column itself.\n *=========================================*/\n\nexport interface PosCheckInsCardProps {\n hostId: string\n /** The viewer may work the register: what the route's gate asks. */\n canManagePos?: boolean\n}\n\n/** A stay's guest count (AGL-4043), loaded the first time it opens. */\nconst ReservationGuestsDialog = lazy(() => import('../reservation-guests-dialog.component'))\n\nconst HEADER = \"Today's check-ins\"\nconst HELP = pluginDocsHelp('posOperations', { anchor: '#check-in-at-the-window' })\nconst DAY_FORMAT = 'YYYY-MM-DD'\n\ninterface DayList {\n dayKey: string\n timeZone: string\n totals: CheckInDayTotals\n checkIns: CheckInRow[]\n truncated?: boolean\n /** How the store checks stays in (AGL-4043). */\n stayCheckIn?: StayCheckInMode\n}\n\n/** The quick control's choices, in the order the window reads them. */\nconst STAY_MODE_LABELS: ReadonlyArray<{ mode: StayCheckInMode; label: string }> = [\n { mode: 'resource', label: 'As each resource is set' },\n { mode: 'stay', label: 'One per stay' },\n { mode: 'guest', label: 'One per guest' },\n]\n\ntype Answer =\n | { state: 'idle' | 'loading' }\n | { state: 'ready'; list: DayList }\n | { state: 'error'; error: string }\n\n/** The day's list as a printable 80 mm document, like the day totals. */\nexport function posCheckInsDocument(list: DayList): string {\n const rows = list.checkIns\n .map(\n (row) =>\n `<div class=\"row\"><span>${escapeHtml(`${row.customerName || row.customerEmail || 'Customer'} · ${checkInItemLabel(row)}`)}</span>` +\n `<span>${escapeHtml(\n row.status === 'checked_in'\n ? [checkInTimeLabel(row.checkedInAtMs, list.timeZone), describeWristband(row.wristband)].filter(Boolean).join(' ')\n : checkInRainCheckIsOpen(row)\n ? 'Rain check'\n : '—',\n )}</span></div>`,\n )\n .join('')\n return (\n '<!doctype html><html><head><meta charset=\"utf-8\">' +\n `<title>CHECK-INS</title><style>${POS_RECEIPT_STYLES}</style></head><body>` +\n `<div class=\"receipt\"><div class=\"center\"><div class=\"title\">CHECK-INS</div>` +\n `<div class=\"muted\">${escapeHtml(list.dayKey)} · ${list.totals.checkedIn} of ${list.totals.expected} checked in</div></div>` +\n `<hr class=\"rule\">${rows}</div></body></html>`\n )\n}\n\nfunction PosCheckInsBody(props: PosCheckInsCardProps) {\n const { hostId, canManagePos = false } = props\n const { data: user } = useUser()\n const [day, setDay] = useState<Dayjs | null>(null)\n const [answer, setAnswer] = useState<Answer>({ state: 'idle' })\n const [exporting, setExporting] = useState(false)\n /** The pass a rain check is being given on (AGL-4043). */\n const [rainCheckRow, setRainCheckRow] = useState<CheckInRow | null>(null)\n const [actionError, setActionError] = useState('')\n /** The stay whose guests are being changed (AGL-4043). */\n const [guestsFor, setGuestsFor] = useState<string | null>(null)\n\n const url = useCallback(\n (format?: 'csv') => {\n const params = new URLSearchParams({ hostId })\n if (day?.isValid()) params.set('day', day.format(DAY_FORMAT))\n if (format) params.set('format', format)\n return `${POS_CHECK_IN_ROUTE}?${params.toString()}`\n },\n [hostId, day],\n )\n\n const load = useCallback(async () => {\n if (!user || !canManagePos) return\n setAnswer({ state: 'loading' })\n try {\n const response = await authorizedFetch(user as never, url(), { method: 'GET' })\n const body = (await response.json().catch(() => ({}))) as Partial<DayList> & { error?: string }\n setAnswer(\n response.ok && body.checkIns\n ? { state: 'ready', list: body as DayList }\n : { state: 'error', error: body.error || 'The check-ins could not be read.' },\n )\n } catch {\n setAnswer({ state: 'error', error: 'The check-ins could not be read. Check the connection.' })\n }\n }, [user, canManagePos, url])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const list = answer.state === 'ready' ? answer.list : null\n const todayKey = list ? zonedDayKey(Date.now(), list.timeZone) : ''\n\n const [savingStayMode, setSavingStayMode] = useState(false)\n /** The store's quick control for stays: one check-in per stay or per guest (AGL-4043). */\n const setStayMode = useCallback(\n async (mode: StayCheckInMode) => {\n setActionError('')\n setSavingStayMode(true)\n const done = await callPosOps(user, 'pos-check-in', {\n hostId,\n action: 'stay_mode',\n mode,\n ...(day?.isValid() ? { day: day.format(DAY_FORMAT) } : {}),\n })\n setSavingStayMode(false)\n if (!done.ok) return setActionError(done.body.error ?? 'The setting could not be saved.')\n await load()\n },\n [user, hostId, day, load],\n )\n\n const undoRainCheck = useCallback(\n async (row: CheckInRow) => {\n setActionError('')\n const done = await callPosOps<{ checkIn?: CheckInRow }>(user, 'pos-check-in', {\n hostId,\n action: 'undo_rain_check',\n id: row.id,\n })\n if (!done.ok) return setActionError(done.body.error ?? 'The rain check could not be undone.')\n await load()\n },\n [user, hostId, load],\n )\n\n const columns = useMemo<GridColDef[]>(\n () => [\n {\n field: 'customerName',\n headerName: 'Name',\n flex: 1,\n minWidth: 150,\n valueGetter: (_value: unknown, row: CheckInRow) => row.customerName || row.customerEmail || '',\n },\n {\n field: 'itemName',\n headerName: 'Item',\n flex: 1,\n minWidth: 160,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInItemLabel(row),\n },\n {\n field: 'orderLabel',\n headerName: 'Order',\n minWidth: 100,\n valueGetter: (_value: unknown, row: CheckInRow) => row.orderLabel ?? (row.source === 'reservation' ? 'Stay' : ''),\n },\n {\n field: 'status',\n headerName: 'Status',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInStatusLabel(row),\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.status === 'checked_in' ? (\n <Chip size=\"small\" color=\"success\" label=\"Checked in\" />\n ) : checkInRainCheckIsOpen(row) ? (\n <Chip size=\"small\" color=\"info\" variant=\"outlined\" label=\"Rain check\" />\n ) : (\n <Chip size=\"small\" variant=\"outlined\" label=\"Expected\" />\n ),\n },\n {\n field: 'rainCheck',\n headerName: 'Rain check',\n minWidth: 200,\n flex: 1,\n valueGetter: (_value: unknown, row: CheckInRow) => rainCheckLabel(row),\n },\n {\n field: 'checkedInAtMs',\n headerName: 'Checked in at',\n type: 'number',\n minWidth: 120,\n valueFormatter: (value: number | null) => (list ? checkInTimeLabel(value, list.timeZone) : ''),\n },\n { field: 'checkedInByName', headerName: 'By', minWidth: 120 },\n {\n field: 'wristband',\n headerName: 'Wristband',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => describeWristband(row.wristband),\n },\n {\n // What a pass waiting at the window can still have done to it: a\n // rain check, or one taken back; and a stay's guest count (AGL-4043).\n // Not a value, so nothing to sort.\n field: 'rainCheckAction',\n headerName: '',\n minWidth: 150,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.source === 'reservation' && row.reservationId ? (\n <Button size=\"small\" disabled={!canManagePos} onClick={() => setGuestsFor(row.reservationId)}>\n {'Guests'}\n </Button>\n ) : row.source !== 'order' || row.status !== 'expected' ? null : row.rainCheck ? (\n <Button size=\"small\" disabled={!canManagePos} onClick={() => void undoRainCheck(row)}>\n {'Undo rain check'}\n </Button>\n ) : (\n <Button size=\"small\" disabled={!canManagePos || !todayKey} onClick={() => setRainCheckRow(row)}>\n {'Rain check'}\n </Button>\n ),\n },\n ],\n [list, canManagePos, todayKey, undoRainCheck],\n )\n const rows = useMemo(() => (list ? list.checkIns.map((row) => ({ ...row, $id: row.id })) : []), [list])\n\n const exportCsv = async () => {\n if (!user || !list) return\n setExporting(true)\n try {\n const response = await authorizedFetch(user as never, url('csv'), { method: 'GET' })\n if (!response.ok) {\n const body = (await response.json().catch(() => ({}))) as { error?: string }\n setAnswer({ state: 'error', error: body.error || 'The spreadsheet could not be made.' })\n return\n }\n const blob = new Blob([await response.text()], { type: 'text/csv;charset=utf-8' })\n const href = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = href\n link.download = `check-ins-${list.dayKey}.csv`\n link.click()\n window.setTimeout(() => URL.revokeObjectURL(href), 1000)\n } finally {\n setExporting(false)\n }\n }\n\n return (\n <CardDisplay\n header={HEADER}\n help={HELP}\n HeaderProps={{\n action: (\n <Stack direction=\"row\" spacing={1}>\n <Button size=\"small\" onClick={() => void load()} disabled={!canManagePos || answer.state === 'loading'}>\n {'Refresh'}\n </Button>\n <Button size=\"small\" onClick={() => void exportCsv()} disabled={!list || exporting}>\n {'Export CSV'}\n </Button>\n <Button size=\"small\" onClick={() => list && printPosDocument(posCheckInsDocument(list))} disabled={!list}>\n {'Print'}\n </Button>\n </Stack>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2.5}>\n {!canManagePos ? (\n <Alert severity=\"info\">\n {'Check-ins are for members who can use the register: a site admin or editor with the \"Use the point of sale\" permission.'}\n </Alert>\n ) : null}\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'center' } }}>\n <DatePicker\n label=\"Day\"\n value={day}\n onChange={setDay}\n disabled={!canManagePos}\n slotProps={{ textField: { size: 'small' } }}\n />\n <Button size=\"small\" disabled={!canManagePos || !day} onClick={() => setDay(null)}>\n {'Today'}\n </Button>\n </Stack>\n </LocalizationProvider>\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\" component=\"h3\" id=\"stay-check-in-label\">\n {'Stays at check-in'}\n </Typography>\n <ToggleButtonGroup\n exclusive\n size=\"small\"\n aria-labelledby=\"stay-check-in-label\"\n value={list?.stayCheckIn ?? 'resource'}\n onChange={(_event, mode: StayCheckInMode | null) => {\n if (mode && mode !== list?.stayCheckIn) void setStayMode(mode)\n }}\n disabled={!canManagePos || !list || savingStayMode}\n sx={{ flexWrap: 'wrap' }}\n >\n {STAY_MODE_LABELS.map((choice) => (\n <ToggleButton key={choice.mode} value={choice.mode}>\n {choice.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'One per guest gives each guest of a stay their own check-in and wristband, by the stay’s guest count.'}\n </Typography>\n </Stack>\n {answer.state === 'loading' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Reading who is due…'}\n </Typography>\n ) : null}\n {answer.state === 'error' ? <Alert severity=\"warning\">{answer.error}</Alert> : null}\n {list ? (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${list.dayKey} · ${list.timeZone} · passes and stays that need check-in`}\n </Typography>\n {list.truncated ? (\n <Alert severity=\"warning\">\n {'This day has more check-ins than one list reads; some are missing here.'}\n </Alert>\n ) : null}\n <Stack direction=\"row\" spacing={3} sx={{ flexWrap: 'wrap', rowGap: 1.5 }}>\n <CommerceStatTile label=\"Expected\" value={String(list.totals.expected)} />\n <CommerceStatTile label=\"Checked in\" value={String(list.totals.checkedIn)} />\n <CommerceStatTile label=\"Still to come\" value={String(list.totals.expected - list.totals.checkedIn)} />\n {list.totals.rainChecks ? (\n <CommerceStatTile label=\"Rain checks\" value={String(list.totals.rainChecks)} />\n ) : null}\n </Stack>\n {actionError ? <Alert severity=\"warning\">{actionError}</Alert> : null}\n <ListTable\n aria-label=\"Check-ins on this day\"\n rows={rows}\n columns={columns}\n noRowsLabel=\"Nobody is due to check in on this day\"\n />\n </>\n ) : null}\n </Stack>\n <PosRainCheckDialog\n row={rainCheckRow}\n hostId={hostId}\n todayKey={todayKey}\n onClose={() => setRainCheckRow(null)}\n onDone={() => {\n setRainCheckRow(null)\n void load()\n }}\n />\n {guestsFor ? (\n <Suspense fallback={null}>\n <ReservationGuestsDialog\n reservationId={guestsFor}\n hostId={hostId}\n onClose={() => setGuestsFor(null)}\n onDone={() => {\n setGuestsFor(null)\n void load()\n }}\n />\n </Suspense>\n ) : null}\n </CardDisplay>\n )\n}\n\n/**\n * Today's check-ins (AGL-4043): beside the day totals, for a store with a\n * register, on a plan with the point of sale.\n */\nexport function PosCheckInsCard(props: PosCheckInsCardProps) {\n const firestore = useFirestore()\n // Whether the store has a register at all, as the day totals ask it.\n const { data: registers, status } = useFirestoreCollection<any>(\n () =>\n query(collection(firestore, 'hosts', props.hostId, 'registers'), orderBy(documentId()), limit(1)),\n [firestore, props.hostId],\n { idField: '$id' },\n )\n if (status === 'success' && !registers?.length) return null\n return (\n <EntitlementGatedCard\n hostId={props.hostId}\n feature=\"pos\"\n header={HEADER}\n help={HELP}\n upsell={'Checking in passes, camping and stays at the window, with wristbands, comes with the point of sale.'}\n >\n <PosCheckInsBody {...props} />\n </EntitlementGatedCard>\n )\n}\n\nPosCheckInsCard.displayName = 'PosCheckInsCard'\n\nexport default PosCheckInsCard\n"],"names":["pluginDocsHelp","CardDisplay","ListTable","authorizedFetch","useFirestore","useFirestoreCollection","useUser","Alert","Button","Chip","Stack","ToggleButton","ToggleButtonGroup","Typography","AdapterDayjs","DatePicker","LocalizationProvider","collection","documentId","limit","orderBy","query","lazy","Suspense","useCallback","useEffect","useMemo","useState","zonedDayKey","checkInItemLabel","checkInRainCheckIsOpen","checkInStatusLabel","checkInTimeLabel","describeWristband","POS_CHECK_IN_ROUTE","rainCheckLabel","callPosOps","PosRainCheckDialog","escapeHtml","CommerceStatTile","EntitlementGatedCard","POS_RECEIPT_STYLES","printPosDocument","ReservationGuestsDialog","HEADER","HELP","anchor","DAY_FORMAT","STAY_MODE_LABELS","mode","label","posCheckInsDocument","list","rows","checkIns","map","row","customerName","customerEmail","status","checkedInAtMs","timeZone","wristband","filter","Boolean","join","dayKey","totals","checkedIn","expected","PosCheckInsBody","props","hostId","canManagePos","data","user","day","setDay","answer","setAnswer","state","exporting","setExporting","rainCheckRow","setRainCheckRow","actionError","setActionError","guestsFor","setGuestsFor","url","format","params","URLSearchParams","isValid","set","toString","load","response","method","body","json","catch","ok","error","todayKey","Date","now","savingStayMode","setSavingStayMode","setStayMode","done","action","undoRainCheck","id","columns","field","headerName","flex","minWidth","valueGetter","_value","orderLabel","source","renderCell","size","color","variant","type","valueFormatter","value","sortable","filterable","hideable","disableColumnMenu","reservationId","disabled","onClick","rainCheck","$id","exportCsv","blob","Blob","text","href","URL","createObjectURL","link","document","createElement","download","click","window","setTimeout","revokeObjectURL","header","help","HeaderProps","direction","spacing","contentGutterX","contentGutterY","severity","dateAdapter","xs","sm","sx","alignItems","onChange","slotProps","textField","component","exclusive","aria-labelledby","stayCheckIn","_event","flexWrap","choice","truncated","rowGap","String","rainChecks","aria-label","noRowsLabel","onClose","onDone","fallback","PosCheckInsCard","firestore","registers","idField","length","feature","upsell","displayName"],"mappings":"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"}
|
|
@@ -25,6 +25,15 @@ export interface PosOperationsBarProps {
|
|
|
25
25
|
email: string | null;
|
|
26
26
|
name: string | null;
|
|
27
27
|
}) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Why a control is not this member's (AGL-4047), by the register key it
|
|
30
|
+
* needs: returns (`posRefund`) and the shift and drawer (`posCashDrawer`).
|
|
31
|
+
* Each stays on screen, disabled with its reason. Absent: allowed.
|
|
32
|
+
*/
|
|
33
|
+
blocked?: {
|
|
34
|
+
returns?: string;
|
|
35
|
+
shift?: string;
|
|
36
|
+
};
|
|
28
37
|
}
|
|
29
38
|
/**
|
|
30
39
|
* The register's operations strip (AGL-3609): who is ringing (and a PIN
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/ 'use client';
|
|
17
17
|
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
18
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
import { BlockedControl } from "@aglyn/shared-ui-jsx/components/blocked-control.component";
|
|
19
20
|
import { Box, Button, Chip, Stack, Typography } from "@mui/material";
|
|
20
21
|
import { useState } from "react";
|
|
21
22
|
import { PosCheckInDialog } from "./pos-check-in-dialog.component.js";
|
|
@@ -28,6 +29,8 @@ import { PosShiftPanel } from "./pos-shift-panel.component.js";
|
|
|
28
29
|
* (AGL-4043), returns, and the lock. Sits
|
|
29
30
|
* above the basket; every control is a tablet-sized button.
|
|
30
31
|
*/ export function PosOperationsBar(props) {
|
|
32
|
+
var _ref;
|
|
33
|
+
var _props_blocked, _props_blocked1, _props_blocked2;
|
|
31
34
|
const { hostId, registerId, cashier } = props;
|
|
32
35
|
const [switching, setSwitching] = useState(false);
|
|
33
36
|
const [returning, setReturning] = useState(false);
|
|
@@ -74,12 +77,16 @@ import { PosShiftPanel } from "./pos-shift-panel.component.js";
|
|
|
74
77
|
onClick: ()=>setCheckingIn(true),
|
|
75
78
|
children: 'Check in'
|
|
76
79
|
}),
|
|
77
|
-
/*#__PURE__*/ _jsx(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
/*#__PURE__*/ _jsx(BlockedControl, {
|
|
81
|
+
blocked: Boolean((_props_blocked = props.blocked) == null ? void 0 : _props_blocked.returns),
|
|
82
|
+
reason: (_ref = (_props_blocked1 = props.blocked) == null ? void 0 : _props_blocked1.returns) != null ? _ref : '',
|
|
83
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
84
|
+
size: "small",
|
|
85
|
+
variant: "outlined",
|
|
86
|
+
onClick: ()=>setReturning(true),
|
|
87
|
+
disabled: !registerId,
|
|
88
|
+
children: 'Return'
|
|
89
|
+
})
|
|
83
90
|
})
|
|
84
91
|
]
|
|
85
92
|
}),
|
|
@@ -90,6 +97,8 @@ import { PosShiftPanel } from "./pos-shift-panel.component.js";
|
|
|
90
97
|
registerName: props.registerName
|
|
91
98
|
} : {}, cashier.assertion ? {
|
|
92
99
|
cashierAssertion: cashier.assertion
|
|
100
|
+
} : {}, ((_props_blocked2 = props.blocked) == null ? void 0 : _props_blocked2.shift) ? {
|
|
101
|
+
blocked: props.blocked.shift
|
|
93
102
|
} : {})) : null,
|
|
94
103
|
/*#__PURE__*/ _jsx(PosPinPad, {
|
|
95
104
|
open: switching,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-operations-bar.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\nimport { Box, Button, Chip, Stack, Typography } from '@mui/material'\nimport { useState } from 'react'\nimport { PosCheckInDialog } from './pos-check-in-dialog.component'\nimport { PosPinPad } from './pos-pin-pad.component'\nimport { PosReturnDialog } from './pos-return-dialog.component'\nimport { PosShiftPanel } from './pos-shift-panel.component'\nimport type { PosCashierState } from './use-pos-cashier'\n\nexport interface PosOperationsBarProps {\n hostId: string\n registerId: string\n registerName?: string\n cashier: PosCashierState\n /** Ring the exchange after a return: a new sale for the same customer. */\n onExchange?: (customer: { email: string | null; name: string | null }) => void\n}\n\n/**\n * The register's operations strip (AGL-3609): who is ringing (and a PIN\n * switch to someone else), the shift and drawer, check-in at the window\n * (AGL-4043), returns, and the lock. Sits\n * above the basket; every control is a tablet-sized button.\n */\nexport function PosOperationsBar(props: PosOperationsBarProps) {\n const { hostId, registerId, cashier } = props\n const [switching, setSwitching] = useState(false)\n const [returning, setReturning] = useState(false)\n const [checkingIn, setCheckingIn] = useState(false)\n return (\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={cashier.cashier ? `Cashier: ${cashier.cashier.name}` : 'Cashier: you'}\n {...(cashier.cashier ? { onDelete: cashier.signOutCashier } : {})}\n />\n <Button size=\"small\" onClick={() => setSwitching(true)} disabled={!registerId}>\n {'Switch cashier'}\n </Button>\n <Button size=\"small\" onClick={cashier.lock} disabled={!registerId}>\n {'Lock'}\n </Button>\n <Box sx={{ flex: 1 }} />\n <Button size=\"small\" variant=\"outlined\" onClick={() => setCheckingIn(true)}>\n {'Check in'}\n </Button>\n <Button size=\"small\" variant=\"outlined\" onClick={() => setReturning(true)} disabled={!registerId}>\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-operations-bar.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\nimport { BlockedControl } from '@aglyn/shared-ui-jsx/components/blocked-control.component'\nimport { Box, Button, Chip, Stack, Typography } from '@mui/material'\nimport { useState } from 'react'\nimport { PosCheckInDialog } from './pos-check-in-dialog.component'\nimport { PosPinPad } from './pos-pin-pad.component'\nimport { PosReturnDialog } from './pos-return-dialog.component'\nimport { PosShiftPanel } from './pos-shift-panel.component'\nimport type { PosCashierState } from './use-pos-cashier'\n\nexport interface PosOperationsBarProps {\n hostId: string\n registerId: string\n registerName?: string\n cashier: PosCashierState\n /** Ring the exchange after a return: a new sale for the same customer. */\n onExchange?: (customer: { email: string | null; name: string | null }) => void\n /**\n * Why a control is not this member's (AGL-4047), by the register key it\n * needs: returns (`posRefund`) and the shift and drawer (`posCashDrawer`).\n * Each stays on screen, disabled with its reason. Absent: allowed.\n */\n blocked?: { returns?: string; shift?: string }\n}\n\n/**\n * The register's operations strip (AGL-3609): who is ringing (and a PIN\n * switch to someone else), the shift and drawer, check-in at the window\n * (AGL-4043), returns, and the lock. Sits\n * above the basket; every control is a tablet-sized button.\n */\nexport function PosOperationsBar(props: PosOperationsBarProps) {\n const { hostId, registerId, cashier } = props\n const [switching, setSwitching] = useState(false)\n const [returning, setReturning] = useState(false)\n const [checkingIn, setCheckingIn] = useState(false)\n return (\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={cashier.cashier ? `Cashier: ${cashier.cashier.name}` : 'Cashier: you'}\n {...(cashier.cashier ? { onDelete: cashier.signOutCashier } : {})}\n />\n <Button size=\"small\" onClick={() => setSwitching(true)} disabled={!registerId}>\n {'Switch cashier'}\n </Button>\n <Button size=\"small\" onClick={cashier.lock} disabled={!registerId}>\n {'Lock'}\n </Button>\n <Box sx={{ flex: 1 }} />\n <Button size=\"small\" variant=\"outlined\" onClick={() => setCheckingIn(true)}>\n {'Check in'}\n </Button>\n <BlockedControl blocked={Boolean(props.blocked?.returns)} reason={props.blocked?.returns ?? ''}>\n <Button size=\"small\" variant=\"outlined\" onClick={() => setReturning(true)} disabled={!registerId}>\n {'Return'}\n </Button>\n </BlockedControl>\n </Stack>\n {registerId ? (\n <PosShiftPanel\n hostId={hostId}\n registerId={registerId}\n {...(props.registerName ? { registerName: props.registerName } : {})}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n {...(props.blocked?.shift ? { blocked: props.blocked.shift } : {})}\n />\n ) : null}\n <PosPinPad\n open={switching}\n hostId={hostId}\n registerId={registerId}\n purpose=\"cashier\"\n onClose={() => setSwitching(false)}\n onVerified={(assertion) => {\n cashier.switchTo(assertion)\n setSwitching(false)\n }}\n />\n <PosPinPad\n open={cashier.locked}\n hostId={hostId}\n registerId={registerId}\n purpose=\"cashier\"\n title=\"Register locked\"\n prompt=\"Enter your PIN to use the register.\"\n dismissible={false}\n onClose={cashier.unlock}\n onVerified={cashier.switchTo}\n />\n <PosCheckInDialog\n open={checkingIn}\n hostId={hostId}\n {...(registerId ? { registerId } : {})}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n onClose={() => setCheckingIn(false)}\n />\n <PosReturnDialog\n open={returning}\n hostId={hostId}\n registerId={registerId}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n onClose={() => setReturning(false)}\n {...(props.onExchange ? { onExchange: props.onExchange } : {})}\n />\n {cashier.locked ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Locked'}\n </Typography>\n ) : null}\n </Stack>\n )\n}\n\nPosOperationsBar.displayName = 'PosOperationsBar'\n\nexport default PosOperationsBar\n"],"names":["BlockedControl","Box","Button","Chip","Stack","Typography","useState","PosCheckInDialog","PosPinPad","PosReturnDialog","PosShiftPanel","PosOperationsBar","props","hostId","registerId","cashier","switching","setSwitching","returning","setReturning","checkingIn","setCheckingIn","spacing","direction","useFlexGap","sx","alignItems","flexWrap","size","variant","label","name","onDelete","signOutCashier","onClick","disabled","lock","flex","blocked","Boolean","returns","reason","registerName","assertion","cashierAssertion","shift","open","purpose","onClose","onVerified","switchTo","locked","title","prompt","dismissible","unlock","onExchange","color","displayName"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;AAEA,SAASA,cAAc,QAAQ,4DAA2D;AAC1F,SAASC,GAAG,EAAEC,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,UAAU,QAAQ,gBAAe;AACpE,SAASC,QAAQ,QAAQ,QAAO;AAChC,SAASC,gBAAgB,QAAQ,qCAAiC;AAClE,SAASC,SAAS,QAAQ,6BAAyB;AACnD,SAASC,eAAe,QAAQ,mCAA+B;AAC/D,SAASC,aAAa,QAAQ,iCAA6B;AAkB3D;;;;;CAKC,GACD,OAAO,SAASC,iBAAiBC,KAA4B;;QAwBpBA,gBAAiCA,iBAY3DA;IAnCb,MAAM,EAAEC,MAAM,EAAEC,UAAU,EAAEC,OAAO,EAAE,GAAGH;IACxC,MAAM,CAACI,WAAWC,aAAa,GAAGX,SAAS;IAC3C,MAAM,CAACY,WAAWC,aAAa,GAAGb,SAAS;IAC3C,MAAM,CAACc,YAAYC,cAAc,GAAGf,SAAS;IAC7C,qBACE,MAACF;QAAMkB,SAAS;;0BACd,MAAClB;gBAAMmB,WAAU;gBAAMD,SAAS;gBAAGE,UAAU;gBAACC,IAAI;oBAAEC,YAAY;oBAAUC,UAAU;gBAAO;;kCACzF,KAACxB;wBACCyB,MAAK;wBACLC,SAAQ;wBACRC,OAAOf,QAAQA,OAAO,GAAG,CAAC,SAAS,EAAEA,QAAQA,OAAO,CAACgB,IAAI,EAAE,GAAG;uBACzDhB,QAAQA,OAAO,GAAG;wBAAEiB,UAAUjB,QAAQkB,cAAc;oBAAC,IAAI,CAAC;kCAEjE,KAAC/B;wBAAO0B,MAAK;wBAAQM,SAAS,IAAMjB,aAAa;wBAAOkB,UAAU,CAACrB;kCAChE;;kCAEH,KAACZ;wBAAO0B,MAAK;wBAAQM,SAASnB,QAAQqB,IAAI;wBAAED,UAAU,CAACrB;kCACpD;;kCAEH,KAACb;wBAAIwB,IAAI;4BAAEY,MAAM;wBAAE;;kCACnB,KAACnC;wBAAO0B,MAAK;wBAAQC,SAAQ;wBAAWK,SAAS,IAAMb,cAAc;kCAClE;;kCAEH,KAACrB;wBAAesC,SAASC,SAAQ3B,iBAAAA,MAAM0B,OAAO,qBAAb1B,eAAe4B,OAAO;wBAAGC,MAAM,WAAE7B,kBAAAA,MAAM0B,OAAO,qBAAb1B,gBAAe4B,OAAO,mBAAI;kCAC1F,cAAA,KAACtC;4BAAO0B,MAAK;4BAAQC,SAAQ;4BAAWK,SAAS,IAAMf,aAAa;4BAAOgB,UAAU,CAACrB;sCACnF;;;;;YAINA,2BACC,KAACJ;gBACCG,QAAQA;gBACRC,YAAYA;eACPF,MAAM8B,YAAY,GAAG;gBAAEA,cAAc9B,MAAM8B,YAAY;YAAC,IAAI,CAAC,GAC7D3B,QAAQ4B,SAAS,GAAG;gBAAEC,kBAAkB7B,QAAQ4B,SAAS;YAAC,IAAI,CAAC,GAC/D/B,EAAAA,kBAAAA,MAAM0B,OAAO,qBAAb1B,gBAAeiC,KAAK,IAAG;gBAAEP,SAAS1B,MAAM0B,OAAO,CAACO,KAAK;YAAC,IAAI,CAAC,MAEhE;0BACJ,KAACrC;gBACCsC,MAAM9B;gBACNH,QAAQA;gBACRC,YAAYA;gBACZiC,SAAQ;gBACRC,SAAS,IAAM/B,aAAa;gBAC5BgC,YAAY,CAACN;oBACX5B,QAAQmC,QAAQ,CAACP;oBACjB1B,aAAa;gBACf;;0BAEF,KAACT;gBACCsC,MAAM/B,QAAQoC,MAAM;gBACpBtC,QAAQA;gBACRC,YAAYA;gBACZiC,SAAQ;gBACRK,OAAM;gBACNC,QAAO;gBACPC,aAAa;gBACbN,SAASjC,QAAQwC,MAAM;gBACvBN,YAAYlC,QAAQmC,QAAQ;;0BAE9B,KAAC3C;gBACCuC,MAAM1B;gBACNP,QAAQA;eACHC,aAAa;gBAAEA;YAAW,IAAI,CAAC,GAC/BC,QAAQ4B,SAAS,GAAG;gBAAEC,kBAAkB7B,QAAQ4B,SAAS;YAAC,IAAI,CAAC;gBACpEK,SAAS,IAAM3B,cAAc;;0BAE/B,KAACZ;gBACCqC,MAAM5B;gBACNL,QAAQA;gBACRC,YAAYA;eACPC,QAAQ4B,SAAS,GAAG;gBAAEC,kBAAkB7B,QAAQ4B,SAAS;YAAC,IAAI,CAAC;gBACpEK,SAAS,IAAM7B,aAAa;eACvBP,MAAM4C,UAAU,GAAG;gBAAEA,YAAY5C,MAAM4C,UAAU;YAAC,IAAI,CAAC;YAE7DzC,QAAQoC,MAAM,iBACb,KAAC9C;gBAAWwB,SAAQ;gBAAU4B,OAAM;0BACjC;iBAED;;;AAGV;AAEA9C,iBAAiB+C,WAAW,GAAG;AAE/B,eAAe/C,iBAAgB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type CheckInRow } from '../../../model/commerce-check-in';
|
|
2
|
+
export interface PosRainCheckDialogProps {
|
|
3
|
+
/** The pass to rain-check; the dialog is open while it is set. */
|
|
4
|
+
row: CheckInRow | null;
|
|
5
|
+
hostId: string;
|
|
6
|
+
/** Today on the store's calendar. */
|
|
7
|
+
todayKey: string;
|
|
8
|
+
/** The register it is given at, so a PIN's cashier is who gave it. */
|
|
9
|
+
registerId?: string;
|
|
10
|
+
cashierAssertion?: string;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
/** The pass as the route left it. */
|
|
13
|
+
onDone: (row: CheckInRow) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A rain check on one pass (AGL-4043): leave it open, good on any later day
|
|
17
|
+
* until it is used, or move it to a day staff pick. Through the check-in
|
|
18
|
+
* route's `rain_check` action, gated as checking in is; the route records
|
|
19
|
+
* who gave it, when, and the day it was on.
|
|
20
|
+
*/
|
|
21
|
+
export declare function PosRainCheckDialog(props: PosRainCheckDialogProps): import("react").JSX.Element;
|
|
22
|
+
export declare namespace PosRainCheckDialog {
|
|
23
|
+
var displayName: string;
|
|
24
|
+
}
|
|
25
|
+
export default PosRainCheckDialog;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ 'use client';
|
|
17
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControlLabel, Radio, RadioGroup, Stack, Typography } from "@mui/material";
|
|
20
|
+
import { useUser } from "@aglyn/tenant-feature-instance";
|
|
21
|
+
import { useEffect, useState } from "react";
|
|
22
|
+
import { checkInDayLabel, checkInItemLabel } from "../../../model/commerce-check-in.js";
|
|
23
|
+
import { UseDayPicker } from "../../use-day-picker.js";
|
|
24
|
+
import { callPosOps } from "./pos-ops-api.js";
|
|
25
|
+
/**
|
|
26
|
+
* A rain check on one pass (AGL-4043): leave it open, good on any later day
|
|
27
|
+
* until it is used, or move it to a day staff pick. Through the check-in
|
|
28
|
+
* route's `rain_check` action, gated as checking in is; the route records
|
|
29
|
+
* who gave it, when, and the day it was on.
|
|
30
|
+
*/ export function PosRainCheckDialog(props) {
|
|
31
|
+
const { row, hostId, todayKey, registerId, cashierAssertion, onClose, onDone } = props;
|
|
32
|
+
const { data: user } = useUser();
|
|
33
|
+
const [kind, setKind] = useState('open');
|
|
34
|
+
const [day, setDay] = useState('');
|
|
35
|
+
const [busy, setBusy] = useState(false);
|
|
36
|
+
const [error, setError] = useState('');
|
|
37
|
+
useEffect(()=>{
|
|
38
|
+
setKind('open');
|
|
39
|
+
setDay('');
|
|
40
|
+
setError('');
|
|
41
|
+
}, [
|
|
42
|
+
row == null ? void 0 : row.id
|
|
43
|
+
]);
|
|
44
|
+
const give = async ()=>{
|
|
45
|
+
var _answer_body_error;
|
|
46
|
+
if (!row) return;
|
|
47
|
+
setBusy(true);
|
|
48
|
+
setError('');
|
|
49
|
+
const answer = await callPosOps(user, 'pos-check-in', _extends({
|
|
50
|
+
hostId,
|
|
51
|
+
action: 'rain_check',
|
|
52
|
+
id: row.id,
|
|
53
|
+
kind
|
|
54
|
+
}, kind === 'date' ? {
|
|
55
|
+
day
|
|
56
|
+
} : {}, registerId ? {
|
|
57
|
+
registerId
|
|
58
|
+
} : {}, cashierAssertion ? {
|
|
59
|
+
cashierAssertion
|
|
60
|
+
} : {}));
|
|
61
|
+
setBusy(false);
|
|
62
|
+
if (!answer.ok || !answer.body.checkIn) return setError((_answer_body_error = answer.body.error) != null ? _answer_body_error : 'The rain check was not given.');
|
|
63
|
+
onDone(answer.body.checkIn);
|
|
64
|
+
};
|
|
65
|
+
return /*#__PURE__*/ _jsxs(Dialog, {
|
|
66
|
+
open: Boolean(row),
|
|
67
|
+
onClose: onClose,
|
|
68
|
+
maxWidth: "xs",
|
|
69
|
+
fullWidth: true,
|
|
70
|
+
children: [
|
|
71
|
+
/*#__PURE__*/ _jsx(DialogTitle, {
|
|
72
|
+
children: 'Rain check'
|
|
73
|
+
}),
|
|
74
|
+
/*#__PURE__*/ _jsx(DialogContent, {
|
|
75
|
+
children: row ? /*#__PURE__*/ _jsxs(Stack, {
|
|
76
|
+
spacing: 2,
|
|
77
|
+
sx: {
|
|
78
|
+
pt: 1
|
|
79
|
+
},
|
|
80
|
+
children: [
|
|
81
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
82
|
+
variant: "body2",
|
|
83
|
+
color: "text.secondary",
|
|
84
|
+
children: `${row.customerName || row.customerEmail || 'Customer'} · ${checkInItemLabel(row)} · ${checkInDayLabel(row.dayKey)}`
|
|
85
|
+
}),
|
|
86
|
+
/*#__PURE__*/ _jsxs(RadioGroup, {
|
|
87
|
+
value: kind,
|
|
88
|
+
onChange: (event)=>setKind(event.target.value === 'date' ? 'date' : 'open'),
|
|
89
|
+
children: [
|
|
90
|
+
/*#__PURE__*/ _jsx(FormControlLabel, {
|
|
91
|
+
value: "open",
|
|
92
|
+
control: /*#__PURE__*/ _jsx(Radio, {}),
|
|
93
|
+
label: "Open: good on any later day until it is used"
|
|
94
|
+
}),
|
|
95
|
+
/*#__PURE__*/ _jsx(FormControlLabel, {
|
|
96
|
+
value: "date",
|
|
97
|
+
control: /*#__PURE__*/ _jsx(Radio, {}),
|
|
98
|
+
label: "Move it to a day"
|
|
99
|
+
})
|
|
100
|
+
]
|
|
101
|
+
}),
|
|
102
|
+
kind === 'date' ? /*#__PURE__*/ _jsx(UseDayPicker, {
|
|
103
|
+
value: day,
|
|
104
|
+
onChange: setDay,
|
|
105
|
+
todayKey: todayKey,
|
|
106
|
+
afterKey: row.dayKey,
|
|
107
|
+
label: "New day"
|
|
108
|
+
}) : null,
|
|
109
|
+
error ? /*#__PURE__*/ _jsx(Alert, {
|
|
110
|
+
severity: "warning",
|
|
111
|
+
children: error
|
|
112
|
+
}) : null
|
|
113
|
+
]
|
|
114
|
+
}) : null
|
|
115
|
+
}),
|
|
116
|
+
/*#__PURE__*/ _jsxs(DialogActions, {
|
|
117
|
+
children: [
|
|
118
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
119
|
+
onClick: onClose,
|
|
120
|
+
children: 'Cancel'
|
|
121
|
+
}),
|
|
122
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
123
|
+
variant: "contained",
|
|
124
|
+
disabled: busy || kind === 'date' && !day,
|
|
125
|
+
onClick: ()=>void give(),
|
|
126
|
+
children: 'Give rain check'
|
|
127
|
+
})
|
|
128
|
+
]
|
|
129
|
+
})
|
|
130
|
+
]
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
PosRainCheckDialog.displayName = 'PosRainCheckDialog';
|
|
134
|
+
export default PosRainCheckDialog;
|
|
135
|
+
|
|
136
|
+
//# sourceMappingURL=pos-rain-check-dialog.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n Alert,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n Radio,\n RadioGroup,\n Stack,\n Typography,\n} from '@mui/material'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { useEffect, useState } from 'react'\nimport {\n checkInDayLabel,\n checkInItemLabel,\n type CheckInRow,\n} from '../../../model/commerce-check-in'\nimport { UseDayPicker } from '../../use-day-picker'\nimport { callPosOps } from './pos-ops-api'\n\nexport interface PosRainCheckDialogProps {\n /** The pass to rain-check; the dialog is open while it is set. */\n row: CheckInRow | null\n hostId: string\n /** Today on the store's calendar. */\n todayKey: string\n /** The register it is given at, so a PIN's cashier is who gave it. */\n registerId?: string\n cashierAssertion?: string\n onClose: () => void\n /** The pass as the route left it. */\n onDone: (row: CheckInRow) => void\n}\n\n/**\n * A rain check on one pass (AGL-4043): leave it open, good on any later day\n * until it is used, or move it to a day staff pick. Through the check-in\n * route's `rain_check` action, gated as checking in is; the route records\n * who gave it, when, and the day it was on.\n */\nexport function PosRainCheckDialog(props: PosRainCheckDialogProps) {\n const { row, hostId, todayKey, registerId, cashierAssertion, onClose, onDone } = props\n const { data: user } = useUser()\n const [kind, setKind] = useState<'open' | 'date'>('open')\n const [day, setDay] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n useEffect(() => {\n setKind('open')\n setDay('')\n setError('')\n }, [row?.id])\n\n const give = async () => {\n if (!row) return\n setBusy(true)\n setError('')\n const answer = await callPosOps<{ checkIn?: CheckInRow }>(user, 'pos-check-in', {\n hostId,\n action: 'rain_check',\n id: row.id,\n kind,\n ...(kind === 'date' ? { day } : {}),\n ...(registerId ? { registerId } : {}),\n ...(cashierAssertion ? { cashierAssertion } : {}),\n })\n setBusy(false)\n if (!answer.ok || !answer.body.checkIn) return setError(answer.body.error ?? 'The rain check was not given.')\n onDone(answer.body.checkIn)\n }\n\n return (\n <Dialog open={Boolean(row)} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Rain check'}</DialogTitle>\n <DialogContent>\n {row ? (\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${row.customerName || row.customerEmail || 'Customer'} · ${checkInItemLabel(row)} · ${checkInDayLabel(row.dayKey)}`}\n </Typography>\n <RadioGroup value={kind} onChange={(event) => setKind(event.target.value === 'date' ? 'date' : 'open')}>\n <FormControlLabel value=\"open\" control={<Radio />} label=\"Open: good on any later day until it is used\" />\n <FormControlLabel value=\"date\" control={<Radio />} label=\"Move it to a day\" />\n </RadioGroup>\n {kind === 'date' ? (\n <UseDayPicker\n value={day}\n onChange={setDay}\n todayKey={todayKey}\n afterKey={row.dayKey}\n label=\"New day\"\n />\n ) : null}\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy || (kind === 'date' && !day)} onClick={() => void give()}>\n {'Give rain check'}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nPosRainCheckDialog.displayName = 'PosRainCheckDialog'\n\nexport default PosRainCheckDialog\n"],"names":["Alert","Button","Dialog","DialogActions","DialogContent","DialogTitle","FormControlLabel","Radio","RadioGroup","Stack","Typography","useUser","useEffect","useState","checkInDayLabel","checkInItemLabel","UseDayPicker","callPosOps","PosRainCheckDialog","props","row","hostId","todayKey","registerId","cashierAssertion","onClose","onDone","data","user","kind","setKind","day","setDay","busy","setBusy","error","setError","id","give","answer","action","ok","body","checkIn","open","Boolean","maxWidth","fullWidth","spacing","sx","pt","variant","color","customerName","customerEmail","dayKey","value","onChange","event","target","control","label","afterKey","severity","onClick","disabled","displayName"],"mappings":"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"}
|
|
@@ -20,6 +20,12 @@ export interface PosShiftPanelProps {
|
|
|
20
20
|
registerName?: string;
|
|
21
21
|
/** The PIN-switched cashier's assertion, so the shift names them. */
|
|
22
22
|
cashierAssertion?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Why this member may not run the drawer (AGL-4047): the "Cash drawer and
|
|
25
|
+
* shifts" key refused. The shift still shows; its buttons are disabled
|
|
26
|
+
* with this reason. Absent: allowed.
|
|
27
|
+
*/
|
|
28
|
+
blocked?: string;
|
|
23
29
|
}
|
|
24
30
|
/**
|
|
25
31
|
* The register's shift (AGL-3609): open it with a starting float, record cash
|
|
@@ -20,6 +20,7 @@ import { Alert, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle,
|
|
|
20
20
|
import { doc } from "firebase/firestore";
|
|
21
21
|
import { useFirestore, useFirestoreDoc, useUser } from "@aglyn/tenant-feature-instance";
|
|
22
22
|
import { useSnackbar } from "@aglyn/shared-ui-snackstack";
|
|
23
|
+
import { BlockedControl } from "@aglyn/shared-ui-jsx/components/blocked-control.component";
|
|
23
24
|
import { useCallback, useState } from "react";
|
|
24
25
|
import { POS_CASH_EVENT_LABELS, posCashVarianceCents, posMoney } from "../../../model/commerce-pos-ops.js";
|
|
25
26
|
import { callPosOps, newPosAttemptKey, parsePosDollars } from "./pos-ops-api.js";
|
|
@@ -31,7 +32,7 @@ import { PosShiftReportView, posShiftReportDocument, printPosDocument } from "./
|
|
|
31
32
|
* and close with a count — the Z report freezes the figures and the variance.
|
|
32
33
|
* Live: a shift another tablet opens on this register shows here at once.
|
|
33
34
|
*/ export function PosShiftPanel(props) {
|
|
34
|
-
var _ref;
|
|
35
|
+
var _ref, _props_blocked, _props_blocked1, _props_blocked2, _props_blocked3;
|
|
35
36
|
const { hostId, registerId, cashierAssertion } = props;
|
|
36
37
|
const firestore = useFirestore();
|
|
37
38
|
const { data: user } = useUser();
|
|
@@ -197,32 +198,44 @@ import { PosShiftReportView, posShiftReportDocument, printPosDocument } from "./
|
|
|
197
198
|
minute: '2-digit'
|
|
198
199
|
})}`
|
|
199
200
|
}),
|
|
200
|
-
/*#__PURE__*/ _jsx(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
201
|
+
/*#__PURE__*/ _jsx(BlockedControl, {
|
|
202
|
+
blocked: Boolean(props.blocked),
|
|
203
|
+
reason: (_props_blocked = props.blocked) != null ? _props_blocked : '',
|
|
204
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
205
|
+
size: "small",
|
|
206
|
+
onClick: ()=>{
|
|
207
|
+
setEventKey(newPosAttemptKey());
|
|
208
|
+
setDialog('cash');
|
|
209
|
+
},
|
|
210
|
+
children: 'Cash in/out'
|
|
211
|
+
})
|
|
207
212
|
}),
|
|
208
|
-
/*#__PURE__*/ _jsx(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
213
|
+
/*#__PURE__*/ _jsx(BlockedControl, {
|
|
214
|
+
blocked: Boolean(props.blocked),
|
|
215
|
+
reason: (_props_blocked1 = props.blocked) != null ? _props_blocked1 : '',
|
|
216
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
217
|
+
size: "small",
|
|
218
|
+
onClick: ()=>{
|
|
219
|
+
setReport(null);
|
|
220
|
+
setDialog('report');
|
|
221
|
+
void loadReport();
|
|
222
|
+
},
|
|
223
|
+
children: 'X report'
|
|
224
|
+
})
|
|
216
225
|
}),
|
|
217
|
-
/*#__PURE__*/ _jsx(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
+
/*#__PURE__*/ _jsx(BlockedControl, {
|
|
227
|
+
blocked: Boolean(props.blocked),
|
|
228
|
+
reason: (_props_blocked2 = props.blocked) != null ? _props_blocked2 : '',
|
|
229
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
230
|
+
size: "small",
|
|
231
|
+
color: "warning",
|
|
232
|
+
onClick: ()=>{
|
|
233
|
+
setReport(null);
|
|
234
|
+
setDialog('close');
|
|
235
|
+
void loadReport();
|
|
236
|
+
},
|
|
237
|
+
children: 'Close shift'
|
|
238
|
+
})
|
|
226
239
|
})
|
|
227
240
|
]
|
|
228
241
|
}) : /*#__PURE__*/ _jsxs(_Fragment, {
|
|
@@ -231,12 +244,16 @@ import { PosShiftReportView, posShiftReportDocument, printPosDocument } from "./
|
|
|
231
244
|
size: "small",
|
|
232
245
|
label: "No shift open"
|
|
233
246
|
}),
|
|
234
|
-
/*#__PURE__*/ _jsx(
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
247
|
+
/*#__PURE__*/ _jsx(BlockedControl, {
|
|
248
|
+
blocked: Boolean(props.blocked),
|
|
249
|
+
reason: (_props_blocked3 = props.blocked) != null ? _props_blocked3 : '',
|
|
250
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
251
|
+
size: "small",
|
|
252
|
+
variant: "outlined",
|
|
253
|
+
onClick: ()=>setDialog('open'),
|
|
254
|
+
disabled: !registerId,
|
|
255
|
+
children: 'Open shift'
|
|
256
|
+
})
|
|
240
257
|
})
|
|
241
258
|
]
|
|
242
259
|
})
|