@aglyn/plugins-commerce 1.0.0-beta.143
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/LICENSE +201 -0
- package/README.md +10 -0
- package/package.json +57 -0
- package/src/index.d.ts +38 -0
- package/src/index.js +38 -0
- package/src/index.js.map +1 -0
- package/src/lib/components/account.d.ts +31 -0
- package/src/lib/components/account.js +645 -0
- package/src/lib/components/account.js.map +1 -0
- package/src/lib/components/cart.d.ts +38 -0
- package/src/lib/components/cart.js +851 -0
- package/src/lib/components/cart.js.map +1 -0
- package/src/lib/components/commerce-console-page.d.ts +32 -0
- package/src/lib/components/commerce-console-page.js +296 -0
- package/src/lib/components/commerce-console-page.js.map +1 -0
- package/src/lib/components/commerce-console-sections.d.ts +34 -0
- package/src/lib/components/commerce-console-sections.js +62 -0
- package/src/lib/components/commerce-console-sections.js.map +1 -0
- package/src/lib/components/console/catalog-organization-card.component.d.ts +14 -0
- package/src/lib/components/console/catalog-organization-card.component.js +1087 -0
- package/src/lib/components/console/catalog-organization-card.component.js.map +1 -0
- package/src/lib/components/console/commerce-analytics-card.component.d.ts +27 -0
- package/src/lib/components/console/commerce-analytics-card.component.js +310 -0
- package/src/lib/components/console/commerce-analytics-card.component.js.map +1 -0
- package/src/lib/components/console/commerce-glance-card.component.d.ts +20 -0
- package/src/lib/components/console/commerce-glance-card.component.js +340 -0
- package/src/lib/components/console/commerce-glance-card.component.js.map +1 -0
- package/src/lib/components/console/commerce-stat-tile.component.d.ts +37 -0
- package/src/lib/components/console/commerce-stat-tile.component.js +72 -0
- package/src/lib/components/console/commerce-stat-tile.component.js.map +1 -0
- package/src/lib/components/console/discounts-card.component.d.ts +14 -0
- package/src/lib/components/console/discounts-card.component.js +443 -0
- package/src/lib/components/console/discounts-card.component.js.map +1 -0
- package/src/lib/components/console/entitlement-gate.component.d.ts +76 -0
- package/src/lib/components/console/entitlement-gate.component.js +115 -0
- package/src/lib/components/console/entitlement-gate.component.js.map +1 -0
- package/src/lib/components/console/gift-cards-card.component.d.ts +29 -0
- package/src/lib/components/console/gift-cards-card.component.js +379 -0
- package/src/lib/components/console/gift-cards-card.component.js.map +1 -0
- package/src/lib/components/console/host-coupons-card.component.d.ts +14 -0
- package/src/lib/components/console/host-coupons-card.component.js +252 -0
- package/src/lib/components/console/host-coupons-card.component.js.map +1 -0
- package/src/lib/components/console/host-orders-card.component.d.ts +13 -0
- package/src/lib/components/console/host-orders-card.component.js +861 -0
- package/src/lib/components/console/host-orders-card.component.js.map +1 -0
- package/src/lib/components/console/locations-card.component.d.ts +14 -0
- package/src/lib/components/console/locations-card.component.js +256 -0
- package/src/lib/components/console/locations-card.component.js.map +1 -0
- package/src/lib/components/console/member-posts-card.component.d.ts +8 -0
- package/src/lib/components/console/member-posts-card.component.js +283 -0
- package/src/lib/components/console/member-posts-card.component.js.map +1 -0
- package/src/lib/components/console/newest-site-users-card.component.d.ts +36 -0
- package/src/lib/components/console/newest-site-users-card.component.js +126 -0
- package/src/lib/components/console/newest-site-users-card.component.js.map +1 -0
- package/src/lib/components/console/order-detail-dialog.component.d.ts +28 -0
- package/src/lib/components/console/order-detail-dialog.component.js +976 -0
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -0
- package/src/lib/components/console/paid-media.d.ts +127 -0
- package/src/lib/components/console/paid-media.js +397 -0
- package/src/lib/components/console/paid-media.js.map +1 -0
- package/src/lib/components/console/payments-settings-card.component.d.ts +13 -0
- package/src/lib/components/console/payments-settings-card.component.js +295 -0
- package/src/lib/components/console/payments-settings-card.component.js.map +1 -0
- package/src/lib/components/console/pos-page.component.d.ts +13 -0
- package/src/lib/components/console/pos-page.component.js +916 -0
- package/src/lib/components/console/pos-page.component.js.map +1 -0
- package/src/lib/components/console/product-editor-dialog.component.d.ts +32 -0
- package/src/lib/components/console/product-editor-dialog.component.js +1374 -0
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -0
- package/src/lib/components/console/products-hub-card.component.d.ts +16 -0
- package/src/lib/components/console/products-hub-card.component.js +1280 -0
- package/src/lib/components/console/products-hub-card.component.js.map +1 -0
- package/src/lib/components/console/products-hub-zone.component.d.ts +50 -0
- package/src/lib/components/console/products-hub-zone.component.js +200 -0
- package/src/lib/components/console/products-hub-zone.component.js.map +1 -0
- package/src/lib/components/console/recovery-queue-card.component.d.ts +39 -0
- package/src/lib/components/console/recovery-queue-card.component.js +262 -0
- package/src/lib/components/console/recovery-queue-card.component.js.map +1 -0
- package/src/lib/components/console/registers-card.component.d.ts +21 -0
- package/src/lib/components/console/registers-card.component.js +296 -0
- package/src/lib/components/console/registers-card.component.js.map +1 -0
- package/src/lib/components/console/reservations-card.component.d.ts +14 -0
- package/src/lib/components/console/reservations-card.component.js +650 -0
- package/src/lib/components/console/reservations-card.component.js.map +1 -0
- package/src/lib/components/console/reviews-moderation-card.component.d.ts +8 -0
- package/src/lib/components/console/reviews-moderation-card.component.js +235 -0
- package/src/lib/components/console/reviews-moderation-card.component.js.map +1 -0
- package/src/lib/components/console/shipping-settings-card.component.d.ts +38 -0
- package/src/lib/components/console/shipping-settings-card.component.js +560 -0
- package/src/lib/components/console/shipping-settings-card.component.js.map +1 -0
- package/src/lib/components/console/stock-movements-card.component.d.ts +31 -0
- package/src/lib/components/console/stock-movements-card.component.js +333 -0
- package/src/lib/components/console/stock-movements-card.component.js.map +1 -0
- package/src/lib/components/console/store-settings-card.component.d.ts +14 -0
- package/src/lib/components/console/store-settings-card.component.js +300 -0
- package/src/lib/components/console/store-settings-card.component.js.map +1 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.d.ts +73 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js +408 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -0
- package/src/lib/components/console/suppliers-card.component.d.ts +8 -0
- package/src/lib/components/console/suppliers-card.component.js +328 -0
- package/src/lib/components/console/suppliers-card.component.js.map +1 -0
- package/src/lib/components/console/tax-settings-card.component.d.ts +14 -0
- package/src/lib/components/console/tax-settings-card.component.js +473 -0
- package/src/lib/components/console/tax-settings-card.component.js.map +1 -0
- package/src/lib/components/gate.d.ts +39 -0
- package/src/lib/components/gate.js +202 -0
- package/src/lib/components/gate.js.map +1 -0
- package/src/lib/components/gated-video.d.ts +40 -0
- package/src/lib/components/gated-video.js +366 -0
- package/src/lib/components/gated-video.js.map +1 -0
- package/src/lib/components/member-feed.d.ts +32 -0
- package/src/lib/components/member-feed.js +198 -0
- package/src/lib/components/member-feed.js.map +1 -0
- package/src/lib/components/member-recovery.d.ts +35 -0
- package/src/lib/components/member-recovery.js +313 -0
- package/src/lib/components/member-recovery.js.map +1 -0
- package/src/lib/components/member-signin.d.ts +35 -0
- package/src/lib/components/member-signin.js +257 -0
- package/src/lib/components/member-signin.js.map +1 -0
- package/src/lib/components/member-signup.d.ts +34 -0
- package/src/lib/components/member-signup.js +287 -0
- package/src/lib/components/member-signup.js.map +1 -0
- package/src/lib/components/newsletter-signup.d.ts +39 -0
- package/src/lib/components/newsletter-signup.js +229 -0
- package/src/lib/components/newsletter-signup.js.map +1 -0
- package/src/lib/components/product-detail.d.ts +38 -0
- package/src/lib/components/product-detail.js +1022 -0
- package/src/lib/components/product-detail.js.map +1 -0
- package/src/lib/components/product-grid.d.ts +67 -0
- package/src/lib/components/product-grid.js +909 -0
- package/src/lib/components/product-grid.js.map +1 -0
- package/src/lib/components/product-reviews.d.ts +32 -0
- package/src/lib/components/product-reviews.js +349 -0
- package/src/lib/components/product-reviews.js.map +1 -0
- package/src/lib/components/related-products.d.ts +33 -0
- package/src/lib/components/related-products.js +232 -0
- package/src/lib/components/related-products.js.map +1 -0
- package/src/lib/components/reservation-widget.d.ts +33 -0
- package/src/lib/components/reservation-widget.js +418 -0
- package/src/lib/components/reservation-widget.js.map +1 -0
- package/src/lib/components/storefront-payment-element-fallback.d.ts +18 -0
- package/src/lib/components/storefront-payment-element-fallback.js +51 -0
- package/src/lib/components/storefront-payment-element-fallback.js.map +1 -0
- package/src/lib/components/storefront-payment-element.d.ts +78 -0
- package/src/lib/components/storefront-payment-element.js +156 -0
- package/src/lib/components/storefront-payment-element.js.map +1 -0
- package/src/lib/components/wishlist.d.ts +46 -0
- package/src/lib/components/wishlist.js +304 -0
- package/src/lib/components/wishlist.js.map +1 -0
- package/src/lib/constants/bundle-common.d.ts +18 -0
- package/src/lib/constants/bundle-common.js +18 -0
- package/src/lib/constants/bundle-common.js.map +1 -0
- package/src/lib/constants/product-filters.d.ts +35 -0
- package/src/lib/constants/product-filters.js +109 -0
- package/src/lib/constants/product-filters.js.map +1 -0
- package/src/lib/model/commerce-cart.d.ts +52 -0
- package/src/lib/model/commerce-cart.js +102 -0
- package/src/lib/model/commerce-cart.js.map +1 -0
- package/src/lib/model/commerce-connect-transfer.d.ts +243 -0
- package/src/lib/model/commerce-connect-transfer.js +231 -0
- package/src/lib/model/commerce-connect-transfer.js.map +1 -0
- package/src/lib/model/commerce-discounts.d.ts +164 -0
- package/src/lib/model/commerce-discounts.js +231 -0
- package/src/lib/model/commerce-discounts.js.map +1 -0
- package/src/lib/model/commerce-dispute.d.ts +124 -0
- package/src/lib/model/commerce-dispute.js +225 -0
- package/src/lib/model/commerce-dispute.js.map +1 -0
- package/src/lib/model/commerce-gift-cards.d.ts +107 -0
- package/src/lib/model/commerce-gift-cards.js +121 -0
- package/src/lib/model/commerce-gift-cards.js.map +1 -0
- package/src/lib/model/commerce-io.d.ts +36 -0
- package/src/lib/model/commerce-io.js +245 -0
- package/src/lib/model/commerce-io.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +1040 -0
- package/src/lib/model/commerce-orders.js +1022 -0
- package/src/lib/model/commerce-orders.js.map +1 -0
- package/src/lib/model/commerce-promotions.d.ts +188 -0
- package/src/lib/model/commerce-promotions.js +199 -0
- package/src/lib/model/commerce-promotions.js.map +1 -0
- package/src/lib/model/commerce-reservations.d.ts +175 -0
- package/src/lib/model/commerce-reservations.js +157 -0
- package/src/lib/model/commerce-reservations.js.map +1 -0
- package/src/lib/model/commerce-shipping.d.ts +316 -0
- package/src/lib/model/commerce-shipping.js +484 -0
- package/src/lib/model/commerce-shipping.js.map +1 -0
- package/src/lib/model/commerce-stock-holds.d.ts +199 -0
- package/src/lib/model/commerce-stock-holds.js +190 -0
- package/src/lib/model/commerce-stock-holds.js.map +1 -0
- package/src/lib/model/commerce-subscription-status.d.ts +67 -0
- package/src/lib/model/commerce-subscription-status.js +76 -0
- package/src/lib/model/commerce-subscription-status.js.map +1 -0
- package/src/lib/model/commerce-tax-decision.d.ts +222 -0
- package/src/lib/model/commerce-tax-decision.js +165 -0
- package/src/lib/model/commerce-tax-decision.js.map +1 -0
- package/src/lib/model/commerce-tax.d.ts +176 -0
- package/src/lib/model/commerce-tax.js +92 -0
- package/src/lib/model/commerce-tax.js.map +1 -0
- package/src/lib/model/commerce.d.ts +551 -0
- package/src/lib/model/commerce.js +739 -0
- package/src/lib/model/commerce.js.map +1 -0
- package/src/lib/model/index.d.ts +40 -0
- package/src/lib/model/index.js +40 -0
- package/src/lib/model/index.js.map +1 -0
- package/src/lib/model/order-figures.d.ts +48 -0
- package/src/lib/model/order-figures.js +74 -0
- package/src/lib/model/order-figures.js.map +1 -0
- package/src/lib/model/plugin-permissions.d.ts +23 -0
- package/src/lib/model/plugin-permissions.js +34 -0
- package/src/lib/model/plugin-permissions.js.map +1 -0
- package/src/lib/model/purchase-analytics.d.ts +186 -0
- package/src/lib/model/purchase-analytics.js +216 -0
- package/src/lib/model/purchase-analytics.js.map +1 -0
- package/src/lib/plugin-config.d.ts +62 -0
- package/src/lib/plugin-config.js +78 -0
- package/src/lib/plugin-config.js.map +1 -0
- package/src/lib/plugin.d.ts +28 -0
- package/src/lib/plugin.js +147 -0
- package/src/lib/plugin.js.map +1 -0
- package/src/lib/server/billing-webhook.d.ts +26 -0
- package/src/lib/server/billing-webhook.js +4011 -0
- package/src/lib/server/billing-webhook.js.map +1 -0
- package/src/lib/server/cancel-order.d.ts +87 -0
- package/src/lib/server/cancel-order.js +368 -0
- package/src/lib/server/cancel-order.js.map +1 -0
- package/src/lib/server/cart-checkout.d.ts +25 -0
- package/src/lib/server/cart-checkout.js +976 -0
- package/src/lib/server/cart-checkout.js.map +1 -0
- package/src/lib/server/cart-cookie.d.ts +32 -0
- package/src/lib/server/cart-cookie.js +77 -0
- package/src/lib/server/cart-cookie.js.map +1 -0
- package/src/lib/server/cart.d.ts +34 -0
- package/src/lib/server/cart.js +181 -0
- package/src/lib/server/cart.js.map +1 -0
- package/src/lib/server/catalog.d.ts +127 -0
- package/src/lib/server/catalog.js +277 -0
- package/src/lib/server/catalog.js.map +1 -0
- package/src/lib/server/checkout.d.ts +36 -0
- package/src/lib/server/checkout.js +915 -0
- package/src/lib/server/checkout.js.map +1 -0
- package/src/lib/server/connect.d.ts +26 -0
- package/src/lib/server/connect.js +238 -0
- package/src/lib/server/connect.js.map +1 -0
- package/src/lib/server/contact-refund.d.ts +117 -0
- package/src/lib/server/contact-refund.js +196 -0
- package/src/lib/server/contact-refund.js.map +1 -0
- package/src/lib/server/download.d.ts +39 -0
- package/src/lib/server/download.js +206 -0
- package/src/lib/server/download.js.map +1 -0
- package/src/lib/server/draft-order.d.ts +26 -0
- package/src/lib/server/draft-order.js +706 -0
- package/src/lib/server/draft-order.js.map +1 -0
- package/src/lib/server/feed.d.ts +24 -0
- package/src/lib/server/feed.js +59 -0
- package/src/lib/server/feed.js.map +1 -0
- package/src/lib/server/fulfill-order.d.ts +97 -0
- package/src/lib/server/fulfill-order.js +235 -0
- package/src/lib/server/fulfill-order.js.map +1 -0
- package/src/lib/server/gate.d.ts +36 -0
- package/src/lib/server/gate.js +112 -0
- package/src/lib/server/gate.js.map +1 -0
- package/src/lib/server/gift-cards.d.ts +42 -0
- package/src/lib/server/gift-cards.js +219 -0
- package/src/lib/server/gift-cards.js.map +1 -0
- package/src/lib/server/low-stock.d.ts +49 -0
- package/src/lib/server/low-stock.js +60 -0
- package/src/lib/server/low-stock.js.map +1 -0
- package/src/lib/server/manual-tax-rate.d.ts +82 -0
- package/src/lib/server/manual-tax-rate.js +113 -0
- package/src/lib/server/manual-tax-rate.js.map +1 -0
- package/src/lib/server/member-feed.d.ts +24 -0
- package/src/lib/server/member-feed.js +72 -0
- package/src/lib/server/member-feed.js.map +1 -0
- package/src/lib/server/member-name-search.d.ts +37 -0
- package/src/lib/server/member-name-search.js +42 -0
- package/src/lib/server/member-name-search.js.map +1 -0
- package/src/lib/server/member-post.d.ts +23 -0
- package/src/lib/server/member-post.js +166 -0
- package/src/lib/server/member-post.js.map +1 -0
- package/src/lib/server/membership-account.d.ts +37 -0
- package/src/lib/server/membership-account.js +148 -0
- package/src/lib/server/membership-account.js.map +1 -0
- package/src/lib/server/membership-admin-password.d.ts +33 -0
- package/src/lib/server/membership-admin-password.js +202 -0
- package/src/lib/server/membership-admin-password.js.map +1 -0
- package/src/lib/server/membership-content.d.ts +23 -0
- package/src/lib/server/membership-content.js +105 -0
- package/src/lib/server/membership-content.js.map +1 -0
- package/src/lib/server/membership-login.d.ts +19 -0
- package/src/lib/server/membership-login.js +137 -0
- package/src/lib/server/membership-login.js.map +1 -0
- package/src/lib/server/membership-logout.d.ts +19 -0
- package/src/lib/server/membership-logout.js +35 -0
- package/src/lib/server/membership-logout.js.map +1 -0
- package/src/lib/server/membership-recover.d.ts +60 -0
- package/src/lib/server/membership-recover.js +244 -0
- package/src/lib/server/membership-recover.js.map +1 -0
- package/src/lib/server/membership-register.d.ts +22 -0
- package/src/lib/server/membership-register.js +241 -0
- package/src/lib/server/membership-register.js.map +1 -0
- package/src/lib/server/membership-reset.d.ts +26 -0
- package/src/lib/server/membership-reset.js +88 -0
- package/src/lib/server/membership-reset.js.map +1 -0
- package/src/lib/server/membership-wishlist.d.ts +23 -0
- package/src/lib/server/membership-wishlist.js +89 -0
- package/src/lib/server/membership-wishlist.js.map +1 -0
- package/src/lib/server/membership.d.ts +96 -0
- package/src/lib/server/membership.js +222 -0
- package/src/lib/server/membership.js.map +1 -0
- package/src/lib/server/native-checkout.d.ts +170 -0
- package/src/lib/server/native-checkout.js +193 -0
- package/src/lib/server/native-checkout.js.map +1 -0
- package/src/lib/server/newsletter.d.ts +23 -0
- package/src/lib/server/newsletter.js +323 -0
- package/src/lib/server/newsletter.js.map +1 -0
- package/src/lib/server/notify-restock.d.ts +22 -0
- package/src/lib/server/notify-restock.js +84 -0
- package/src/lib/server/notify-restock.js.map +1 -0
- package/src/lib/server/order-analytics.d.ts +134 -0
- package/src/lib/server/order-analytics.js +263 -0
- package/src/lib/server/order-analytics.js.map +1 -0
- package/src/lib/server/order-figures.d.ts +33 -0
- package/src/lib/server/order-figures.js +220 -0
- package/src/lib/server/order-figures.js.map +1 -0
- package/src/lib/server/paid-media-delivery.d.ts +173 -0
- package/src/lib/server/paid-media-delivery.js +212 -0
- package/src/lib/server/paid-media-delivery.js.map +1 -0
- package/src/lib/server/pos-order.d.ts +54 -0
- package/src/lib/server/pos-order.js +1137 -0
- package/src/lib/server/pos-order.js.map +1 -0
- package/src/lib/server/process-abandoned.d.ts +54 -0
- package/src/lib/server/process-abandoned.js +222 -0
- package/src/lib/server/process-abandoned.js.map +1 -0
- package/src/lib/server/process-restock.d.ts +42 -0
- package/src/lib/server/process-restock.js +219 -0
- package/src/lib/server/process-restock.js.map +1 -0
- package/src/lib/server/product-card.d.ts +29 -0
- package/src/lib/server/product-card.js +54 -0
- package/src/lib/server/product-card.js.map +1 -0
- package/src/lib/server/product.d.ts +70 -0
- package/src/lib/server/product.js +105 -0
- package/src/lib/server/product.js.map +1 -0
- package/src/lib/server/promotion-hold.d.ts +144 -0
- package/src/lib/server/promotion-hold.js +174 -0
- package/src/lib/server/promotion-hold.js.map +1 -0
- package/src/lib/server/reconcile-stock.d.ts +106 -0
- package/src/lib/server/reconcile-stock.js +349 -0
- package/src/lib/server/reconcile-stock.js.map +1 -0
- package/src/lib/server/refund.d.ts +45 -0
- package/src/lib/server/refund.js +607 -0
- package/src/lib/server/refund.js.map +1 -0
- package/src/lib/server/related.d.ts +24 -0
- package/src/lib/server/related.js +104 -0
- package/src/lib/server/related.js.map +1 -0
- package/src/lib/server/reservation-availability.d.ts +23 -0
- package/src/lib/server/reservation-availability.js +111 -0
- package/src/lib/server/reservation-availability.js.map +1 -0
- package/src/lib/server/reserve-stock.d.ts +156 -0
- package/src/lib/server/reserve-stock.js +146 -0
- package/src/lib/server/reserve-stock.js.map +1 -0
- package/src/lib/server/reserve.d.ts +25 -0
- package/src/lib/server/reserve.js +426 -0
- package/src/lib/server/reserve.js.map +1 -0
- package/src/lib/server/restock-flag.d.ts +202 -0
- package/src/lib/server/restock-flag.js +449 -0
- package/src/lib/server/restock-flag.js.map +1 -0
- package/src/lib/server/reviews.d.ts +51 -0
- package/src/lib/server/reviews.js +132 -0
- package/src/lib/server/reviews.js.map +1 -0
- package/src/lib/server/site-page-enricher.d.ts +42 -0
- package/src/lib/server/site-page-enricher.js +149 -0
- package/src/lib/server/site-page-enricher.js.map +1 -0
- package/src/lib/server/site-page-resolver.d.ts +26 -0
- package/src/lib/server/site-page-resolver.js +223 -0
- package/src/lib/server/site-page-resolver.js.map +1 -0
- package/src/lib/server/stock-hold.d.ts +127 -0
- package/src/lib/server/stock-hold.js +258 -0
- package/src/lib/server/stock-hold.js.map +1 -0
- package/src/lib/server/storefront-tax-record.d.ts +22 -0
- package/src/lib/server/storefront-tax-record.js +218 -0
- package/src/lib/server/storefront-tax-record.js.map +1 -0
- package/src/lib/server/storefront-tax.d.ts +197 -0
- package/src/lib/server/storefront-tax.js +245 -0
- package/src/lib/server/storefront-tax.js.map +1 -0
- package/src/lib/server/stream.d.ts +25 -0
- package/src/lib/server/stream.js +191 -0
- package/src/lib/server/stream.js.map +1 -0
- package/src/lib/server/subscription-portal.d.ts +24 -0
- package/src/lib/server/subscription-portal.js +91 -0
- package/src/lib/server/subscription-portal.js.map +1 -0
- package/src/lib/server/supplier-outbox.d.ts +190 -0
- package/src/lib/server/supplier-outbox.js +342 -0
- package/src/lib/server/supplier-outbox.js.map +1 -0
- package/src/lib/server/supplier-update.d.ts +23 -0
- package/src/lib/server/supplier-update.js +289 -0
- package/src/lib/server/supplier-update.js.map +1 -0
- package/src/lib/server/tax-profile.d.ts +29 -0
- package/src/lib/server/tax-profile.js +40 -0
- package/src/lib/server/tax-profile.js.map +1 -0
- package/src/lib/server.d.ts +32 -0
- package/src/lib/server.js +311 -0
- package/src/lib/server.js.map +1 -0
- package/src/lib/site.d.ts +27 -0
- package/src/lib/site.js +134 -0
- package/src/lib/site.js.map +1 -0
- package/src/lib/utils/escape-html.d.ts +41 -0
- package/src/lib/utils/escape-html.js +41 -0
- package/src/lib/utils/escape-html.js.map +1 -0
- package/src/lib/utils/generate-preset-id.d.ts +19 -0
- package/src/lib/utils/generate-preset-id.js +25 -0
- package/src/lib/utils/generate-preset-id.js.map +1 -0
- package/src/lib/utils/member-continue.d.ts +45 -0
- package/src/lib/utils/member-continue.js +49 -0
- package/src/lib/utils/member-continue.js.map +1 -0
- package/src/lib/utils/use-storefront-purchase-event.d.ts +60 -0
- package/src/lib/utils/use-storefront-purchase-event.js +142 -0
- package/src/lib/utils/use-storefront-purchase-event.js.map +1 -0
|
@@ -0,0 +1,861 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ 'use client';
|
|
17
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
import * as CommerceModel from "../../model/index.js";
|
|
20
|
+
import { CardDisplay } from "@aglyn/shared-ui-jsx";
|
|
21
|
+
import { ScrollTable } from "@aglyn/shared-ui-jsx/components/scroll-table.component";
|
|
22
|
+
import { useSnackbar } from "@aglyn/shared-ui-snackstack";
|
|
23
|
+
import { checkEntitlement, ORDERS_CUSTOMER_PARAM, ORDERS_ORDER_PARAM, pluginDocsHelp } from "@aglyn/aglyn";
|
|
24
|
+
import { Alert, AlertTitle, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Stack, TableBody, TableCell, TableHead, TableRow, TextField, Tooltip, Typography } from "@mui/material";
|
|
25
|
+
import { collection, doc, getDoc, limit, orderBy, query } from "firebase/firestore";
|
|
26
|
+
import { useSearchParams } from "next/navigation";
|
|
27
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
28
|
+
import { ceilingedWindow, collectionCeiling, useFirestore, useOrgPlan, useUser } from "@aglyn/tenant-feature-instance";
|
|
29
|
+
import { useFirestoreCollection } from "@aglyn/tenant-feature-instance";
|
|
30
|
+
import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
|
|
31
|
+
import CommerceStatTile from "./commerce-stat-tile.component.js";
|
|
32
|
+
import OrderDetailDialog, { DISPUTE_COLOR } from "./order-detail-dialog.component.js";
|
|
33
|
+
/**
|
|
34
|
+
* How far back the table, its filters and its export reach.
|
|
35
|
+
*
|
|
36
|
+
* This window cannot be paged the way a plain list can. Five filters and the
|
|
37
|
+
* CSV export all run over what was read, so a page of ten would quietly narrow
|
|
38
|
+
* every one of them — a status filter would search a tenth of the orders and
|
|
39
|
+
* report confidently on what it found. Bounding the read and saying where the
|
|
40
|
+
* bound falls keeps the filters honest about their own scope.
|
|
41
|
+
*/ const ORDERS_WINDOW = 200;
|
|
42
|
+
/** A name map for the filter menu; it renders no product rows of its own. */ const PRODUCT_NAME_WINDOW = 100;
|
|
43
|
+
/**
|
|
44
|
+
* Orders console (AGL-287): filterable list over webhook-written order
|
|
45
|
+
* docs with a detail dialog (timeline, fulfill, refund, cancel, notes,
|
|
46
|
+
* packing slip) and draft orders that send the buyer a payment link.
|
|
47
|
+
*/ export function HostOrdersCard(props) {
|
|
48
|
+
var _ref, _find, _ref1, _ref2, _ref3, _ref4;
|
|
49
|
+
var _draft_shipCountries, _draft_shipCountries1;
|
|
50
|
+
const { hostId } = props;
|
|
51
|
+
const firestore = useFirestore();
|
|
52
|
+
/**
|
|
53
|
+
* The most recent orders, in the order the table shows them.
|
|
54
|
+
*
|
|
55
|
+
* `createdAtMs` is the field every order writer in the plugin stamps and the
|
|
56
|
+
* one `reconcile-stock` already walks the collection by. Ordering on it is
|
|
57
|
+
* what makes this window the RECENT orders: an unordered cap is answered in
|
|
58
|
+
* document-id order, and orders are keyed by generated ids, so it returns a
|
|
59
|
+
* pseudo-random sample that a client sort then dresses as newest-first.
|
|
60
|
+
*/ const { data: orderDocs } = useFirestoreCollection(()=>query(collection(firestore, 'hosts', hostId, 'orders'), orderBy('createdAtMs', 'desc'), limit(ORDERS_WINDOW + 1)), [
|
|
61
|
+
firestore,
|
|
62
|
+
hostId
|
|
63
|
+
], {
|
|
64
|
+
idField: '$id'
|
|
65
|
+
});
|
|
66
|
+
const { data: productDocs } = useFirestoreCollection(()=>collectionCeiling(collection(firestore, 'hosts', hostId, 'products'), PRODUCT_NAME_WINDOW), [
|
|
67
|
+
firestore,
|
|
68
|
+
hostId
|
|
69
|
+
], {
|
|
70
|
+
idField: '$id'
|
|
71
|
+
});
|
|
72
|
+
const orderWindow = useMemo(()=>ceilingedWindow(orderDocs != null ? orderDocs : undefined, ORDERS_WINDOW), [
|
|
73
|
+
orderDocs
|
|
74
|
+
]);
|
|
75
|
+
const productWindow = useMemo(()=>ceilingedWindow(productDocs != null ? productDocs : undefined, PRODUCT_NAME_WINDOW), [
|
|
76
|
+
productDocs
|
|
77
|
+
]);
|
|
78
|
+
const productNames = useMemo(()=>{
|
|
79
|
+
const map = {};
|
|
80
|
+
for (const product of productWindow.rows){
|
|
81
|
+
var _product_name;
|
|
82
|
+
map[product.$id] = (_product_name = product.name) != null ? _product_name : product.$id;
|
|
83
|
+
}
|
|
84
|
+
return map;
|
|
85
|
+
}, [
|
|
86
|
+
productWindow
|
|
87
|
+
]);
|
|
88
|
+
/**
|
|
89
|
+
* The money tiles are the `commerceAnalytics` surface (AGL-1938,
|
|
90
|
+
* AGL-2056), and this is the third place they appear. Rendering them
|
|
91
|
+
* ungated here would undo both of those passes and hand a Starter org
|
|
92
|
+
* the Pro figures one tab away from the upgrade prompt that refuses
|
|
93
|
+
* them. The TABLE below is not gated — a list of your own orders is not
|
|
94
|
+
* a paid feature.
|
|
95
|
+
*/ const { org, ready: orgReady } = useOrgPlan(hostId);
|
|
96
|
+
const showStats = orgReady && checkEntitlement(org, 'commerceAnalytics');
|
|
97
|
+
// The query returns the window already newest-first; re-sorting it here
|
|
98
|
+
// would only restate the order it arrived in.
|
|
99
|
+
const orders = orderWindow.rows;
|
|
100
|
+
// Filters + CSV export (AGL-96) over the loaded window.
|
|
101
|
+
const [productFilter, setProductFilter] = useState('');
|
|
102
|
+
const [dateFilter, setDateFilter] = useState('');
|
|
103
|
+
const [statusFilter, setStatusFilter] = useState('');
|
|
104
|
+
const [channelFilter, setChannelFilter] = useState('');
|
|
105
|
+
/**
|
|
106
|
+
* Disputes filter (AGL-1796), separate from Status on purpose: the two are
|
|
107
|
+
* orthogonal. An OPEN dispute sits on an order that is still `paid`, and a
|
|
108
|
+
* lost one sits on `refunded` beside every ordinary refund — so folding
|
|
109
|
+
* either into the Status select would make that control lie about what it
|
|
110
|
+
* selects.
|
|
111
|
+
*/ const [disputeFilter, setDisputeFilter] = useState('');
|
|
112
|
+
/*
|
|
113
|
+
* Customer filter (AGL-2622): the buyer's address, matched as a substring
|
|
114
|
+
* of `customerEmail` so a domain finds every buyer at a company. Seeded
|
|
115
|
+
* from the URL, because the CRM's contact page links here with the
|
|
116
|
+
* person's address to answer "what has this customer ordered" — the
|
|
117
|
+
* orders count on the record is the number, and this list is the rows.
|
|
118
|
+
*/ const searchParams = useSearchParams();
|
|
119
|
+
const [customerFilter, setCustomerFilter] = useState(()=>{
|
|
120
|
+
var _ref;
|
|
121
|
+
return (_ref = searchParams == null ? void 0 : searchParams.get(ORDERS_CUSTOMER_PARAM)) != null ? _ref : '';
|
|
122
|
+
});
|
|
123
|
+
const [selectedId, setSelectedId] = useState(null);
|
|
124
|
+
/*
|
|
125
|
+
* An order named in the URL opens in its dialog on arrival (AGL-2622). A
|
|
126
|
+
* contact's timeline names the order that made the person a customer,
|
|
127
|
+
* and the address it links to is this list with `?order={id}`. The
|
|
128
|
+
* window is the newest two hundred, and an order from last year is not
|
|
129
|
+
* in it, so the document is read once by id and held beside the window
|
|
130
|
+
* for the dialog; an order that IS in the window is found there first
|
|
131
|
+
* and the read is skipped. Once per id — the ref keeps a re-render from
|
|
132
|
+
* reopening a dialog the merchant has since closed — and the landing read
|
|
133
|
+
* is judged against the ref rather than an effect cleanup, because the
|
|
134
|
+
* `setSelectedId` above re-renders before the read lands and a cleanup
|
|
135
|
+
* keyed on any dep would cancel the answer to the question just asked.
|
|
136
|
+
*/ const seededOrderId = (_ref = searchParams == null ? void 0 : searchParams.get(ORDERS_ORDER_PARAM)) != null ? _ref : null;
|
|
137
|
+
const [seededOrder, setSeededOrder] = useState(null);
|
|
138
|
+
const seededOpened = useRef(null);
|
|
139
|
+
useEffect(()=>{
|
|
140
|
+
if (!seededOrderId || seededOpened.current === seededOrderId) return;
|
|
141
|
+
if (orderDocs === undefined) return;
|
|
142
|
+
seededOpened.current = seededOrderId;
|
|
143
|
+
setSelectedId(seededOrderId);
|
|
144
|
+
if (orderDocs.some((order)=>order.$id === seededOrderId)) return;
|
|
145
|
+
void getDoc(doc(firestore, 'hosts', hostId, 'orders', seededOrderId)).then((snapshot)=>{
|
|
146
|
+
if (seededOpened.current !== snapshot.id || !snapshot.exists()) return;
|
|
147
|
+
setSeededOrder(_extends({}, snapshot.data(), {
|
|
148
|
+
$id: snapshot.id
|
|
149
|
+
}));
|
|
150
|
+
}).catch(()=>undefined);
|
|
151
|
+
}, [
|
|
152
|
+
seededOrderId,
|
|
153
|
+
orderDocs,
|
|
154
|
+
firestore,
|
|
155
|
+
hostId
|
|
156
|
+
]);
|
|
157
|
+
const [draft, setDraft] = useState(null);
|
|
158
|
+
const { data: user } = useUser();
|
|
159
|
+
const { enqueueSnackbar } = useSnackbar();
|
|
160
|
+
const visibleOrders = useMemo(()=>{
|
|
161
|
+
const now = Date.now() / 1000;
|
|
162
|
+
return orders.filter((order)=>{
|
|
163
|
+
var _order_customerEmail, _lifted_channel, _order_createdAtMs;
|
|
164
|
+
var _CommerceModel_describeOrderDispute;
|
|
165
|
+
const lifted = CommerceModel.liftLegacyOrder(order);
|
|
166
|
+
// Line items first (AGL-1747): the flat `productId` is written only by
|
|
167
|
+
// the two buy-now Stripe paths, so matching on it alone hid every cart,
|
|
168
|
+
// POS and draft order behind the product filter.
|
|
169
|
+
if (productFilter && !CommerceModel.orderContainsProduct(lifted, productFilter)) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
if (statusFilter && lifted.status !== statusFilter) return false;
|
|
173
|
+
if (customerFilter && !String((_order_customerEmail = order.customerEmail) != null ? _order_customerEmail : '').toLowerCase().includes(customerFilter.trim().toLowerCase())) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (channelFilter && ((_lifted_channel = lifted.channel) != null ? _lifted_channel : 'online') !== channelFilter) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
if (disputeFilter === 'open' && !CommerceModel.orderHasOpenDispute(lifted)) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// `lost` is the tone, not the raw status: a dispute that was WON also
|
|
183
|
+
// closes with money untouched, and listing it under "charged back"
|
|
184
|
+
// would tell a merchant they lost a case they won.
|
|
185
|
+
if (disputeFilter === 'lost' && ((_CommerceModel_describeOrderDispute = CommerceModel.describeOrderDispute(lifted)) == null ? void 0 : _CommerceModel_describeOrderDispute.tone) !== 'lost') {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
// The same field the query orders by. `createdAt` is not universal
|
|
189
|
+
// across order writers, and a row missing it read as epoch zero — which
|
|
190
|
+
// both date filters excluded outright.
|
|
191
|
+
const created = ((_order_createdAtMs = order.createdAtMs) != null ? _order_createdAtMs : 0) / 1000;
|
|
192
|
+
if (dateFilter === '7d' && now - created > 7 * 86400) return false;
|
|
193
|
+
if (dateFilter === '30d' && now - created > 30 * 86400) return false;
|
|
194
|
+
return true;
|
|
195
|
+
});
|
|
196
|
+
}, [
|
|
197
|
+
orders,
|
|
198
|
+
productFilter,
|
|
199
|
+
dateFilter,
|
|
200
|
+
statusFilter,
|
|
201
|
+
channelFilter,
|
|
202
|
+
disputeFilter,
|
|
203
|
+
customerFilter
|
|
204
|
+
]);
|
|
205
|
+
/**
|
|
206
|
+
* Raised over EVERY loaded order, not the visible ones (AGL-1796). A
|
|
207
|
+
* merchant filtered to "delivered" still has a deadline running on a `paid`
|
|
208
|
+
* order, and the evidence window is days long.
|
|
209
|
+
*/ const openDisputes = useMemo(()=>CommerceModel.summariseOpenDisputes(orders.map((order)=>CommerceModel.liftLegacyOrder(order))), [
|
|
210
|
+
orders
|
|
211
|
+
]);
|
|
212
|
+
/**
|
|
213
|
+
* 30-day money summary with the prior 30 days behind it (AGL-2136). Over
|
|
214
|
+
* the LOADED window, like every other figure on this card — the query is
|
|
215
|
+
* `limit(200)`, so a store past 200 orders in 60 days is summarising a
|
|
216
|
+
* slice. That is the same bound the analytics card has always had, and
|
|
217
|
+
* making this one silently different would be worse than sharing it.
|
|
218
|
+
*/ const summary = useMemo(()=>CommerceModel.summarizeOrderWindow(orders, {
|
|
219
|
+
nowMs: Date.now()
|
|
220
|
+
}), [
|
|
221
|
+
orders
|
|
222
|
+
]);
|
|
223
|
+
const handleExportCsv = useCallback(()=>{
|
|
224
|
+
// The rows themselves are built by the pure model helper (AGL-1747) so the
|
|
225
|
+
// column-by-column arithmetic is unit-testable without a Firestore mock.
|
|
226
|
+
const csv = CommerceModel.buildOrdersCsv(visibleOrders, productNames);
|
|
227
|
+
const url = URL.createObjectURL(new Blob([
|
|
228
|
+
csv
|
|
229
|
+
], {
|
|
230
|
+
type: 'text/csv'
|
|
231
|
+
}));
|
|
232
|
+
const anchor = document.createElement('a');
|
|
233
|
+
anchor.href = url;
|
|
234
|
+
anchor.download = 'orders.csv';
|
|
235
|
+
anchor.click();
|
|
236
|
+
URL.revokeObjectURL(url);
|
|
237
|
+
}, [
|
|
238
|
+
visibleOrders,
|
|
239
|
+
productNames
|
|
240
|
+
]);
|
|
241
|
+
/**
|
|
242
|
+
* Idempotency key for ONE draft attempt (AGL-1697).
|
|
243
|
+
*
|
|
244
|
+
* Minted lazily on the first create click, NOT per call — two clicks (or a
|
|
245
|
+
* click retried after a lost response) must present ONE key so the server
|
|
246
|
+
* replays the original payment link instead of minting a second order.
|
|
247
|
+
* Retired whenever a content field changes: an edited draft is a different
|
|
248
|
+
* order, and replaying the old one against it would hand the merchant a
|
|
249
|
+
* link priced for fields they no longer see. Answering the shipping-country
|
|
250
|
+
* ask also retires it, which is safe — that refusal is served before the
|
|
251
|
+
* server takes the claim, so the first key was never spent.
|
|
252
|
+
*/ const draftAttemptKey = useRef('');
|
|
253
|
+
useEffect(()=>{
|
|
254
|
+
draftAttemptKey.current = '';
|
|
255
|
+
}, [
|
|
256
|
+
draft == null ? void 0 : draft.productId,
|
|
257
|
+
draft == null ? void 0 : draft.variantId,
|
|
258
|
+
draft == null ? void 0 : draft.quantity,
|
|
259
|
+
draft == null ? void 0 : draft.email,
|
|
260
|
+
draft == null ? void 0 : draft.shipTo
|
|
261
|
+
]);
|
|
262
|
+
const handleDraftCreate = useCallback(async ()=>{
|
|
263
|
+
if (!(draft == null ? void 0 : draft.productId)) return;
|
|
264
|
+
setDraft((prev)=>prev ? _extends({}, prev, {
|
|
265
|
+
busy: true
|
|
266
|
+
}) : prev);
|
|
267
|
+
try {
|
|
268
|
+
if (!draftAttemptKey.current) {
|
|
269
|
+
var _ref;
|
|
270
|
+
var _globalThis_crypto_randomUUID, _globalThis_crypto;
|
|
271
|
+
draftAttemptKey.current = (_ref = (_globalThis_crypto = globalThis.crypto) == null ? void 0 : (_globalThis_crypto_randomUUID = _globalThis_crypto.randomUUID) == null ? void 0 : _globalThis_crypto_randomUUID.call(_globalThis_crypto)) != null ? _ref : `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
272
|
+
}
|
|
273
|
+
const response = await authorizedFetch(user, '/api/commerce/draft-order', {
|
|
274
|
+
method: 'POST',
|
|
275
|
+
headers: {
|
|
276
|
+
'Content-Type': 'application/json',
|
|
277
|
+
// Stable across a retry of THIS attempt (AGL-1697), so a
|
|
278
|
+
// double-click cannot mint two live payment links.
|
|
279
|
+
'Idempotency-Key': draftAttemptKey.current
|
|
280
|
+
},
|
|
281
|
+
body: JSON.stringify(_extends({
|
|
282
|
+
hostId,
|
|
283
|
+
productId: draft.productId,
|
|
284
|
+
variantId: draft.variantId || undefined,
|
|
285
|
+
quantity: Number(draft.quantity) || 1,
|
|
286
|
+
email: draft.email || undefined
|
|
287
|
+
}, draft.shipTo ? {
|
|
288
|
+
shippingCountry: draft.shipTo
|
|
289
|
+
} : {}))
|
|
290
|
+
});
|
|
291
|
+
const payload = await response.json();
|
|
292
|
+
if (!response.ok) {
|
|
293
|
+
var _ref1;
|
|
294
|
+
// The merchant's rates differ by destination, so the server will not
|
|
295
|
+
// price this order until it knows one (AGL-1792). Reveal the field and
|
|
296
|
+
// let them answer; a store whose rates are the same everywhere, or
|
|
297
|
+
// which configured none, never sends this and never shows it.
|
|
298
|
+
if (payload == null ? void 0 : payload.needsShippingCountry) {
|
|
299
|
+
setDraft((prev)=>{
|
|
300
|
+
var _payload_shippingCountries;
|
|
301
|
+
return prev ? _extends({}, prev, {
|
|
302
|
+
shipCountries: ((_payload_shippingCountries = payload.shippingCountries) == null ? void 0 : _payload_shippingCountries.length) ? payload.shippingCountries : [
|
|
303
|
+
...CommerceModel.CHECKOUT_SHIPPING_COUNTRIES
|
|
304
|
+
]
|
|
305
|
+
}) : prev;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
return void enqueueSnackbar((_ref1 = payload == null ? void 0 : payload.error) != null ? _ref1 : 'Draft order failed', {
|
|
309
|
+
variant: 'error',
|
|
310
|
+
allowDuplicate: true
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
await navigator.clipboard.writeText(payload.url).catch(()=>undefined);
|
|
314
|
+
enqueueSnackbar('Draft created — payment link copied', {
|
|
315
|
+
variant: 'success',
|
|
316
|
+
persist: false
|
|
317
|
+
});
|
|
318
|
+
setDraft(null);
|
|
319
|
+
} finally{
|
|
320
|
+
setDraft((prev)=>prev ? _extends({}, prev, {
|
|
321
|
+
busy: false
|
|
322
|
+
}) : prev);
|
|
323
|
+
}
|
|
324
|
+
}, [
|
|
325
|
+
draft,
|
|
326
|
+
user,
|
|
327
|
+
hostId,
|
|
328
|
+
enqueueSnackbar
|
|
329
|
+
]);
|
|
330
|
+
const selectedOrder = (_find = (orderDocs != null ? orderDocs : []).find((order)=>order.$id === selectedId)) != null ? _find : seededOrder && seededOrder.$id === selectedId ? seededOrder : null;
|
|
331
|
+
/**
|
|
332
|
+
* Shared by the two triggers (AGL-1805) so the empty state and the toolbar
|
|
333
|
+
* cannot drift into opening the dialog with different starting fields.
|
|
334
|
+
*/ const openDraft = useCallback(()=>setDraft({
|
|
335
|
+
productId: '',
|
|
336
|
+
variantId: '',
|
|
337
|
+
quantity: '1',
|
|
338
|
+
email: ''
|
|
339
|
+
}), []);
|
|
340
|
+
/** What the draft dialog can actually offer. */ const selectableProducts = useMemo(()=>productWindow.rows.filter((product)=>!product.deletedAt), [
|
|
341
|
+
productWindow
|
|
342
|
+
]);
|
|
343
|
+
return /*#__PURE__*/ _jsxs(CardDisplay, {
|
|
344
|
+
header: 'Orders',
|
|
345
|
+
help: pluginDocsHelp('commerce', {
|
|
346
|
+
anchor: '#orders',
|
|
347
|
+
excerpt: 'Every order with its channel, status and net total. A refunded ' + 'order shows what is left, with the gross beneath it.'
|
|
348
|
+
}),
|
|
349
|
+
contentGutterX: true,
|
|
350
|
+
contentGutterY: true,
|
|
351
|
+
children: [
|
|
352
|
+
orders.length === 0 ? /*
|
|
353
|
+
* An invitation, not a report (AGL-1805). The "Draft order" button
|
|
354
|
+
* used to live in the other arm of this ternary, so the one state a
|
|
355
|
+
* draft order exists for — no sales yet, invoice the customer you
|
|
356
|
+
* already have — was the only state that could not reach it, and
|
|
357
|
+
* every other route into the dialog needs an order to exist first.
|
|
358
|
+
*
|
|
359
|
+
* The filters stay behind deliberately: they belong to a list with
|
|
360
|
+
* rows in it. Export CSV likewise — a header-only file is not
|
|
361
|
+
* something a merchant on day one is looking for.
|
|
362
|
+
*/ /*#__PURE__*/ _jsxs(Stack, {
|
|
363
|
+
spacing: 1,
|
|
364
|
+
sx: {
|
|
365
|
+
alignItems: 'flex-start'
|
|
366
|
+
},
|
|
367
|
+
children: [
|
|
368
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
369
|
+
variant: "body2",
|
|
370
|
+
color: "text.secondary",
|
|
371
|
+
children: 'No orders yet. Storefront sales, POS sales and draft orders ' + 'all appear here as they come in.'
|
|
372
|
+
}),
|
|
373
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
374
|
+
variant: "body2",
|
|
375
|
+
color: "text.secondary",
|
|
376
|
+
children: 'Selling to someone directly? Draft their order and send them ' + 'a payment link.'
|
|
377
|
+
}),
|
|
378
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
379
|
+
size: "small",
|
|
380
|
+
variant: "contained",
|
|
381
|
+
color: "primary",
|
|
382
|
+
onClick: openDraft,
|
|
383
|
+
children: 'Draft order'
|
|
384
|
+
})
|
|
385
|
+
]
|
|
386
|
+
}) : /*#__PURE__*/ _jsxs(Stack, {
|
|
387
|
+
spacing: 1,
|
|
388
|
+
children: [
|
|
389
|
+
showStats ? /*#__PURE__*/ _jsxs(Stack, {
|
|
390
|
+
direction: "row",
|
|
391
|
+
spacing: 3,
|
|
392
|
+
sx: {
|
|
393
|
+
flexWrap: 'wrap',
|
|
394
|
+
rowGap: 1
|
|
395
|
+
},
|
|
396
|
+
children: [
|
|
397
|
+
/*#__PURE__*/ _jsx(CommerceStatTile, {
|
|
398
|
+
label: "Revenue · 30d",
|
|
399
|
+
value: `$${(summary.revenueCents / 100).toFixed(2)}`,
|
|
400
|
+
deltaPct: summary.revenueDeltaPct,
|
|
401
|
+
deltaCaption: "vs the previous 30 days"
|
|
402
|
+
}),
|
|
403
|
+
/*#__PURE__*/ _jsx(CommerceStatTile, {
|
|
404
|
+
label: "Orders · 30d",
|
|
405
|
+
value: String(summary.orders),
|
|
406
|
+
deltaPct: summary.ordersDeltaPct,
|
|
407
|
+
deltaCaption: "vs the previous 30 days"
|
|
408
|
+
}),
|
|
409
|
+
/*#__PURE__*/ _jsx(CommerceStatTile, {
|
|
410
|
+
label: "Avg order value",
|
|
411
|
+
value: `$${(summary.aovCents / 100).toFixed(2)}`,
|
|
412
|
+
deltaPct: summary.aovDeltaPct,
|
|
413
|
+
deltaCaption: "vs the previous 30 days"
|
|
414
|
+
})
|
|
415
|
+
]
|
|
416
|
+
}) : null,
|
|
417
|
+
openDisputes.count > 0 ? /*#__PURE__*/ _jsxs(Alert, {
|
|
418
|
+
severity: openDisputes.overdue ? 'error' : 'warning',
|
|
419
|
+
action: disputeFilter === 'open' ? undefined : /*#__PURE__*/ _jsx(Button, {
|
|
420
|
+
size: "small",
|
|
421
|
+
color: "inherit",
|
|
422
|
+
onClick: ()=>setDisputeFilter('open'),
|
|
423
|
+
children: 'Show them'
|
|
424
|
+
}),
|
|
425
|
+
children: [
|
|
426
|
+
/*#__PURE__*/ _jsx(AlertTitle, {
|
|
427
|
+
children: openDisputes.count === 1 ? 'A shopper has disputed a charge with their bank' : `${openDisputes.count} charges are disputed with the shopper’s bank`
|
|
428
|
+
}),
|
|
429
|
+
openDisputes.soonestDaysLeft === undefined ? 'Answer in the Stripe dashboard while the case is open — an unanswered dispute is decided for the shopper.' : openDisputes.soonestDaysLeft < 0 ? 'The evidence deadline has passed on at least one of these. Stripe decides an unanswered dispute for the shopper.' : `Evidence is due to Stripe in ${openDisputes.soonestDaysLeft} day${openDisputes.soonestDaysLeft === 1 ? '' : 's'} on the tightest of these. An unanswered dispute is decided for the shopper.`
|
|
430
|
+
]
|
|
431
|
+
}) : null,
|
|
432
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
433
|
+
direction: "row",
|
|
434
|
+
spacing: 1,
|
|
435
|
+
sx: {
|
|
436
|
+
alignItems: 'center'
|
|
437
|
+
},
|
|
438
|
+
children: [
|
|
439
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
440
|
+
select: true,
|
|
441
|
+
size: "small",
|
|
442
|
+
label: "Product",
|
|
443
|
+
value: productFilter,
|
|
444
|
+
onChange: (event)=>setProductFilter(event.target.value),
|
|
445
|
+
sx: {
|
|
446
|
+
minWidth: 160
|
|
447
|
+
},
|
|
448
|
+
children: [
|
|
449
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
450
|
+
value: "",
|
|
451
|
+
children: 'All products'
|
|
452
|
+
}),
|
|
453
|
+
productWindow.rows.map((product)=>{
|
|
454
|
+
var _product_name;
|
|
455
|
+
return /*#__PURE__*/ _jsx(MenuItem, {
|
|
456
|
+
value: product.$id,
|
|
457
|
+
children: (_product_name = product.name) != null ? _product_name : product.$id
|
|
458
|
+
}, product.$id);
|
|
459
|
+
})
|
|
460
|
+
]
|
|
461
|
+
}),
|
|
462
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
463
|
+
select: true,
|
|
464
|
+
size: "small",
|
|
465
|
+
label: "Period",
|
|
466
|
+
value: dateFilter,
|
|
467
|
+
onChange: (event)=>setDateFilter(event.target.value),
|
|
468
|
+
sx: {
|
|
469
|
+
minWidth: 130
|
|
470
|
+
},
|
|
471
|
+
children: [
|
|
472
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
473
|
+
value: "",
|
|
474
|
+
children: 'All time'
|
|
475
|
+
}),
|
|
476
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
477
|
+
value: "7d",
|
|
478
|
+
children: 'Last 7 days'
|
|
479
|
+
}),
|
|
480
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
481
|
+
value: "30d",
|
|
482
|
+
children: 'Last 30 days'
|
|
483
|
+
})
|
|
484
|
+
]
|
|
485
|
+
}),
|
|
486
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
487
|
+
select: true,
|
|
488
|
+
size: "small",
|
|
489
|
+
label: "Status",
|
|
490
|
+
value: statusFilter,
|
|
491
|
+
onChange: (event)=>setStatusFilter(event.target.value),
|
|
492
|
+
sx: {
|
|
493
|
+
minWidth: 130
|
|
494
|
+
},
|
|
495
|
+
children: [
|
|
496
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
497
|
+
value: "",
|
|
498
|
+
children: 'All statuses'
|
|
499
|
+
}),
|
|
500
|
+
Object.keys(CommerceModel.ORDER_STATUS_LABELS).map((status)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
501
|
+
value: status,
|
|
502
|
+
children: CommerceModel.ORDER_STATUS_LABELS[status]
|
|
503
|
+
}, status))
|
|
504
|
+
]
|
|
505
|
+
}),
|
|
506
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
507
|
+
select: true,
|
|
508
|
+
size: "small",
|
|
509
|
+
label: "Channel",
|
|
510
|
+
value: channelFilter,
|
|
511
|
+
onChange: (event)=>setChannelFilter(event.target.value),
|
|
512
|
+
sx: {
|
|
513
|
+
minWidth: 120
|
|
514
|
+
},
|
|
515
|
+
children: [
|
|
516
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
517
|
+
value: "",
|
|
518
|
+
children: 'All channels'
|
|
519
|
+
}),
|
|
520
|
+
Object.keys(CommerceModel.ORDER_CHANNEL_LABELS).map((channel)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
521
|
+
value: channel,
|
|
522
|
+
children: CommerceModel.ORDER_CHANNEL_LABELS[channel]
|
|
523
|
+
}, channel))
|
|
524
|
+
]
|
|
525
|
+
}),
|
|
526
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
527
|
+
size: "small",
|
|
528
|
+
label: "Customer",
|
|
529
|
+
placeholder: "Email",
|
|
530
|
+
value: customerFilter,
|
|
531
|
+
onChange: (event)=>setCustomerFilter(event.target.value),
|
|
532
|
+
sx: {
|
|
533
|
+
minWidth: 180
|
|
534
|
+
}
|
|
535
|
+
}),
|
|
536
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
537
|
+
select: true,
|
|
538
|
+
size: "small",
|
|
539
|
+
label: "Disputes",
|
|
540
|
+
value: disputeFilter,
|
|
541
|
+
onChange: (event)=>setDisputeFilter(event.target.value),
|
|
542
|
+
sx: {
|
|
543
|
+
minWidth: 140
|
|
544
|
+
},
|
|
545
|
+
children: [
|
|
546
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
547
|
+
value: "",
|
|
548
|
+
children: 'All orders'
|
|
549
|
+
}),
|
|
550
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
551
|
+
value: "open",
|
|
552
|
+
children: 'Open dispute'
|
|
553
|
+
}),
|
|
554
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
555
|
+
value: "lost",
|
|
556
|
+
children: 'Charged back'
|
|
557
|
+
})
|
|
558
|
+
]
|
|
559
|
+
}),
|
|
560
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
561
|
+
size: "small",
|
|
562
|
+
onClick: handleExportCsv,
|
|
563
|
+
children: 'Export CSV'
|
|
564
|
+
}),
|
|
565
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
566
|
+
size: "small",
|
|
567
|
+
variant: "contained",
|
|
568
|
+
color: "primary",
|
|
569
|
+
onClick: openDraft,
|
|
570
|
+
children: 'Draft order'
|
|
571
|
+
})
|
|
572
|
+
]
|
|
573
|
+
}),
|
|
574
|
+
/*#__PURE__*/ _jsxs(ScrollTable, {
|
|
575
|
+
size: "small",
|
|
576
|
+
"aria-label": "Orders",
|
|
577
|
+
children: [
|
|
578
|
+
/*#__PURE__*/ _jsx(TableHead, {
|
|
579
|
+
children: /*#__PURE__*/ _jsxs(TableRow, {
|
|
580
|
+
children: [
|
|
581
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
582
|
+
children: 'Order'
|
|
583
|
+
}),
|
|
584
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
585
|
+
children: 'Customer'
|
|
586
|
+
}),
|
|
587
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
588
|
+
children: 'Channel'
|
|
589
|
+
}),
|
|
590
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
591
|
+
align: "right",
|
|
592
|
+
children: 'Total'
|
|
593
|
+
}),
|
|
594
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
595
|
+
children: 'Status'
|
|
596
|
+
}),
|
|
597
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
598
|
+
children: 'Date'
|
|
599
|
+
})
|
|
600
|
+
]
|
|
601
|
+
})
|
|
602
|
+
}),
|
|
603
|
+
/*#__PURE__*/ _jsx(TableBody, {
|
|
604
|
+
children: visibleOrders.map((order)=>{
|
|
605
|
+
var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _CommerceModel_ORDER_STATUS_LABELS_lifted_status, _CommerceModel_ORDER_STATUS_COLOR_lifted_status;
|
|
606
|
+
var _order_createdAt_toDate, _order_createdAt, _lifted_lineItems_, _lifted_lineItems, _lifted_lineItems1, _lifted_totals;
|
|
607
|
+
const lifted = CommerceModel.liftLegacyOrder(order);
|
|
608
|
+
// A lost chargeback leaves `status: 'refunded'` (AGL-1787),
|
|
609
|
+
// so the status pill on this row cannot tell the two apart
|
|
610
|
+
// either — which is why the dispute chip sits beside it
|
|
611
|
+
// rather than being folded into the status.
|
|
612
|
+
const dispute = CommerceModel.describeOrderDispute(lifted);
|
|
613
|
+
const createdAt = (_order_createdAt = order.createdAt) == null ? void 0 : (_order_createdAt_toDate = _order_createdAt.toDate) == null ? void 0 : _order_createdAt_toDate.call(_order_createdAt);
|
|
614
|
+
const itemName = (_ref = (_ref1 = (_ref2 = (_lifted_lineItems = lifted.lineItems) == null ? void 0 : (_lifted_lineItems_ = _lifted_lineItems[0]) == null ? void 0 : _lifted_lineItems_.name) != null ? _ref2 : productNames[order.productId]) != null ? _ref1 : order.productId) != null ? _ref : '';
|
|
615
|
+
const extraItems = Math.max(0, ((_ref3 = (_lifted_lineItems1 = lifted.lineItems) == null ? void 0 : _lifted_lineItems1.length) != null ? _ref3 : 0) - 1);
|
|
616
|
+
return /*#__PURE__*/ _jsxs(TableRow, {
|
|
617
|
+
hover: true,
|
|
618
|
+
onClick: ()=>setSelectedId(order.$id),
|
|
619
|
+
sx: {
|
|
620
|
+
cursor: 'pointer'
|
|
621
|
+
},
|
|
622
|
+
children: [
|
|
623
|
+
/*#__PURE__*/ _jsxs(TableCell, {
|
|
624
|
+
children: [
|
|
625
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
626
|
+
variant: "body2",
|
|
627
|
+
children: CommerceModel.formatOrderNumber(lifted, order.$id)
|
|
628
|
+
}),
|
|
629
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
630
|
+
variant: "caption",
|
|
631
|
+
color: "text.secondary",
|
|
632
|
+
children: extraItems ? `${itemName} +${extraItems} more` : itemName
|
|
633
|
+
})
|
|
634
|
+
]
|
|
635
|
+
}),
|
|
636
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
637
|
+
children: /*#__PURE__*/ _jsx(Typography, {
|
|
638
|
+
variant: "body2",
|
|
639
|
+
noWrap: true,
|
|
640
|
+
children: order.customerEmail || '—'
|
|
641
|
+
})
|
|
642
|
+
}),
|
|
643
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
644
|
+
children: /*#__PURE__*/ _jsx(Typography, {
|
|
645
|
+
variant: "body2",
|
|
646
|
+
children: CommerceModel.orderChannelLabel(lifted.channel)
|
|
647
|
+
})
|
|
648
|
+
}),
|
|
649
|
+
/*#__PURE__*/ _jsxs(TableCell, {
|
|
650
|
+
align: "right",
|
|
651
|
+
children: [
|
|
652
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
653
|
+
variant: "body2",
|
|
654
|
+
children: `$${(CommerceModel.orderNetCents(lifted) / 100).toFixed(2)}`
|
|
655
|
+
}),
|
|
656
|
+
order.refundedCents ? /*#__PURE__*/ _jsx(Typography, {
|
|
657
|
+
variant: "caption",
|
|
658
|
+
color: "text.secondary",
|
|
659
|
+
children: `$${(((_ref4 = (_ref5 = (_lifted_totals = lifted.totals) == null ? void 0 : _lifted_totals.totalCents) != null ? _ref5 : order.amountCents) != null ? _ref4 : 0) / 100).toFixed(2)} less refunds`
|
|
660
|
+
}) : null
|
|
661
|
+
]
|
|
662
|
+
}),
|
|
663
|
+
/*#__PURE__*/ _jsxs(TableCell, {
|
|
664
|
+
children: [
|
|
665
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
666
|
+
direction: "row",
|
|
667
|
+
spacing: 0.5,
|
|
668
|
+
sx: {
|
|
669
|
+
alignItems: 'center'
|
|
670
|
+
},
|
|
671
|
+
children: [
|
|
672
|
+
/*#__PURE__*/ _jsx(Chip, {
|
|
673
|
+
label: (_CommerceModel_ORDER_STATUS_LABELS_lifted_status = CommerceModel.ORDER_STATUS_LABELS[lifted.status]) != null ? _CommerceModel_ORDER_STATUS_LABELS_lifted_status : lifted.status,
|
|
674
|
+
size: "small",
|
|
675
|
+
color: (_CommerceModel_ORDER_STATUS_COLOR_lifted_status = CommerceModel.ORDER_STATUS_COLOR[lifted.status]) != null ? _CommerceModel_ORDER_STATUS_COLOR_lifted_status : 'default',
|
|
676
|
+
variant: "outlined"
|
|
677
|
+
}),
|
|
678
|
+
dispute ? /*#__PURE__*/ _jsx(Tooltip, {
|
|
679
|
+
title: dispute.detail,
|
|
680
|
+
children: /*#__PURE__*/ _jsx(Chip, {
|
|
681
|
+
label: dispute.label,
|
|
682
|
+
size: "small",
|
|
683
|
+
color: DISPUTE_COLOR[dispute.tone],
|
|
684
|
+
variant: "filled"
|
|
685
|
+
})
|
|
686
|
+
}) : null
|
|
687
|
+
]
|
|
688
|
+
}),
|
|
689
|
+
(dispute == null ? void 0 : dispute.evidenceDaysLeft) !== undefined ? /*#__PURE__*/ _jsx(Typography, {
|
|
690
|
+
variant: "caption",
|
|
691
|
+
component: "div",
|
|
692
|
+
color: dispute.evidenceDaysLeft < 0 ? 'error' : 'warning.main',
|
|
693
|
+
children: dispute.evidenceDaysLeft < 0 ? 'Evidence deadline passed' : `Evidence due in ${dispute.evidenceDaysLeft} day${dispute.evidenceDaysLeft === 1 ? '' : 's'}`
|
|
694
|
+
}) : null
|
|
695
|
+
]
|
|
696
|
+
}),
|
|
697
|
+
/*#__PURE__*/ _jsxs(TableCell, {
|
|
698
|
+
children: [
|
|
699
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
700
|
+
variant: "body2",
|
|
701
|
+
noWrap: true,
|
|
702
|
+
children: createdAt ? createdAt.toLocaleDateString() : '—'
|
|
703
|
+
}),
|
|
704
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
705
|
+
variant: "caption",
|
|
706
|
+
color: "text.secondary",
|
|
707
|
+
children: createdAt ? createdAt.toLocaleTimeString() : ''
|
|
708
|
+
})
|
|
709
|
+
]
|
|
710
|
+
})
|
|
711
|
+
]
|
|
712
|
+
}, order.$id);
|
|
713
|
+
})
|
|
714
|
+
})
|
|
715
|
+
]
|
|
716
|
+
}),
|
|
717
|
+
orderWindow.truncated ? /*
|
|
718
|
+
* Where the filters and the export stop. Both run over what was
|
|
719
|
+
* read, so a store past this window would otherwise see a status
|
|
720
|
+
* filter return nothing and read it as having no such orders.
|
|
721
|
+
*/ /*#__PURE__*/ _jsx(Typography, {
|
|
722
|
+
variant: "caption",
|
|
723
|
+
color: "text.secondary",
|
|
724
|
+
children: `Showing the ${ORDERS_WINDOW} most recent orders. Filters and Export CSV cover these.`
|
|
725
|
+
}) : null
|
|
726
|
+
]
|
|
727
|
+
}),
|
|
728
|
+
selectedOrder ? /*#__PURE__*/ _jsx(OrderDetailDialog, {
|
|
729
|
+
hostId: hostId,
|
|
730
|
+
order: selectedOrder,
|
|
731
|
+
onClose: ()=>setSelectedId(null)
|
|
732
|
+
}) : null,
|
|
733
|
+
/*#__PURE__*/ _jsxs(Dialog, {
|
|
734
|
+
open: Boolean(draft),
|
|
735
|
+
onClose: ()=>setDraft(null),
|
|
736
|
+
maxWidth: "xs",
|
|
737
|
+
fullWidth: true,
|
|
738
|
+
children: [
|
|
739
|
+
/*#__PURE__*/ _jsx(DialogTitle, {
|
|
740
|
+
children: 'Draft order'
|
|
741
|
+
}),
|
|
742
|
+
/*#__PURE__*/ _jsxs(DialogContent, {
|
|
743
|
+
sx: {
|
|
744
|
+
display: 'flex',
|
|
745
|
+
flexDirection: 'column',
|
|
746
|
+
gap: 2
|
|
747
|
+
},
|
|
748
|
+
children: [
|
|
749
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
750
|
+
label: "Product",
|
|
751
|
+
value: (_ref1 = draft == null ? void 0 : draft.productId) != null ? _ref1 : '',
|
|
752
|
+
onChange: (event)=>setDraft((prev)=>prev ? _extends({}, prev, {
|
|
753
|
+
productId: event.target.value,
|
|
754
|
+
variantId: ''
|
|
755
|
+
}) : prev),
|
|
756
|
+
size: "small",
|
|
757
|
+
select: true,
|
|
758
|
+
sx: {
|
|
759
|
+
mt: 1
|
|
760
|
+
},
|
|
761
|
+
/*
|
|
762
|
+
* The second dead end behind the first (AGL-1805): a store with
|
|
763
|
+
* no orders may have no products either, and a draft order is
|
|
764
|
+
* composed from one — so "Create & copy link" stays disabled. Say
|
|
765
|
+
* why, rather than opening an empty menu onto nothing.
|
|
766
|
+
*/ helperText: selectableProducts.length === 0 ? 'Add a product to this store first — a draft order is built from one.' : undefined,
|
|
767
|
+
children: selectableProducts.map((product)=>{
|
|
768
|
+
var _product_name;
|
|
769
|
+
return /*#__PURE__*/ _jsx(MenuItem, {
|
|
770
|
+
value: product.$id,
|
|
771
|
+
children: (_product_name = product.name) != null ? _product_name : product.$id
|
|
772
|
+
}, product.$id);
|
|
773
|
+
})
|
|
774
|
+
}),
|
|
775
|
+
(()=>{
|
|
776
|
+
var _ref;
|
|
777
|
+
const product = productWindow.rows.find((item)=>item.$id === (draft == null ? void 0 : draft.productId));
|
|
778
|
+
const variants = product ? CommerceModel.liftLegacyProduct(product).variants : [];
|
|
779
|
+
return variants.length > 1 ? /*#__PURE__*/ _jsx(TextField, {
|
|
780
|
+
label: "Variant",
|
|
781
|
+
value: (_ref = draft == null ? void 0 : draft.variantId) != null ? _ref : '',
|
|
782
|
+
onChange: (event)=>setDraft((prev)=>prev ? _extends({}, prev, {
|
|
783
|
+
variantId: event.target.value
|
|
784
|
+
}) : prev),
|
|
785
|
+
size: "small",
|
|
786
|
+
select: true,
|
|
787
|
+
children: variants.map((variant)=>{
|
|
788
|
+
var _variant_options;
|
|
789
|
+
return /*#__PURE__*/ _jsx(MenuItem, {
|
|
790
|
+
value: variant.id,
|
|
791
|
+
children: `${Object.values((_variant_options = variant.options) != null ? _variant_options : {}).join(' / ') || 'Default'} — $${variant.priceUsd}`
|
|
792
|
+
}, variant.id);
|
|
793
|
+
})
|
|
794
|
+
}) : null;
|
|
795
|
+
})(),
|
|
796
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
797
|
+
label: "Quantity",
|
|
798
|
+
value: (_ref2 = draft == null ? void 0 : draft.quantity) != null ? _ref2 : '1',
|
|
799
|
+
onChange: (event)=>setDraft((prev)=>prev ? _extends({}, prev, {
|
|
800
|
+
quantity: event.target.value.replace(/[^0-9]/g, '')
|
|
801
|
+
}) : prev),
|
|
802
|
+
size: "small",
|
|
803
|
+
slotProps: {
|
|
804
|
+
htmlInput: {
|
|
805
|
+
inputMode: 'numeric'
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}),
|
|
809
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
810
|
+
label: "Buyer email (optional)",
|
|
811
|
+
value: (_ref3 = draft == null ? void 0 : draft.email) != null ? _ref3 : '',
|
|
812
|
+
onChange: (event)=>setDraft((prev)=>prev ? _extends({}, prev, {
|
|
813
|
+
email: event.target.value
|
|
814
|
+
}) : prev),
|
|
815
|
+
size: "small"
|
|
816
|
+
}),
|
|
817
|
+
(draft == null ? void 0 : (_draft_shipCountries = draft.shipCountries) == null ? void 0 : _draft_shipCountries.length) ? /*#__PURE__*/ _jsx(TextField, {
|
|
818
|
+
label: "Ships to",
|
|
819
|
+
value: (_ref4 = draft == null ? void 0 : draft.shipTo) != null ? _ref4 : '',
|
|
820
|
+
onChange: (event)=>setDraft((prev)=>prev ? _extends({}, prev, {
|
|
821
|
+
shipTo: event.target.value
|
|
822
|
+
}) : prev),
|
|
823
|
+
size: "small",
|
|
824
|
+
select: true,
|
|
825
|
+
helperText: 'This store’s shipping rates differ by destination, so the ' + 'payment link has to be priced for one.',
|
|
826
|
+
children: draft.shipCountries.map((code)=>{
|
|
827
|
+
var _CommerceModel_CHECKOUT_SHIPPING_COUNTRY_NAMES_code;
|
|
828
|
+
return /*#__PURE__*/ _jsx(MenuItem, {
|
|
829
|
+
value: code,
|
|
830
|
+
children: (_CommerceModel_CHECKOUT_SHIPPING_COUNTRY_NAMES_code = CommerceModel.CHECKOUT_SHIPPING_COUNTRY_NAMES[code]) != null ? _CommerceModel_CHECKOUT_SHIPPING_COUNTRY_NAMES_code : code
|
|
831
|
+
}, code);
|
|
832
|
+
})
|
|
833
|
+
}) : null
|
|
834
|
+
]
|
|
835
|
+
}),
|
|
836
|
+
/*#__PURE__*/ _jsxs(DialogActions, {
|
|
837
|
+
children: [
|
|
838
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
839
|
+
onClick: ()=>setDraft(null),
|
|
840
|
+
children: 'Cancel'
|
|
841
|
+
}),
|
|
842
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
843
|
+
variant: "contained",
|
|
844
|
+
color: "primary",
|
|
845
|
+
disabled: !(draft == null ? void 0 : draft.productId) || (draft == null ? void 0 : draft.busy) || // Once asked, the answer is required: retrying without one is
|
|
846
|
+
// refused again, so the button would only look broken.
|
|
847
|
+
Boolean((draft == null ? void 0 : (_draft_shipCountries1 = draft.shipCountries) == null ? void 0 : _draft_shipCountries1.length) && !(draft == null ? void 0 : draft.shipTo)),
|
|
848
|
+
onClick: handleDraftCreate,
|
|
849
|
+
children: 'Create & copy link'
|
|
850
|
+
})
|
|
851
|
+
]
|
|
852
|
+
})
|
|
853
|
+
]
|
|
854
|
+
})
|
|
855
|
+
]
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
HostOrdersCard.displayName = 'HostOrdersCard';
|
|
859
|
+
export default HostOrdersCard;
|
|
860
|
+
|
|
861
|
+
//# sourceMappingURL=host-orders-card.component.js.map
|