@mohasinac/appkit 4.13.1 → 4.15.0
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/dist/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
- package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
- package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
- package/dist/_internal/server/features/auctions/actions.js +8 -2
- package/dist/_internal/server/features/bundles/data.d.ts +16 -0
- package/dist/_internal/server/features/bundles/data.js +26 -0
- package/dist/_internal/server/features/bundles/index.d.ts +1 -1
- package/dist/_internal/server/features/bundles/index.js +1 -1
- package/dist/_internal/server/features/cart/service.d.ts +3 -3
- package/dist/_internal/server/features/checkout/actions.js +25 -0
- package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
- package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
- package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
- package/dist/_internal/server/features/checkout/source-context.js +157 -0
- package/dist/_internal/server/features/homepage/index.d.ts +0 -1
- package/dist/_internal/server/features/homepage/index.js +7 -1
- package/dist/_internal/server/features/lottery/adapters.js +4 -0
- package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
- package/dist/_internal/server/features/offers/adapters.js +88 -0
- package/dist/_internal/server/features/offers/index.d.ts +2 -0
- package/dist/_internal/server/features/offers/index.js +1 -0
- package/dist/_internal/server/features/orders/adapters.js +24 -0
- package/dist/_internal/server/features/products/data.js +15 -37
- package/dist/_internal/server/features/products/index.d.ts +1 -1
- package/dist/_internal/server/features/products/index.js +1 -1
- package/dist/_internal/server/features/products/list-public.d.ts +46 -20
- package/dist/_internal/server/features/products/list-public.js +266 -90
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
- package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
- package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
- package/dist/_internal/server/features/site-settings/adapters.js +75 -0
- package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
- package/dist/_internal/server/features/site-settings/index.js +1 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
- package/dist/_internal/server/features/stores/adapters.js +91 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
- package/dist/_internal/server/jobs/core/offerExpiry.js +55 -19
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
- package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
- package/dist/_internal/server/jobs/handlers/messages.js +10 -0
- package/dist/_internal/shared/actions/action-registry.js +17 -1
- package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
- package/dist/_internal/shared/checkout/lanes.js +26 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
- package/dist/_internal/shared/features/auctions/config.js +27 -0
- package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
- package/dist/_internal/shared/features/auctions/schema.js +13 -1
- package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
- package/dist/_internal/shared/features/cart/schema.d.ts +20 -15
- package/dist/_internal/shared/features/cart/schema.js +15 -0
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
- package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
- package/dist/_internal/shared/features/emi/schedule.js +20 -5
- package/dist/_internal/shared/features/events/schema.d.ts +2 -2
- package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
- package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
- package/dist/_internal/shared/features/offers/config.d.ts +30 -0
- package/dist/_internal/shared/features/offers/config.js +59 -0
- package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
- package/dist/_internal/shared/features/products/schema.d.ts +30 -30
- package/dist/_internal/shared/features/products/to-product-item.js +6 -0
- package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
- package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
- package/dist/_internal/shared/features/site-settings/fees.js +39 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
- package/dist/_internal/shared/features/site-settings/types.js +1 -0
- package/dist/_internal/shared/history/history.d.ts +88 -0
- package/dist/_internal/shared/history/history.js +198 -0
- package/dist/_internal/shared/history/index.d.ts +4 -0
- package/dist/_internal/shared/history/index.js +2 -0
- package/dist/_internal/shared/history/types.d.ts +61 -0
- package/dist/_internal/shared/history/types.js +6 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
- package/dist/_internal/shared/listing-types/_registry.js +67 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/art/config.js +5 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
- package/dist/_internal/shared/listing-types/auction/config.js +21 -0
- package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
- package/dist/_internal/shared/listing-types/availability.js +104 -0
- package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
- package/dist/_internal/shared/listing-types/capabilities.js +12 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/classified/config.js +5 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
- package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/live/config.js +5 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/standard/config.js +5 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
- package/dist/client.d.ts +20 -7
- package/dist/client.js +22 -4
- package/dist/constants/api-endpoints.d.ts +6 -0
- package/dist/constants/api-endpoints.js +2 -0
- package/dist/constants/field-names.d.ts +57 -8
- package/dist/constants/field-names.js +101 -8
- package/dist/constants/table-keys.d.ts +17 -0
- package/dist/constants/table-keys.js +17 -0
- package/dist/errors/error-codes.d.ts +13 -1
- package/dist/errors/error-codes.js +13 -1
- package/dist/errors/error-display-map.js +12 -3
- package/dist/errors/messages.d.ts +10 -2
- package/dist/errors/messages.js +10 -2
- package/dist/features/about/components/AboutView.d.ts +3 -0
- package/dist/features/about/components/AboutView.js +3 -2
- package/dist/features/about/components/PolicyPageView.d.ts +2 -1
- package/dist/features/about/components/PolicyPageView.js +61 -23
- package/dist/features/about/components/PublicProfileView.js +5 -0
- package/dist/features/about/schemas/firestore.d.ts +3 -0
- package/dist/features/account/components/UserBidsView.js +12 -4
- package/dist/features/account/components/UserOrdersView.js +7 -0
- package/dist/features/account/components/UserReturnsView.d.ts +3 -0
- package/dist/features/account/components/UserReturnsView.js +17 -1
- package/dist/features/account/components/index.d.ts +0 -2
- package/dist/features/account/components/index.js +0 -1
- package/dist/features/account/schemas/index.d.ts +2 -2
- package/dist/features/account/types/index.d.ts +21 -2
- package/dist/features/addresses/schemas/index.d.ts +4 -4
- package/dist/features/admin/components/AdminArtView.js +8 -3
- package/dist/features/admin/components/AdminAuditLogView.js +1 -0
- package/dist/features/admin/components/AdminBidsView.js +15 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
- package/dist/features/admin/components/AdminClassifiedView.js +8 -3
- package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
- package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
- package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
- package/dist/features/admin/components/AdminLiveView.js +8 -3
- package/dist/features/admin/components/AdminNavEditorView.js +15 -5
- package/dist/features/admin/components/AdminNewsletterView.js +18 -2
- package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
- package/dist/features/admin/components/AdminOffersView.js +230 -0
- package/dist/features/admin/components/AdminOrdersView.js +10 -1
- package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
- package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
- package/dist/features/admin/components/AdminProductsView.js +16 -29
- package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
- package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
- package/dist/features/admin/components/AdminScammersView.js +3 -8
- package/dist/features/admin/components/AdminSectionsView.js +32 -23
- package/dist/features/admin/components/AdminSessionsView.js +17 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
- package/dist/features/admin/components/AdminSiteView.js +6 -2
- package/dist/features/admin/components/AdminStickersView.js +8 -3
- package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
- package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
- package/dist/features/admin/constants/filter-tabs.d.ts +89 -0
- package/dist/features/admin/constants/filter-tabs.js +56 -0
- package/dist/features/admin/schemas/firestore.d.ts +122 -3
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
- package/dist/features/admin/schemas/homepage-section-form.js +68 -0
- package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
- package/dist/features/admin/schemas/nav-item-form.js +72 -0
- package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
- package/dist/features/auctions/actions/bid-actions.js +93 -20
- package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
- package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
- package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
- package/dist/features/auctions/components/AuctionsListView.js +5 -6
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
- package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
- package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
- package/dist/features/auctions/components/bid-detail-fields.js +103 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
- package/dist/features/auctions/repository/bid.repository.js +23 -0
- package/dist/features/auctions/schemas/firestore.d.ts +17 -0
- package/dist/features/auctions/schemas/index.d.ts +12 -12
- package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
- package/dist/features/audit-log/schemas/firestore.js +7 -0
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +10 -1
- package/dist/features/blog/actions/blog-actions.d.ts +7 -7
- package/dist/features/blog/schemas/blog-form.d.ts +80 -0
- package/dist/features/blog/schemas/blog-form.js +100 -0
- package/dist/features/blog/schemas/index.d.ts +6 -6
- package/dist/features/cart/repository/cart.repository.js +1 -0
- package/dist/features/cart/schemas/firestore.d.ts +15 -0
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/categories/components/BrandDetailPageView.js +23 -40
- package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
- package/dist/features/categories/components/BrandDetailTabs.js +8 -12
- package/dist/features/categories/components/BundleCollage.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
- package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
- package/dist/features/categories/components/CategoryProductsListing.js +11 -1
- package/dist/features/categories/components/ConcernCard.js +7 -1
- package/dist/features/categories/schemas/firestore.d.ts +13 -0
- package/dist/features/categories/schemas/index.d.ts +26 -26
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
- package/dist/features/events/components/AdminEventEditorView.js +32 -54
- package/dist/features/events/components/AdminEventEntriesView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +15 -11
- package/dist/features/events/components/EventFilters.d.ts +9 -1
- package/dist/features/events/components/EventFilters.js +45 -21
- package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
- package/dist/features/events/components/EventsIndexListing.js +2 -2
- package/dist/features/events/components/EventsListPageView.js +13 -4
- package/dist/features/events/repository/events.repository.d.ts +17 -0
- package/dist/features/events/repository/events.repository.js +27 -0
- package/dist/features/events/schemas/event-form.d.ts +113 -0
- package/dist/features/events/schemas/event-form.js +82 -0
- package/dist/features/events/schemas/firestore.d.ts +12 -0
- package/dist/features/events/schemas/firestore.js +12 -0
- package/dist/features/events/schemas/index.d.ts +50 -50
- package/dist/features/events/types/index.d.ts +11 -0
- package/dist/features/events/types/index.js +57 -1
- package/dist/features/faq/actions/faq-actions.d.ts +12 -12
- package/dist/features/faq/schemas/index.d.ts +8 -8
- package/dist/features/filters/FilterFacetSection.d.ts +7 -1
- package/dist/features/filters/FilterFacetSection.js +11 -3
- package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
- package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
- package/dist/features/grouped/schemas/index.d.ts +4 -4
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
- package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
- package/dist/features/homepage/components/AnnouncementBar.js +3 -3
- package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
- package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
- package/dist/features/homepage/hooks/homepage-query.js +45 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
- package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
- package/dist/features/homepage/schemas/index.d.ts +33 -2
- package/dist/features/homepage/schemas/index.js +24 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -1
- package/dist/features/layout/AppLayoutShell.js +15 -14
- package/dist/features/layout/BackToTop.d.ts +9 -0
- package/dist/features/layout/BackToTop.js +10 -1
- package/dist/features/layout/BottomActions.js +28 -25
- package/dist/features/layout/BottomChrome.d.ts +34 -0
- package/dist/features/layout/BottomChrome.js +55 -0
- package/dist/features/layout/BottomNavLayout.d.ts +6 -0
- package/dist/features/layout/BottomNavLayout.js +7 -1
- package/dist/features/layout/BottomNavbar.js +15 -2
- package/dist/features/layout/FooterLayout.js +11 -1
- package/dist/features/layout/NavbarLayout.js +1 -1
- package/dist/features/layout/TitleBarLayout.d.ts +7 -0
- package/dist/features/layout/TitleBarLayout.js +28 -5
- package/dist/features/layout/index.d.ts +2 -0
- package/dist/features/layout/index.js +1 -0
- package/dist/features/lottery/types/index.d.ts +3 -0
- package/dist/features/media/MediaPickerModal.js +5 -1
- package/dist/features/messages/schemas/index.d.ts +2 -2
- package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
- package/dist/features/orders/components/OrderScopeTabs.js +31 -0
- package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
- package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
- package/dist/features/orders/constants/order-scope.d.ts +48 -0
- package/dist/features/orders/constants/order-scope.js +111 -0
- package/dist/features/orders/repository/orders.repository.d.ts +54 -7
- package/dist/features/orders/repository/orders.repository.js +121 -22
- package/dist/features/orders/schemas/firestore.d.ts +152 -0
- package/dist/features/orders/schemas/firestore.js +30 -0
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/orders/types/index.d.ts +35 -7
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
- package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
- package/dist/features/pre-orders/schemas/index.d.ts +1 -1
- package/dist/features/products/actions/product-actions.d.ts +14 -0
- package/dist/features/products/actions/product-actions.js +49 -11
- package/dist/features/products/api/route.d.ts +12 -0
- package/dist/features/products/api/route.js +42 -100
- package/dist/features/products/components/ArtStickersListView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.js +13 -11
- package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
- package/dist/features/products/components/AvailabilityTabs.js +47 -0
- package/dist/features/products/components/GroupSettingsPanel.js +5 -1
- package/dist/features/products/components/MakeOfferButton.js +48 -49
- package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
- package/dist/features/products/components/PrizeDrawCollage.js +9 -1
- package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
- package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
- package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
- package/dist/features/products/components/PrizeDrawsSection.js +23 -18
- package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +5 -2
- package/dist/features/products/components/ProductGrid.js +6 -1
- package/dist/features/products/components/ProductsIndexListing.js +22 -32
- package/dist/features/products/components/ProductsIndexPageView.js +6 -9
- package/dist/features/products/components/index.d.ts +2 -2
- package/dist/features/products/components/index.js +1 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
- package/dist/features/products/config/listing-type-listing-config.js +22 -10
- package/dist/features/products/constants/action-defs.d.ts +2 -0
- package/dist/features/products/constants/action-defs.js +6 -0
- package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
- package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
- package/dist/features/products/hooks/useProducts.d.ts +5 -0
- package/dist/features/products/hooks/useProducts.js +13 -2
- package/dist/features/products/repository/products.repository.d.ts +31 -2
- package/dist/features/products/repository/products.repository.js +53 -21
- package/dist/features/products/schemas/firestore.d.ts +17 -3
- package/dist/features/products/schemas/firestore.js +7 -2
- package/dist/features/products/schemas/index.d.ts +64 -64
- package/dist/features/products/schemas/product-features.validators.d.ts +79 -6
- package/dist/features/products/schemas/product-features.validators.js +63 -0
- package/dist/features/products/types/index.d.ts +16 -1
- package/dist/features/promotions/schemas/index.d.ts +2 -2
- package/dist/features/reviews/schemas/index.d.ts +16 -16
- package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
- package/dist/features/scams/constants/scammer-status-display.js +79 -0
- package/dist/features/search/schemas/index.d.ts +4 -4
- package/dist/features/seller/actions/offer-actions.js +57 -4
- package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
- package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
- package/dist/features/seller/components/SellerArtView.js +5 -0
- package/dist/features/seller/components/SellerAuctionsView.js +13 -15
- package/dist/features/seller/components/SellerBidsView.js +11 -4
- package/dist/features/seller/components/SellerClassifiedView.js +5 -0
- package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
- package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
- package/dist/features/seller/components/SellerLiveView.js +5 -0
- package/dist/features/seller/components/SellerOffersView.js +2 -1
- package/dist/features/seller/components/SellerOrdersView.js +31 -9
- package/dist/features/seller/components/SellerPayoutSettingsView.js +56 -31
- package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
- package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
- package/dist/features/seller/components/SellerProductShell.js +7 -1
- package/dist/features/seller/components/SellerProductsView.js +11 -8
- package/dist/features/seller/components/SellerStickersView.js +5 -0
- package/dist/features/seller/components/index.d.ts +0 -2
- package/dist/features/seller/components/index.js +0 -1
- package/dist/features/seller/repository/offer.repository.d.ts +142 -24
- package/dist/features/seller/repository/offer.repository.js +165 -26
- package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
- package/dist/features/seller/schemas/coupon-form.js +116 -0
- package/dist/features/seller/schemas/firestore.d.ts +56 -2
- package/dist/features/seller/schemas/firestore.js +27 -0
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/seller/schemas/offer-forms.d.ts +46 -0
- package/dist/features/seller/schemas/offer-forms.js +42 -0
- package/dist/features/seller/server.d.ts +0 -1
- package/dist/features/seller/server.js +0 -1
- package/dist/features/shell/SectionForm.d.ts +99 -0
- package/dist/features/shell/SectionForm.js +128 -0
- package/dist/features/shell/build-sections.d.ts +63 -0
- package/dist/features/shell/build-sections.js +207 -0
- package/dist/features/shell/entity-form.d.ts +109 -0
- package/dist/features/shell/entity-form.js +96 -0
- package/dist/features/shell/field-ui-meta.d.ts +115 -0
- package/dist/features/shell/field-ui-meta.js +324 -0
- package/dist/features/shell/index.d.ts +8 -0
- package/dist/features/shell/index.js +4 -0
- package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
- package/dist/features/status-history/components/StatusTimeline.js +46 -0
- package/dist/features/status-history/index.d.ts +11 -0
- package/dist/features/status-history/index.js +10 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
- package/dist/features/store-extensions/index.d.ts +12 -0
- package/dist/features/store-extensions/index.js +12 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
- package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
- package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
- package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
- package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
- package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
- package/dist/features/store-extensions/schemas/firestore.js +60 -0
- package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
- package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
- package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
- package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
- package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
- package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
- package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
- package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
- package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
- package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
- package/dist/features/stores/api/[storeSlug]/route.js +2 -25
- package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
- package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
- package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
- package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
- package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
- package/dist/features/stores/components/StoreProductsListing.js +11 -1
- package/dist/features/stores/repository/store.repository.js +6 -0
- package/dist/features/stores/schemas/index.d.ts +6 -6
- package/dist/features/support/schemas/index.d.ts +4 -4
- package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
- package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
- package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +431 -1
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/index.d.ts +25 -12
- package/dist/index.js +26 -11
- package/dist/next/routing/route-map.d.ts +23 -3
- package/dist/next/routing/route-map.js +14 -2
- package/dist/providers/db-firebase/base.repository.d.ts +30 -0
- package/dist/providers/db-firebase/base.repository.js +50 -1
- package/dist/providers/db-firebase/index.d.ts +1 -1
- package/dist/providers/db-firebase/index.js +1 -1
- package/dist/providers/db-firebase/sieve.d.ts +25 -0
- package/dist/providers/db-firebase/sieve.js +52 -18
- package/dist/react/hooks/useUrlTable.js +10 -1
- package/dist/schemas/firestore-value.d.ts +8 -0
- package/dist/schemas/firestore-value.js +44 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/registry.d.ts +702 -69
- package/dist/schemas/registry.js +64 -1
- package/dist/seed/_helpers/category-forest.d.ts +2 -0
- package/dist/seed/_helpers/category-forest.js +309 -0
- package/dist/seed/_helpers/category-tree.d.ts +27 -0
- package/dist/seed/_helpers/category-tree.js +103 -0
- package/dist/seed/bids-seed-data.js +30 -0
- package/dist/seed/catalogue-seed-data.js +12 -12
- package/dist/seed/categories-seed-data.js +177 -162
- package/dist/seed/events-seed-data.js +61 -10
- package/dist/seed/homepage-sections-seed-data.js +5 -1
- package/dist/seed/offers-seed-data.js +244 -34
- package/dist/seed/orders-seed-data.js +336 -1
- package/dist/seed/products-art-seed-data.js +50 -12
- package/dist/seed/products-auctions-seed-data.js +138 -18
- package/dist/seed/products-classifieds-seed-data.js +80 -16
- package/dist/seed/products-digital-codes-seed-data.js +66 -18
- package/dist/seed/products-live-items-seed-data.js +64 -13
- package/dist/seed/products-preorders-seed-data.d.ts +0 -1
- package/dist/seed/products-preorders-seed-data.js +52 -13
- package/dist/seed/products-prize-draws-seed-data.js +63 -14
- package/dist/seed/products-standard-seed-data.js +99 -26
- package/dist/seed/products-stickers-seed-data.js +47 -12
- package/dist/seed/reviews-seed-data.js +6 -1
- package/dist/seed/site-settings-seed-data.d.ts +1 -38
- package/dist/seed/site-settings-seed-data.js +38 -76
- package/dist/seed/stores-seed-data.js +71 -1
- package/dist/seed/users-seed-data.js +15 -5
- package/dist/server-entry.d.ts +1 -2
- package/dist/server-entry.js +4 -3
- package/dist/server.d.ts +6 -3
- package/dist/server.js +13 -4
- package/dist/styles.css +78 -12
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.style.css +19 -4
- package/dist/ui/components/CollapsibleSection.d.ts +17 -1
- package/dist/ui/components/CollapsibleSection.js +6 -2
- package/dist/ui/components/FilterChipGroup.d.ts +25 -1
- package/dist/ui/components/FilterChipGroup.js +21 -4
- package/dist/ui/components/HandMode.style.css +47 -0
- package/dist/ui/components/Layout.d.ts +9 -2
- package/dist/ui/components/Layout.js +1 -1
- package/dist/ui/components/ListingLayout.js +8 -8
- package/dist/ui/components/ListingLayout.style.css +8 -7
- package/dist/ui/components/RecordDetailModal.d.ts +10 -1
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/components/StickyToolbar.d.ts +3 -1
- package/dist/ui/components/StickyToolbar.js +62 -20
- package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
- package/dist/ui/components/bottom-chrome-slot.js +29 -0
- package/dist/ui/components/index.style.css +3 -0
- package/dist/ui/forms/FormShell.d.ts +43 -13
- package/dist/ui/forms/FormShell.js +22 -11
- package/dist/ui/forms/index.d.ts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/package.json +2 -1
- package/scripts/node-esm-loader.mjs +65 -0
- package/scripts/seed-cli-loader.mjs +6 -49
- package/scripts/seed-cli.mjs +1 -1
|
@@ -10,6 +10,8 @@ import { ROUTES } from "../../../constants/index";
|
|
|
10
10
|
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
11
11
|
import { DataListingView } from "../../admin/components/DataListingView";
|
|
12
12
|
import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
|
|
13
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
14
|
+
const LISTING_TYPES = ["digital-code"];
|
|
13
15
|
const COLUMNS = [
|
|
14
16
|
{ key: "title", header: "Product", render: (row) => _jsx(Text, { size: "sm", weight: "medium", children: row.title }) },
|
|
15
17
|
{ key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
|
|
@@ -63,6 +65,7 @@ export function SellerDigitalCodesView({ onCreateClick, onEditClick, onDelete, o
|
|
|
63
65
|
else
|
|
64
66
|
window.location.href = String(ROUTES.STORE.DIGITAL_CODES_NEW);
|
|
65
67
|
}, [onCreateClick]);
|
|
68
|
+
const scope = useAvailabilityScope(LISTING_TYPES);
|
|
66
69
|
const config = {
|
|
67
70
|
portal: "seller",
|
|
68
71
|
title: "Digital Codes",
|
|
@@ -94,6 +97,8 @@ export function SellerDigitalCodesView({ onCreateClick, onEditClick, onDelete, o
|
|
|
94
97
|
}),
|
|
95
98
|
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
96
99
|
buildFilters: () => "listingType==digital-code",
|
|
100
|
+
buildExtraParams: () => scope.extraParams,
|
|
101
|
+
renderAboveContent: scope.renderAboveContent,
|
|
97
102
|
primaryAction: { label: "New Digital Code", onClick: () => handleCreate() },
|
|
98
103
|
// Mirrors the "Edit" row action below so table rows and cards both navigate on click.
|
|
99
104
|
onRowClick: (row) => handleEdit(row.id),
|
|
@@ -10,6 +10,8 @@ import { ROUTES } from "../../../constants/index";
|
|
|
10
10
|
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
11
11
|
import { DataListingView } from "../../admin/components/DataListingView";
|
|
12
12
|
import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
|
|
13
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
14
|
+
const LISTING_TYPES = ["live"];
|
|
13
15
|
const COLUMNS = [
|
|
14
16
|
{
|
|
15
17
|
key: "title",
|
|
@@ -62,6 +64,7 @@ export function SellerLiveView({ onCreateClick, onEditClick, onDelete, onBulkDel
|
|
|
62
64
|
else
|
|
63
65
|
window.location.href = String(ROUTES.STORE.LIVE_ITEMS_NEW);
|
|
64
66
|
}, [onCreateClick]);
|
|
67
|
+
const scope = useAvailabilityScope(LISTING_TYPES);
|
|
65
68
|
const config = {
|
|
66
69
|
portal: "seller",
|
|
67
70
|
title: "Live Items",
|
|
@@ -94,6 +97,8 @@ export function SellerLiveView({ onCreateClick, onEditClick, onDelete, onBulkDel
|
|
|
94
97
|
}),
|
|
95
98
|
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
96
99
|
buildFilters: () => "listingType==live",
|
|
100
|
+
buildExtraParams: () => scope.extraParams,
|
|
101
|
+
renderAboveContent: scope.renderAboveContent,
|
|
97
102
|
primaryAction: { label: "New Live Item", onClick: () => handleCreate() },
|
|
98
103
|
// Mirrors the "Edit" row action below so table rows and cards both navigate on click.
|
|
99
104
|
onRowClick: (row) => handleEdit(row.id),
|
|
@@ -5,6 +5,7 @@ import { sortBy } from "@mohasinac/appkit/client";
|
|
|
5
5
|
import React from "react";
|
|
6
6
|
import { FilterChipGroup, ListingLayout, RowActionMenu, RecordDetailModal } from "../../../ui";
|
|
7
7
|
import { QuickFormDrawer } from "../../shell/QuickFormDrawer";
|
|
8
|
+
import { OfferPhaseTimeline } from "./OfferPhaseTimeline";
|
|
8
9
|
import { counterOfferFormSchema } from "../schemas/offer-forms";
|
|
9
10
|
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
10
11
|
import { SELLER_OFFER_STATUS_TABS } from "../../admin/constants/filter-tabs";
|
|
@@ -79,7 +80,7 @@ export function SellerOffersView({ children, onAcceptOffer, onRejectOffer, onCou
|
|
|
79
80
|
? [{ label: "Buyer must pay by", value: toRelativeDate(d.checkoutDeadline) }]
|
|
80
81
|
: []),
|
|
81
82
|
...(d.sellerNote ? [{ label: "Your note", value: toStringValue(d.sellerNote, "") }] : []),
|
|
82
|
-
] }), _jsx(QuickFormDrawer, { isOpen: counterRow !== null, onClose: () => setCounterRow(null), title: `Counter offer — ${counterRow?.primary ?? ""}`, submitLabel: "Send counter", isLoading: isCountering, schema: counterOfferFormSchema, fields: [
|
|
83
|
+
], extra: _jsx(OfferPhaseTimeline, { status: toStringValue(d.status, "pending"), timeline: d.timeline, timelineTruncated: d.timelineTruncated, superseded: Boolean(d.superseded), createdAt: toStringValue(d.createdAt, ""), respondedAt: toStringValue(d.respondedAt, ""), acceptedAt: toStringValue(d.acceptedAt, ""), paidAt: toStringValue(d.paidAt, ""), chain: d.chain }) }), _jsx(QuickFormDrawer, { isOpen: counterRow !== null, onClose: () => setCounterRow(null), title: `Counter offer — ${counterRow?.primary ?? ""}`, submitLabel: "Send counter", isLoading: isCountering, schema: counterOfferFormSchema, fields: [
|
|
83
84
|
{
|
|
84
85
|
name: "counterAmount",
|
|
85
86
|
label: "Your counter price (₹)",
|
|
@@ -10,6 +10,8 @@ import { useActionDispatch } from "../../../react/hooks/use-action-dispatch";
|
|
|
10
10
|
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
11
11
|
import { Badge, Button, Div, FilterChipGroup, Heading, Input, Select, SideDrawer, Span, Stack, Text, useToast } from "../../../ui";
|
|
12
12
|
import { SELLER_ORDER_STATUS_TABS } from "../../admin/constants/filter-tabs";
|
|
13
|
+
import { useOrderScope } from "../../orders/components/OrderScopeTabs";
|
|
14
|
+
import { OrderStatusValues } from "../../orders/schemas/firestore";
|
|
13
15
|
import { isManualPaymentMethod } from "../../orders/constants/payment-window";
|
|
14
16
|
import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
15
17
|
import { buildBulkAction } from "../../../_internal/shared/actions/bulk-helpers";
|
|
@@ -27,13 +29,20 @@ const SORT_OPTIONS = [
|
|
|
27
29
|
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
28
30
|
];
|
|
29
31
|
const STATUS_OPTIONS = SELLER_ORDER_STATUS_TABS;
|
|
32
|
+
// Keyed on the STORED lowercase values, and covering all nine. It was keyed
|
|
33
|
+
// UPPERCASE and read via `status.toUpperCase()` — the only consumer in the
|
|
34
|
+
// codebase doing that — and covered six, so `confirmed`, `return_requested`
|
|
35
|
+
// and `returned` all fell through to the neutral default badge.
|
|
30
36
|
const STATUS_BADGE_VARIANT = {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
pending: "default",
|
|
38
|
+
confirmed: "info",
|
|
39
|
+
processing: "warning",
|
|
40
|
+
shipped: "info",
|
|
41
|
+
delivered: "success",
|
|
42
|
+
cancelled: "danger",
|
|
43
|
+
refunded: "danger",
|
|
44
|
+
return_requested: "warning",
|
|
45
|
+
returned: "danger",
|
|
37
46
|
};
|
|
38
47
|
const UPDATE_STATUS_OPTIONS = [
|
|
39
48
|
{ value: "", label: "— keep current —" },
|
|
@@ -168,7 +177,7 @@ export function SellerOrderDetailPanel({ orderId, apiBase, onClose, }) {
|
|
|
168
177
|
};
|
|
169
178
|
const addr = order?.shippingAddress ?? {};
|
|
170
179
|
const addrLine = [addr.addressLine1, addr.city, addr.state, addr.pincode].filter(Boolean).join(", ");
|
|
171
|
-
return (_jsxs(_Fragment, { children: [loading && (_jsx(Row, { align: "center", justify: "center", padding: "y-4xl", children: _jsx(Div, { className: "h-6 w-6 animate-spin border-2 border-[var(--appkit-color-primary)] border-t-transparent", rounded: "full" }) })), fetchError && (_jsx(Div, { textSize: "sm", className: "mx-4 mt-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "lg", children: fetchError })), order && !loading && (_jsxs(Stack, { gap: "none", children: [_jsxs(Stack, { className: `flex-1 ${__O.yAuto}`, gap: "5", padding: "md", children: [_jsxs(Row, { align: "center", justify: "between", children: [_jsx(Badge, { variant: STATUS_BADGE_VARIANT[order.status
|
|
180
|
+
return (_jsxs(_Fragment, { children: [loading && (_jsx(Row, { align: "center", justify: "center", padding: "y-4xl", children: _jsx(Div, { className: "h-6 w-6 animate-spin border-2 border-[var(--appkit-color-primary)] border-t-transparent", rounded: "full" }) })), fetchError && (_jsx(Div, { textSize: "sm", className: "mx-4 mt-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "lg", children: fetchError })), order && !loading && (_jsxs(Stack, { gap: "none", children: [_jsxs(Stack, { className: `flex-1 ${__O.yAuto}`, gap: "5", padding: "md", children: [_jsxs(Row, { align: "center", justify: "between", children: [_jsx(Badge, { variant: STATUS_BADGE_VARIANT[order.status ?? ""] ?? "default", children: order.status ?? "Unknown" }), _jsx(Text, { size: "sm", className: "text-[var(--appkit-color-text-secondary)]", children: toRelativeDate(order.createdAt) })] }), (order.items ?? []).length > 0 && (_jsxs(Div, { children: [_jsx(Text, { size: "sm", className: "text-[var(--appkit-color-text-primary)] mb-2", weight: "semibold", children: "Items" }), _jsx(Div, { className: "divide-y divide-[var(--appkit-color-border)] divide-[var(--appkit-color-border)] border border-[var(--appkit-color-border)]", rounded: "lg", children: (order.items ?? []).map((item, i) => (_jsxs(Row, { paddingY: "y-xs-tall", padding: "x-sm", align: "center", justify: "between", gap: "3", children: [_jsxs(Row, { align: "center", gap: "sm", className: "min-w-0", children: [_jsx(Div, { className: "h-10 w-10 shrink-0", rounded: "md", overflow: "hidden", children: _jsx(MediaImage, { src: item.image, alt: item.title ?? "Order item", size: "thumbnail" }) }), _jsxs(Div, { className: "min-w-0", children: [_jsx(Text, { size: "sm", className: "truncate", weight: "medium", children: item.title ?? item.productId ?? "Item" }), _jsxs(Text, { size: "xs", className: "text-[var(--appkit-color-text-secondary)]", children: ["Qty: ", item.quantity ?? 1] })] })] }), _jsx(Text, { size: "sm", className: "shrink-0", weight: "medium", children: toCurrency(item.price ?? 0) })] }, i))) })] })), _jsx(OrderAddonBadges, { order: order, variant: "detail" }), order.giftWrapAddon && (_jsxs(Div, { className: "border border-[var(--appkit-color-primary-200)] dark:border-[var(--appkit-color-primary-800)]", surface: "subtle", padding: "inline", rounded: "lg", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "\uD83C\uDF81 Gift wrap requested" }), order.giftWrapMessage && (_jsxs(Text, { size: "sm", className: "mt-1 text-[var(--appkit-color-text-secondary)]", children: ["\u201C", order.giftWrapMessage, "\u201D"] }))] })), _jsxs(Row, { surface: "muted", padding: "inline", align: "center", justify: "between", rounded: "lg", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Total" }), _jsx(Text, { size: "sm", className: "text-[var(--appkit-color-primary)]", weight: "bold", children: toCurrency(order.totalAmount ?? 0) })] }), addrLine && (_jsxs(Div, { children: [_jsx(Text, { size: "sm", className: "mb-1", weight: "semibold", children: "Shipping address" }), _jsx(Text, { size: "sm", className: "text-[var(--appkit-color-text-secondary)]", children: [String(addr.fullName ?? ""), addrLine].filter(Boolean).join(" · ") })] })), order.paymentMethod && (_jsxs(Div, { children: [_jsxs(Row, { align: "center", justify: "between", className: "mb-1", gap: "3", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Payment" }), isManualPaymentMethod(order.paymentMethod) && (_jsx(Badge, { variant: sellerPaymentBadge(order).variant, children: sellerPaymentBadge(order).label }))] }), _jsx(Text, { size: "sm", className: "text-[var(--appkit-color-text-secondary)]", transform: "capitalize", children: order.paymentMethod }), isManualPaymentMethod(order.paymentMethod) && order.paymentTransactionId && (_jsxs(Text, { size: "xs", color: "muted", className: "mt-1", children: ["UTR: ", order.paymentTransactionId] }))] })), order.emiEnabled && (_jsxs(Div, { className: "border-t border-[var(--appkit-color-border)]", padding: "t-md", children: [_jsxs(Row, { align: "center", justify: "between", className: "mb-2", children: [_jsxs(Text, { size: "sm", weight: "semibold", children: ["EMI plan ", order.emiTenureMonths ? `· ${order.emiTenureMonths} months` : ""] }), _jsx(Badge, { variant: order.emiComplete ? "success" : "warning", children: order.emiComplete ? "Fully paid" : "In progress" })] }), _jsxs(Row, { align: "center", justify: "between", className: "mb-2", children: [_jsx(Text, { size: "xs", color: "muted", children: "Token collected" }), _jsx(Text, { size: "xs", weight: "medium", children: toCurrency(order.emiTokenAmount ?? 0) })] }), _jsxs(Row, { align: "center", justify: "between", className: "mb-3", children: [_jsx(Text, { size: "xs", color: "muted", children: "Remaining balance" }), _jsx(Text, { size: "xs", weight: "medium", children: toCurrency(order.emiRemainingBalance ?? 0) })] }), _jsx(Div, { className: "divide-y divide-[var(--appkit-color-border)] border border-[var(--appkit-color-border)]", rounded: "lg", children: (order.emiInstallments ?? []).map((inst) => (_jsxs(Row, { paddingY: "y-xs-tall", padding: "x-sm", align: "center", justify: "between", gap: "3", children: [_jsxs(Div, { className: "min-w-0", children: [_jsxs(Text, { size: "sm", weight: "medium", children: ["Installment ", inst.index, " \u00B7 ", toCurrency(inst.amount)] }), _jsx(Text, { size: "xs", color: "muted", children: inst.status === "paid" && inst.paidAt
|
|
172
181
|
? `Paid ${toRelativeDate(inst.paidAt)}`
|
|
173
182
|
: inst.dueDate
|
|
174
183
|
? `Due ${toRelativeDate(inst.dueDate)}`
|
|
@@ -266,7 +275,7 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
|
|
|
266
275
|
key: "status",
|
|
267
276
|
header: "Status",
|
|
268
277
|
className: "w-32",
|
|
269
|
-
render: (row) => (_jsx(Badge, { variant: STATUS_BADGE_VARIANT[row.status
|
|
278
|
+
render: (row) => (_jsx(Badge, { variant: STATUS_BADGE_VARIANT[row.status ?? ""] ?? "default", children: row.status })),
|
|
270
279
|
},
|
|
271
280
|
{
|
|
272
281
|
key: "physicalLocation",
|
|
@@ -281,6 +290,7 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
|
|
|
281
290
|
render: (row) => _jsx(Span, { size: "xs", color: "muted", children: row.updatedAt }),
|
|
282
291
|
},
|
|
283
292
|
];
|
|
293
|
+
const orderScope = useOrderScope();
|
|
284
294
|
const config = {
|
|
285
295
|
portal: "seller",
|
|
286
296
|
title: "Orders",
|
|
@@ -313,7 +323,12 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
|
|
|
313
323
|
};
|
|
314
324
|
}),
|
|
315
325
|
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
326
|
+
// The scope narrows; the status chip drills down inside it. Both are
|
|
327
|
+
// emitted — an explicit status always wins, since picking "Delivered"
|
|
328
|
+
// while sitting on Active should show delivered orders, not nothing.
|
|
316
329
|
buildFilters: (state) => (state.status && state.status !== "All" ? sieveFilter("status", SIEVE_OP.EQ, state.status) : undefined),
|
|
330
|
+
buildExtraParams: () => orderScope.extraParams,
|
|
331
|
+
renderAboveContent: orderScope.renderAboveContent,
|
|
317
332
|
renderFilterPanel: ({ pendingFilters, setPendingFilters }) => (_jsx(FilterChipGroup, { label: "Status", tabs: STATUS_OPTIONS, value: pendingFilters.status ?? "", onChange: (id) => setPendingFilters((p) => ({ ...p, status: id })) })),
|
|
318
333
|
buildBulkActions: (selection) => {
|
|
319
334
|
const handlePrintPackingSlips = () => {
|
|
@@ -330,7 +345,14 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
|
|
|
330
345
|
];
|
|
331
346
|
},
|
|
332
347
|
renderRowActions: (row) => {
|
|
333
|
-
|
|
348
|
+
// Compared against the stored lowercase values, like every other
|
|
349
|
+
// consumer — the uppercase form here was a local convention that only
|
|
350
|
+
// worked because of the `.toUpperCase()` alongside it.
|
|
351
|
+
const isShippable = [
|
|
352
|
+
OrderStatusValues.PENDING,
|
|
353
|
+
OrderStatusValues.PROCESSING,
|
|
354
|
+
OrderStatusValues.CONFIRMED,
|
|
355
|
+
].includes(row.status ?? "");
|
|
334
356
|
return (_jsxs(Row, { align: "center", gap: "xs", children: [isShippable && (_jsx(Button, { variant: "ghost", size: "sm", onClick: (e) => void handleQuickShip(row, e), "aria-label": "Mark as shipped", title: "Mark shipped", isLoading: shippingRowId === row.id, disabled: shippingRowId !== null, children: _jsx(Truck, { className: "h-4 w-4" }) })), _jsx(Button, { variant: "ghost", size: "sm", onClick: (e) => { e.stopPropagation(); setSelectedOrderId(row.id); }, title: "View order details", "aria-label": "View order details", children: _jsx(Eye, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: (e) => {
|
|
335
357
|
e.stopPropagation();
|
|
336
358
|
void dispatch({ type: "NAVIGATE", href: String(ROUTES.STORE.ORDER_DETAIL(row.id)) });
|
|
@@ -5,7 +5,7 @@ import { z } from "zod";
|
|
|
5
5
|
import { Alert, Badge, Checkbox, Div, FormField, FormGroup, Heading, Label, Row, Stack, Text, Toggle } from "../../../ui";
|
|
6
6
|
import { StackedViewShell } from "../../../ui";
|
|
7
7
|
import { FormShellContext, useFormShellState, applyZodIssues, FormErrorSummary } from "../../../ui/forms";
|
|
8
|
-
import {
|
|
8
|
+
import { SectionForm, useSectionFormNav, annotate } from "../../shell";
|
|
9
9
|
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
10
10
|
import { normalizeError } from "../../../errors/normalize";
|
|
11
11
|
const __P = {
|
|
@@ -16,20 +16,44 @@ const __P = {
|
|
|
16
16
|
// accountNumber field's helpText below), and the exact keep-existing
|
|
17
17
|
// semantics live server-side; a client-side format requirement risks
|
|
18
18
|
// blocking that legitimate blank-resave case.
|
|
19
|
+
/**
|
|
20
|
+
* Section membership and row span live on the FIELD (W3).
|
|
21
|
+
*
|
|
22
|
+
* The `sections` array below still hand-writes this form's JSX, because its
|
|
23
|
+
* Payout Method panel is genuinely bespoke — a configured/not-configured
|
|
24
|
+
* badge, a "current UPI/bank" alert, and a UPI-vs-bank branch. What is NOT
|
|
25
|
+
* hand-written any more is which field belongs where and how wide it is:
|
|
26
|
+
* that is read off the schema, and `audit-form-field-roundtrip` (W4) can
|
|
27
|
+
* cross-check the two so they cannot drift apart.
|
|
28
|
+
*
|
|
29
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field. It keys a WeakMap
|
|
30
|
+
* by schema instance, and every zod wrapper returns a NEW instance — so
|
|
31
|
+
* `annotate(z.string(), …).optional()` silently loses the metadata and the
|
|
32
|
+
* field falls into the "advanced" fallback section. `audit-field-ui-meta`
|
|
33
|
+
* blocks that ordering.
|
|
34
|
+
*/
|
|
19
35
|
const payoutSettingsDraftSchema = z.object({
|
|
20
|
-
method: z.enum(["upi", "bank_transfer"]),
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
method: annotate(z.enum(["upi", "bank_transfer"]), {
|
|
37
|
+
section: "method", sectionLabel: "Payout Method", sectionRequired: true,
|
|
38
|
+
quick: true, order: 1, row: "pair",
|
|
39
|
+
}),
|
|
40
|
+
upiId: annotate(z.string(), { section: "method", quick: true, order: 2, row: "pair" }),
|
|
41
|
+
accountHolderName: annotate(z.string(), { section: "method", quick: true, order: 3, row: "full" }),
|
|
42
|
+
// Account number and IFSC read as one unit and each needs about half the
|
|
43
|
+
// width — the pairing this whole mechanism exists to make declarative
|
|
44
|
+
// instead of a bare `grid-cols-2` that is two columns wide at 320px.
|
|
45
|
+
accountNumber: annotate(z.string(), { section: "method", quick: true, order: 4, row: "pair" }),
|
|
46
|
+
ifscCode: annotate(z.string(), { section: "method", quick: true, order: 5, row: "pair" }),
|
|
47
|
+
bankName: annotate(z.string(), { section: "method", quick: true, order: 6, row: "pair" }),
|
|
48
|
+
accountType: annotate(z.enum(["savings", "current"]), { section: "method", quick: true, order: 7, row: "pair" }),
|
|
49
|
+
gstin: annotate(z.string(), { section: "tax", sectionLabel: "Tax Info", order: 1, row: "pair" }),
|
|
50
|
+
pan: annotate(z.string(), { section: "tax", order: 2, row: "pair" }),
|
|
51
|
+
businessType: annotate(z.string(), { section: "tax", order: 3, row: "pair" }),
|
|
52
|
+
autoPayout: annotate(z.boolean(), {
|
|
53
|
+
section: "preferences", sectionLabel: "Preferences", order: 1, row: "quarter",
|
|
54
|
+
}),
|
|
55
|
+
minimumThreshold: annotate(z.string(), { section: "preferences", order: 2, row: "pair" }),
|
|
56
|
+
emiEnabled: annotate(z.boolean(), { section: "preferences", order: 3, row: "quarter" }),
|
|
33
57
|
}).superRefine((v, ctx) => {
|
|
34
58
|
if (v.method === "upi") {
|
|
35
59
|
if (!v.upiId.trim()) {
|
|
@@ -73,12 +97,6 @@ export function SellerPayoutSettingsView({ apiBase = SELLER_ENDPOINTS.PAYOUT_SET
|
|
|
73
97
|
const [saving, setSaving] = useState(false);
|
|
74
98
|
const [error, setError] = useState(null);
|
|
75
99
|
const [success, setSuccess] = useState(false);
|
|
76
|
-
const [currentStep, setCurrentStep] = useState(0);
|
|
77
|
-
const { shellCtx, setFieldError, clearErrors, validate } = useFormShellState(payoutSettingsDraftSchema);
|
|
78
|
-
useEffect(() => {
|
|
79
|
-
validate(draft);
|
|
80
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
81
|
-
}, [draft, validate]);
|
|
82
100
|
useEffect(() => {
|
|
83
101
|
fetch(apiBase)
|
|
84
102
|
.then((r) => r.json())
|
|
@@ -166,9 +184,17 @@ export function SellerPayoutSettingsView({ apiBase = SELLER_ENDPOINTS.PAYOUT_SET
|
|
|
166
184
|
}
|
|
167
185
|
};
|
|
168
186
|
const busy = loading || saving;
|
|
169
|
-
|
|
187
|
+
// Payout Method is the only section that must be filled for the record to be
|
|
188
|
+
// valid — the schema's superRefine rejects an empty UPI ID or bank name and
|
|
189
|
+
// nothing else. Tax Info is explicitly optional, and Preferences all have
|
|
190
|
+
// working defaults. So it is the required-first section, and the other two
|
|
191
|
+
// start collapsed.
|
|
192
|
+
const sections = useMemo(() => [
|
|
170
193
|
{
|
|
194
|
+
id: "method",
|
|
171
195
|
label: "Payout Method",
|
|
196
|
+
required: true,
|
|
197
|
+
quick: true,
|
|
172
198
|
fields: ["method", "upiId", "accountHolderName", "accountNumber", "ifscCode", "bankName", "accountType"],
|
|
173
199
|
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Payout Method" }), current && (_jsx(Row, { className: "mb-2", align: "center", gap: "sm", children: _jsx(Badge, { variant: current.isConfigured ? "success" : "warning", children: current.isConfigured ? "Payout configured" : "Not configured" }) })), current?.isConfigured && (_jsx(Alert, { variant: "info", children: current.method === "upi"
|
|
174
200
|
? `Current UPI: ${current.upiId}`
|
|
@@ -178,26 +204,25 @@ export function SellerPayoutSettingsView({ apiBase = SELLER_ENDPOINTS.PAYOUT_SET
|
|
|
178
204
|
]).map(({ value, label, desc }) => (_jsxs("label", { className: "flex items-center gap-[var(--appkit-space-3)] p-[var(--appkit-space-3)] rounded-lg border border-[var(--appkit-color-border)] cursor-pointer has-[:checked]:border-[var(--appkit-color-primary)] has-[:checked]:bg-[var(--appkit-color-primary)]/5", children: [_jsx(Checkbox, { bare: true, type: "radio", name: "payoutMethod", value: value, checked: values.method === value, onChange: () => onChange({ method: value }), className: "accent-[var(--appkit-color-primary)]", disabled: busy }), _jsxs(Div, { children: [_jsx(Text, { weight: "medium", children: label }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: desc })] })] }, value))) }), values.method === "upi" && (_jsx(FormField, { name: "upiId", label: "UPI ID (VPA)", type: "text", value: values.upiId, onChange: (v) => onChange({ upiId: v }), placeholder: "yourname@upi", helpText: "Ensure this VPA is registered and active.", disabled: busy })), values.method === "bank_transfer" && (_jsxs(Stack, { gap: "md", className: "mt-2", children: [_jsx(FormField, { name: "accountHolderName", label: "Account Holder Name", type: "text", value: values.accountHolderName, onChange: (v) => onChange({ accountHolderName: v }), placeholder: "Name as on bank account", disabled: busy }), _jsxs(FormGroup, { columns: 2, children: [_jsx(FormField, { name: "accountNumber", label: "Account Number", type: "text", value: values.accountNumber, onChange: (v) => onChange({ accountNumber: v }), placeholder: "Enter full account number", helpText: current?.bankAccount ? `Saved: ••••${current.bankAccount.accountNumberMasked?.slice(-4) ?? "••••"}` : "Stored securely, never displayed in full.", disabled: busy }), _jsx(FormField, { name: "ifscCode", label: "IFSC Code", type: "text", value: values.ifscCode, onChange: (v) => onChange({ ifscCode: v.toUpperCase() }), placeholder: "e.g. SBIN0001234", disabled: busy })] }), _jsxs(FormGroup, { columns: 2, children: [_jsx(FormField, { name: "bankName", label: "Bank Name", type: "text", value: values.bankName, onChange: (v) => onChange({ bankName: v }), placeholder: "e.g. State Bank of India", disabled: busy }), _jsxs(Div, { children: [_jsx(Text, { className: "mb-1.5", size: "sm", weight: "medium", children: "Account Type" }), _jsx(Row, { gap: "xs", children: ["savings", "current"].map((t) => (_jsxs(Label, { layout: "flex", gap: "md", className: "cursor-pointer", children: [_jsx(Checkbox, { bare: true, type: "radio", name: "accountType", value: t, checked: values.accountType === t, onChange: () => onChange({ accountType: t }), className: "accent-[var(--appkit-color-primary)]", disabled: busy }), _jsx(Text, { size: "sm", transform: "capitalize", children: t })] }, t))) })] })] })] }))] })),
|
|
179
205
|
},
|
|
180
206
|
{
|
|
207
|
+
id: "tax",
|
|
181
208
|
label: "Tax Info",
|
|
182
209
|
fields: ["gstin", "pan", "businessType"],
|
|
183
210
|
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Tax Information" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: "Optional \u2014 required only for GST invoice generation and TDS compliance." }), _jsx(FormField, { name: "gstin", label: "GSTIN (optional)", type: "text", value: values.gstin, onChange: (v) => onChange({ gstin: v.toUpperCase() }), placeholder: "e.g. 22AAAAA0000A1Z5", helpText: "15-character Goods and Services Tax Identification Number.", disabled: busy }), _jsx(FormField, { name: "pan", label: "PAN (optional)", type: "text", value: values.pan, onChange: (v) => onChange({ pan: v.toUpperCase() }), placeholder: "e.g. ABCDE1234F", helpText: "Required for payouts above \u20B950,000 per year (TDS threshold).", disabled: busy }), _jsx(FormField, { name: "businessType", label: "Business Type (optional)", type: "text", value: values.businessType, onChange: (v) => onChange({ businessType: v }), placeholder: "e.g. Individual, Sole Proprietor, Private Limited", disabled: busy })] })),
|
|
184
211
|
},
|
|
185
212
|
{
|
|
213
|
+
id: "preferences",
|
|
186
214
|
label: "Preferences",
|
|
187
215
|
fields: ["autoPayout", "minimumThreshold", "emiEnabled"],
|
|
188
216
|
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Payout Preferences" }), _jsx(Toggle, { checked: values.autoPayout, onChange: (checked) => onChange({ autoPayout: checked }), label: "Enable auto-payout \u2014 automatically transfer earnings on schedule", disabled: busy }), _jsx(FormField, { name: "minimumThreshold", label: "Minimum Payout Threshold (\u20B9)", type: "number", value: values.minimumThreshold, onChange: (v) => onChange({ minimumThreshold: v }), placeholder: "e.g. 500", helpText: "Payouts are held until your balance exceeds this amount. Leave blank for no minimum.", disabled: busy }), _jsxs(Div, { className: `${__P.p3} bg-[var(--appkit-color-surface-alt)] border border-[var(--appkit-color-border)]`, rounded: "lg", children: [_jsx(Text, { className: "mb-1", size: "sm", weight: "medium", children: "Payout Schedule" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: "Auto-payouts run every Monday for the previous week's settled orders. Manual payouts can be requested from the Payouts page at any time." })] }), _jsx(Toggle, { checked: values.emiEnabled, onChange: (checked) => onChange({ emiEnabled: checked }), label: "Offer EMI financing on eligible orders", disabled: busy }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: "Only shown to buyers when platform-wide EMI is also enabled and their cart subtotal from your store exceeds the site's minimum order value. Orders on an EMI plan hold your payout until every installment is paid, unless you mark the item \"ship before EMI completes\"." })] })),
|
|
189
217
|
},
|
|
190
|
-
];
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
});
|
|
196
|
-
return map;
|
|
218
|
+
], [busy, current]);
|
|
219
|
+
const { openIds, setOpenIds, goToSection, fieldToSectionIndex, sectionMeta } = useSectionFormNav(sections, draft);
|
|
220
|
+
const { shellCtx, setFieldError, clearErrors, validate } = useFormShellState(payoutSettingsDraftSchema, { sections: sectionMeta, onGoToSection: goToSection, fieldToSectionIndex });
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
validate(draft);
|
|
197
223
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
198
|
-
}, [
|
|
199
|
-
const wizardShellCtx = useMemo(() => ({ ...shellCtx, fieldToStepIndex, goToStep: (n) => setCurrentStep(n) }), [shellCtx, fieldToStepIndex, setCurrentStep]);
|
|
224
|
+
}, [draft, validate]);
|
|
200
225
|
return (_jsx(StackedViewShell, { portal: "seller", title: "Payout Settings", sections: [
|
|
201
|
-
_jsxs(Div, { children: [error && _jsx(Alert, { variant: "error", className: "mb-4", children: error }), success && _jsx(Alert, { variant: "success", className: "mb-4", children: "Payout details saved." }), _jsxs(FormShellContext.Provider, { value:
|
|
226
|
+
_jsxs(Div, { children: [error && _jsx(Alert, { variant: "error", className: "mb-4", children: error }), success && _jsx(Alert, { variant: "success", className: "mb-4", children: "Payout details saved." }), _jsxs(FormShellContext.Provider, { value: shellCtx, children: [_jsx(FormErrorSummary, {}), _jsx(SectionForm, { sections: sections, values: draft, onChange: update, onSubmit: handleSave, schema: payoutSettingsDraftSchema, openIds: openIds, onOpenChange: setOpenIds, submitLabel: "Save Payout Details", isLoading: busy })] })] }, "payout"),
|
|
202
227
|
] }));
|
|
203
228
|
}
|
|
@@ -13,6 +13,8 @@ import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
|
13
13
|
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
14
14
|
import { DataListingView } from "../../admin/components/DataListingView";
|
|
15
15
|
import { useActionDispatch } from "../../../react/hooks/use-action-dispatch";
|
|
16
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
17
|
+
const PRE_ORDER_TYPES = ["pre-order"];
|
|
16
18
|
const PRE_ORDER_COLUMNS = [
|
|
17
19
|
{
|
|
18
20
|
key: "thumbnail",
|
|
@@ -75,6 +77,7 @@ export function SellerPreOrdersView({ children, onDelete, ...props }) {
|
|
|
75
77
|
if (React.Children.count(children) > 0) {
|
|
76
78
|
return (_jsx(ListingLayout, { portal: "seller", ...props, children: children }));
|
|
77
79
|
}
|
|
80
|
+
const scope = useAvailabilityScope(PRE_ORDER_TYPES);
|
|
78
81
|
const config = {
|
|
79
82
|
portal: "seller",
|
|
80
83
|
title: "Pre-Orders",
|
|
@@ -120,6 +123,8 @@ export function SellerPreOrdersView({ children, onDelete, ...props }) {
|
|
|
120
123
|
const status = state.status && state.status !== "All" ? sieveFilter("status", SIEVE_OP.EQ, state.status) : null;
|
|
121
124
|
return ["listingType==pre-order", status].filter(Boolean).join(",");
|
|
122
125
|
},
|
|
126
|
+
buildExtraParams: () => scope.extraParams,
|
|
127
|
+
renderAboveContent: scope.renderAboveContent,
|
|
123
128
|
rowHrefTemplate: String(ROUTES.STORE.PRE_ORDERS_EDIT("{id}")),
|
|
124
129
|
renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
|
|
125
130
|
{
|
|
@@ -4,16 +4,16 @@ import { Row, SIEVE_OP, Stack, sieveFilter } from "@mohasinac/appkit/client";
|
|
|
4
4
|
import { sortBy } from "@mohasinac/appkit/client";
|
|
5
5
|
import React, { useState, useCallback } from "react";
|
|
6
6
|
import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
|
|
7
|
-
import { useUrlTable } from "../../../react/hooks/useUrlTable";
|
|
8
7
|
import { Badge, ConfirmDeleteModal, Div, FilterChipGroup, ListingLayout, RowActionMenu, Span, Text } from "../../../ui";
|
|
9
8
|
import { MediaImage } from "../../media/MediaImage";
|
|
10
9
|
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
11
|
-
import { TABLE_KEYS } from "../../../constants/table-keys";
|
|
12
10
|
import { SELLER_PRIZE_DRAW_STATUS_TABS } from "../../admin/constants/filter-tabs";
|
|
13
11
|
import { ROUTES } from "../../../constants";
|
|
14
12
|
import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
15
13
|
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
16
14
|
import { DataListingView } from "../../admin/components/DataListingView";
|
|
15
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
16
|
+
const PRIZE_DRAW_TYPES = ["prize-draw"];
|
|
17
17
|
import { useActionDispatch } from "../../../react/hooks/use-action-dispatch";
|
|
18
18
|
// Real ProductStatus is draft|published|in_review|archived — "active"
|
|
19
19
|
// fixed to "published"; "ended"/"cancelled" removed since status never
|
|
@@ -64,8 +64,7 @@ export function SellerPrizeDrawsView({ children, onDelete, ...props }) {
|
|
|
64
64
|
const dispatch = useActionDispatch();
|
|
65
65
|
// Independent of DataListingView's own internal useUrlTable() — see the
|
|
66
66
|
// same pattern in SellerAuctionsView.tsx.
|
|
67
|
-
const
|
|
68
|
-
const showClosed = toggleTable.get(TABLE_KEYS.SHOW_CLOSED) === "true";
|
|
67
|
+
const scope = useAvailabilityScope(PRIZE_DRAW_TYPES);
|
|
69
68
|
const [deleteTargetId, setDeleteTargetId] = useState(null);
|
|
70
69
|
const { deletingId, handleDelete: performDelete } = useEntityDelete({
|
|
71
70
|
endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
|
|
@@ -85,7 +84,7 @@ export function SellerPrizeDrawsView({ children, onDelete, ...props }) {
|
|
|
85
84
|
title: "Prize Draws",
|
|
86
85
|
searchPlaceholder: "Search prize draws by name…",
|
|
87
86
|
emptyLabel: "No prize draws listed yet",
|
|
88
|
-
filterKeys: ["status"
|
|
87
|
+
filterKeys: ["status"],
|
|
89
88
|
defaultSort: sortBy("createdAt", "DESC"),
|
|
90
89
|
queryKey: ["seller", "prize-draws", "listing"],
|
|
91
90
|
endpoint: SELLER_ENDPOINTS.PRODUCTS,
|
|
@@ -115,18 +114,17 @@ export function SellerPrizeDrawsView({ children, onDelete, ...props }) {
|
|
|
115
114
|
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
116
115
|
buildFilters: (state) => {
|
|
117
116
|
const status = state.status && state.status !== "All" ? sieveFilter("status", SIEVE_OP.EQ, state.status) : null;
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
117
|
+
// The hide-closed clause that used to live here tested the reveal
|
|
118
|
+
// WINDOW END date, a different field from the reveal STATUS every other
|
|
119
|
+
// surface reads — so a draw the seller had closed early still showed as
|
|
120
|
+
// open here. It also pushed an inequality alongside an arbitrary sort
|
|
121
|
+
// (Root Cause #59), which `audit-listing-indices` had been reporting as
|
|
122
|
+
// QUERY_UNSATISFIABLE. The scope param now carries it, resolved from the
|
|
123
|
+
// listing-type registry.
|
|
124
|
+
return ["listingType==prize-draw", status].filter(Boolean).join(",");
|
|
122
125
|
},
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
label: "Show closed",
|
|
126
|
-
active: showClosed,
|
|
127
|
-
onChange: (next) => toggleTable.set(TABLE_KEYS.SHOW_CLOSED, next ? "true" : ""),
|
|
128
|
-
},
|
|
129
|
-
],
|
|
126
|
+
buildExtraParams: () => scope.extraParams,
|
|
127
|
+
renderAboveContent: scope.renderAboveContent,
|
|
130
128
|
rowHrefTemplate: String(ROUTES.STORE.PRIZE_DRAWS_EDIT("{id}")),
|
|
131
129
|
renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
|
|
132
130
|
{
|
|
@@ -11,6 +11,7 @@ import { StoreAddressSelectorCreate } from "../../stores/components/StoreAddress
|
|
|
11
11
|
import { QuickProductForm } from "./QuickProductForm";
|
|
12
12
|
import { BarcodeField } from "./BarcodeField";
|
|
13
13
|
import { pluginFor } from "../../../_internal/shared/listing-types/_registry";
|
|
14
|
+
import { DEFAULT_MIN_OFFER_PERCENT } from "../../../_internal/shared/features/offers/config";
|
|
14
15
|
import { normalizeError } from "../../../errors/normalize";
|
|
15
16
|
/**
|
|
16
17
|
* "bundle" is a categoryType, not a ListingType, so it can't live in
|
|
@@ -198,7 +199,12 @@ const TYPE_SPECIFIC_STEPS = {
|
|
|
198
199
|
function StepPricing({ values, onChange, listingType, }) {
|
|
199
200
|
const listingPlugin = pluginForMode(listingType);
|
|
200
201
|
const priceLabel = listingPlugin.priceLabel;
|
|
201
|
-
return (_jsxs(Stack, { gap: "md", children: [_jsx(Alert, { variant: "info", children: "All prices in Indian Rupees (\u20B9)." }), _jsxs(FormGroup, { columns: 2, children: [_jsx(FormField, { name: "price", label: priceLabel, type: "number", value: toRupeesString(values.price), onChange: (v) => onChange({ price: fromRupeesString(v) }), placeholder: "999" }), _jsx(FormField, { name: "compareAtPrice", label: "Compare-at Price (\u20B9, optional)", type: "number", value: toRupeesString(values.compareAtPrice), onChange: (v) => onChange({ compareAtPrice: v ? fromRupeesString(v) : undefined }), placeholder: "1299", helpText: "Original price shown as strikethrough" })] }), listingPlugin.showsStockQuantity && (_jsx(FormField, { name: "stockQuantity", label: "Stock Quantity", type: "number", value: String(values.stockQuantity ?? ""), onChange: (v) => onChange({ stockQuantity: Number(v) }), placeholder: "1" })), _jsxs(FormGroup, { columns: 2, children: [_jsx(Toggle, { checked: !!values.featured, onChange: (checked) => onChange({ featured: checked }), label: "Mark as Featured" }), _jsx(Toggle, { checked: !!values.isNew, onChange: (checked) => onChange({ isNew: checked }), label: "Mark as New Arrival" })] }), _jsx(Toggle, { checked: !!values.allowOffers, onChange: (checked) => onChange({
|
|
202
|
+
return (_jsxs(Stack, { gap: "md", children: [_jsx(Alert, { variant: "info", children: "All prices in Indian Rupees (\u20B9)." }), _jsxs(FormGroup, { columns: 2, children: [_jsx(FormField, { name: "price", label: priceLabel, type: "number", value: toRupeesString(values.price), onChange: (v) => onChange({ price: fromRupeesString(v) }), placeholder: "999" }), _jsx(FormField, { name: "compareAtPrice", label: "Compare-at Price (\u20B9, optional)", type: "number", value: toRupeesString(values.compareAtPrice), onChange: (v) => onChange({ compareAtPrice: v ? fromRupeesString(v) : undefined }), placeholder: "1299", helpText: "Original price shown as strikethrough" })] }), listingPlugin.showsStockQuantity && (_jsx(FormField, { name: "stockQuantity", label: "Stock Quantity", type: "number", value: String(values.stockQuantity ?? ""), onChange: (v) => onChange({ stockQuantity: Number(v) }), placeholder: "1" })), _jsxs(FormGroup, { columns: 2, children: [_jsx(Toggle, { checked: !!values.featured, onChange: (checked) => onChange({ featured: checked }), label: "Mark as Featured" }), _jsx(Toggle, { checked: !!values.isNew, onChange: (checked) => onChange({ isNew: checked }), label: "Mark as New Arrival" })] }), _jsx(Toggle, { checked: !!values.allowOffers, onChange: (checked) => onChange({
|
|
203
|
+
allowOffers: checked,
|
|
204
|
+
minOfferPercent: checked
|
|
205
|
+
? values.minOfferPercent ?? DEFAULT_MIN_OFFER_PERCENT
|
|
206
|
+
: undefined,
|
|
207
|
+
}), label: "Allow buyer offers" }), values.allowOffers && (_jsx(FormField, { name: "minOfferPercent", label: "Minimum offer (% of price)", type: "number", value: String(values.minOfferPercent ?? ""), onChange: (v) => onChange({ minOfferPercent: Number(v) }), placeholder: String(DEFAULT_MIN_OFFER_PERCENT) }))] }));
|
|
202
208
|
}
|
|
203
209
|
// ── Step: Shipping ────────────────────────────────────────────────────────
|
|
204
210
|
function StepShipping({ values, onChange, renderAddressSelector, }) {
|
|
@@ -15,6 +15,7 @@ import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
|
15
15
|
import { SELLER_PRODUCT_STATUS_TABS } from "../../admin/constants/filter-tabs";
|
|
16
16
|
import { ROUTES } from "../../../constants";
|
|
17
17
|
import { normalizeListingType } from "../../products/utils/listing-type";
|
|
18
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
18
19
|
import { toRecordArray, toRelativeDate, toStringValue } from "../hooks/useSellerListingData";
|
|
19
20
|
import { useListingTypeFlags } from "../../../react/hooks/useListingTypeFlags";
|
|
20
21
|
import { ALL_LISTING_TYPES } from "../../../_internal/shared/listing-types/feature-flags";
|
|
@@ -35,7 +36,6 @@ const FILTER_KEYS = [
|
|
|
35
36
|
"tags",
|
|
36
37
|
"badges",
|
|
37
38
|
"listingType",
|
|
38
|
-
"showSold",
|
|
39
39
|
];
|
|
40
40
|
const DEFAULT_SORT = "-createdAt";
|
|
41
41
|
const SORT_OPTIONS = [
|
|
@@ -117,7 +117,9 @@ export function SellerProductsView({ onDeleteProduct, onCreateClick, }) {
|
|
|
117
117
|
// own internal table also reads via `filterKeys`, so both stay in sync.
|
|
118
118
|
const sideTable = useUrlTable({ defaults: { sort: DEFAULT_SORT } });
|
|
119
119
|
const listingKind = (sideTable.get("listingType") || "all");
|
|
120
|
-
|
|
120
|
+
// The scope bar spans whichever types the type-dropdown has narrowed to, so
|
|
121
|
+
// its middle tab reads "Ended" on Auctions and "Sold" on Products.
|
|
122
|
+
const scope = useAvailabilityScope(listingKind === "all" ? ALL_LISTING_TYPES : [listingKind]);
|
|
121
123
|
const { deletingId, handleDelete: performDelete } = useEntityDelete({
|
|
122
124
|
deleteFn: onDeleteProduct,
|
|
123
125
|
onSuccess: (id) => { setDeletedIds((prev) => new Set([...prev, id])); },
|
|
@@ -204,9 +206,6 @@ export function SellerProductsView({ onDeleteProduct, onCreateClick, }) {
|
|
|
204
206
|
endpoint: SELLER_ENDPOINTS.PRODUCTS,
|
|
205
207
|
sortOptions: SORT_OPTIONS,
|
|
206
208
|
columns: PRODUCT_COLUMNS,
|
|
207
|
-
toggles: [
|
|
208
|
-
{ label: "Show sold", active: showSold, onChange: (next) => sideTable.set("showSold", next ? "true" : "") },
|
|
209
|
-
],
|
|
210
209
|
primaryAction: onCreateClick ? { label: "New Listing", onClick: onCreateClick } : undefined,
|
|
211
210
|
mapRows: (response) => {
|
|
212
211
|
const rows = toRecordArray(response.products).map((item, index) => {
|
|
@@ -252,11 +251,15 @@ export function SellerProductsView({ onDeleteProduct, onCreateClick, }) {
|
|
|
252
251
|
buildFilters: (state) => {
|
|
253
252
|
const statusFilter = state.status && state.status !== "All" ? sieveFilter("status", SIEVE_OP.EQ, state.status) : undefined;
|
|
254
253
|
const kindFilter = !state.listingType || state.listingType === "all" ? undefined : sieveFilter("listingType", SIEVE_OP.EQ, state.listingType);
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
// The hardcoded `isSold==false` that used to live here is gone: it asked
|
|
255
|
+
// a narrower question than the rest of the app (an ended auction is not
|
|
256
|
+
// `isSold`), so the seller dashboard and /auctions disagreed about the
|
|
257
|
+
// same rows. The scope param carries the per-type meaning instead.
|
|
258
|
+
return [statusFilter, kindFilter].filter(Boolean).join(",") || undefined;
|
|
257
259
|
},
|
|
258
260
|
renderFilterPanel: ({ pendingFilters, setPendingFilters }) => (_jsx(SellerProductsFilterFields, { pendingFilters: pendingFilters, statusOptions: STATUS_OPTIONS, onChange: setPendingFilters })),
|
|
259
|
-
|
|
261
|
+
buildExtraParams: () => scope.extraParams,
|
|
262
|
+
renderAboveContent: () => (_jsxs(Stack, { gap: "sm", children: [_jsx(TypeDropdown, { active: listingKind, onChange: handleKindChange }), scope.renderAboveContent()] })),
|
|
260
263
|
buildBulkActions: (selection) => {
|
|
261
264
|
const handleBulkPrintLabels = () => {
|
|
262
265
|
const ids = selection.selectedIds.join(",");
|
|
@@ -14,6 +14,8 @@ import { ROUTES } from "../../../constants/index";
|
|
|
14
14
|
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
15
15
|
import { DataListingView } from "../../admin/components/DataListingView";
|
|
16
16
|
import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
|
|
17
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
18
|
+
const LISTING_TYPES = ["stickers"];
|
|
17
19
|
const COLUMNS = [
|
|
18
20
|
{ key: "title", header: "Listing", render: (row) => _jsx(Text, { size: "sm", weight: "medium", children: row.title }) },
|
|
19
21
|
{ key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
|
|
@@ -57,6 +59,7 @@ export function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBul
|
|
|
57
59
|
else
|
|
58
60
|
window.location.href = String(ROUTES.STORE.STICKERS_NEW);
|
|
59
61
|
}, [onCreateClick]);
|
|
62
|
+
const scope = useAvailabilityScope(LISTING_TYPES);
|
|
60
63
|
const config = {
|
|
61
64
|
portal: "seller",
|
|
62
65
|
title: "Stickers",
|
|
@@ -87,6 +90,8 @@ export function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBul
|
|
|
87
90
|
}),
|
|
88
91
|
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
89
92
|
buildFilters: () => "listingType==stickers",
|
|
93
|
+
buildExtraParams: () => scope.extraParams,
|
|
94
|
+
renderAboveContent: scope.renderAboveContent,
|
|
90
95
|
primaryAction: { label: "New Sticker Listing", onClick: () => handleCreate() },
|
|
91
96
|
// Mirrors the "Edit" row action below so table rows and cards both navigate on click.
|
|
92
97
|
onRowClick: (row) => handleEdit(row.id),
|
|
@@ -13,8 +13,6 @@ export { SellerOrdersView, SellerOrderDetailPanel } from "./SellerOrdersView";
|
|
|
13
13
|
export type { SellerOrdersViewProps } from "./SellerOrdersView";
|
|
14
14
|
export { SellerOffersView } from "./SellerOffersView";
|
|
15
15
|
export type { SellerOffersViewProps } from "./SellerOffersView";
|
|
16
|
-
export { SellerOffersPanel } from "./SellerOffersPanel";
|
|
17
|
-
export type { SellerOffersPanelProps, SellerOfferAction } from "./SellerOffersPanel";
|
|
18
16
|
export { SellerCouponsView } from "./SellerCouponsView";
|
|
19
17
|
export type { SellerCouponsViewProps } from "./SellerCouponsView";
|
|
20
18
|
export { SellerCouponEditorView } from "./SellerCouponEditorView";
|
|
@@ -6,7 +6,6 @@ export { SellerPrizeDrawsView } from "./SellerPrizeDrawsView";
|
|
|
6
6
|
export { PrintCenterView } from "./PrintCenterView";
|
|
7
7
|
export { SellerOrdersView, SellerOrderDetailPanel } from "./SellerOrdersView";
|
|
8
8
|
export { SellerOffersView } from "./SellerOffersView";
|
|
9
|
-
export { SellerOffersPanel } from "./SellerOffersPanel";
|
|
10
9
|
export { SellerCouponsView } from "./SellerCouponsView";
|
|
11
10
|
export { SellerCouponEditorView } from "./SellerCouponEditorView";
|
|
12
11
|
export { SellerBidsView } from "./SellerBidsView";
|