@mohasinac/appkit 4.59.0 → 4.60.1
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/.build-stamp.json +3 -3
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
- package/dist/_internal/server/features/brands/actions.js +78 -4
- package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
- package/dist/_internal/server/features/checkout/actions.js +668 -183
- package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
- package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
- package/dist/_internal/server/features/gateway-events/index.js +10 -0
- package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
- package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
- package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
- package/dist/_internal/server/features/gateway-events/redact.js +151 -0
- package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
- package/dist/_internal/server/features/grievance/actions.js +173 -0
- package/dist/_internal/server/features/grievance/index.d.ts +8 -0
- package/dist/_internal/server/features/grievance/index.js +8 -0
- package/dist/_internal/server/features/grouped/data.js +28 -3
- package/dist/_internal/server/features/lottery/actions.js +99 -4
- package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
- package/dist/_internal/server/features/order-completion/actions.js +336 -0
- package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
- package/dist/_internal/server/features/order-completion/index.js +7 -0
- package/dist/_internal/server/features/orders/actions.d.ts +13 -0
- package/dist/_internal/server/features/orders/actions.js +56 -2
- package/dist/_internal/server/features/orders/adapters.d.ts +20 -2
- package/dist/_internal/server/features/orders/adapters.js +44 -0
- package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
- package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
- package/dist/_internal/server/features/orders/index.d.ts +2 -1
- package/dist/_internal/server/features/orders/index.js +1 -1
- package/dist/_internal/server/features/orders/service.d.ts +60 -0
- package/dist/_internal/server/features/orders/service.js +74 -0
- package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
- package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
- package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
- package/dist/_internal/server/features/payment-cases/index.js +9 -0
- package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
- package/dist/_internal/server/features/payouts/actions.js +84 -10
- package/dist/_internal/server/features/points/adjust.d.ts +61 -0
- package/dist/_internal/server/features/points/adjust.js +121 -0
- package/dist/_internal/server/features/points/award.d.ts +65 -0
- package/dist/_internal/server/features/points/award.js +145 -0
- package/dist/_internal/server/features/price-index/market.d.ts +33 -0
- package/dist/_internal/server/features/price-index/market.js +54 -1
- package/dist/_internal/server/features/products/data.js +40 -22
- package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
- package/dist/_internal/server/features/protection-claims/actions.js +228 -0
- package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
- package/dist/_internal/server/features/protection-claims/index.js +8 -0
- package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
- package/dist/_internal/server/features/refunds/actions.js +259 -17
- package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
- package/dist/_internal/server/features/refunds/capacity.js +37 -0
- package/dist/_internal/server/features/reviews/actions.js +3 -2
- package/dist/_internal/server/features/search/index-build/sources.js +20 -1
- package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
- package/dist/_internal/server/features/shipping/reconcile.js +34 -3
- package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
- package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
- package/dist/_internal/server/features/stores/tabs.js +24 -4
- package/dist/_internal/server/functions/https.d.ts +31 -1
- package/dist/_internal/server/functions/https.js +52 -1
- package/dist/_internal/server/functions/scheduled.d.ts +72 -1
- package/dist/_internal/server/functions/scheduled.js +124 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
- package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
- package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
- package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
- package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
- package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
- package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
- package/dist/_internal/server/jobs/handlers/index.js +5 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
- package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +71 -0
- package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
- package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
- package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
- package/dist/_internal/shared/checkout/lanes.js +46 -0
- package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
- package/dist/_internal/shared/checkout/order-math.js +251 -3
- package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
- package/dist/_internal/shared/checkout/refundable-base.js +122 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
- package/dist/_internal/shared/features/auctions/config.js +30 -1
- package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
- package/dist/_internal/shared/features/brands/schema.js +18 -0
- package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
- package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
- package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
- package/dist/_internal/shared/features/print/label-profiles.js +350 -0
- package/dist/_internal/shared/features/products/to-product-item.js +33 -5
- package/dist/_internal/shared/fees/calculator.d.ts +31 -2
- package/dist/_internal/shared/fees/calculator.js +103 -5
- package/dist/_internal/shared/fees/india-states.d.ts +195 -0
- package/dist/_internal/shared/fees/india-states.js +190 -0
- package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
- package/dist/_internal/shared/fees/payout-hold.js +74 -0
- package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
- package/dist/_internal/shared/obligations/deadlines.js +155 -0
- package/dist/_internal/shared/shipping/quote.d.ts +96 -0
- package/dist/_internal/shared/shipping/quote.js +67 -0
- package/dist/_internal/shared/time/business-days.d.ts +91 -0
- package/dist/_internal/shared/time/business-days.js +185 -0
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +10 -4
- package/dist/client.js +29 -3
- package/dist/configs/tailwind.d.ts +0 -12
- package/dist/configs/tailwind.js +28 -15
- package/dist/constants/api-endpoints.d.ts +51 -9
- package/dist/constants/api-endpoints.js +23 -7
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/payment.d.ts +131 -0
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/DeveloperView.js +5 -2
- package/dist/features/about/components/FAQPageView.js +2 -1
- package/dist/features/about/components/FeesView.js +2 -1
- package/dist/features/about/components/HelpPageView.js +2 -1
- package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
- package/dist/features/about/components/HowEmiWorksView.js +2 -1
- package/dist/features/about/components/HowOffersWorkView.js +2 -1
- package/dist/features/about/components/HowOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
- package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowReviewsWorkView.js +2 -1
- package/dist/features/about/components/PolicyPageView.js +2 -1
- package/dist/features/about/components/ProseHero.d.ts +73 -0
- package/dist/features/about/components/ProseHero.js +18 -0
- package/dist/features/about/components/SecurityPrivacyView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +2 -1
- package/dist/features/about/components/TrackOrderView.js +2 -1
- package/dist/features/about/components/UnauthorizedView.js +1 -1
- package/dist/features/about/index.d.ts +2 -0
- package/dist/features/about/index.js +5 -0
- package/dist/features/account/actions/address-actions.d.ts +26 -2
- package/dist/features/account/actions/address-actions.js +25 -1
- package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOrdersView.js +17 -0
- package/dist/features/account/components/UserSidebar.js +1 -1
- package/dist/features/account/hooks/useNotifications.js +29 -0
- package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
- package/dist/features/admin/components/AdminBeysView.js +2 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
- package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
- package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
- package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
- package/dist/features/admin/components/AdminCategoriesView.js +1 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
- package/dist/features/admin/components/AdminContactEditorView.js +1 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
- package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
- package/dist/features/admin/components/AdminFaqsView.js +2 -2
- package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
- package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
- package/dist/features/admin/components/AdminGuideHubView.js +1 -1
- package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
- package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
- package/dist/features/admin/components/AdminPartsView.js +2 -2
- package/dist/features/admin/components/AdminProductsView.js +75 -4
- package/dist/features/admin/components/AdminSidebar.js +2 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
- package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
- package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
- package/dist/features/admin/components/AdminUsersView.js +72 -1
- package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
- package/dist/features/admin/components/AdminViewCards.js +4 -4
- package/dist/features/admin/components/DataListingView.d.ts +28 -0
- package/dist/features/admin/components/DataListingView.js +175 -14
- package/dist/features/admin/components/DataTable.d.ts +12 -1
- package/dist/features/admin/components/DataTable.js +3 -3
- package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/OwnerQuickActions.js +60 -2
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
- package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
- package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
- package/dist/features/admin/components/index.d.ts +4 -0
- package/dist/features/admin/components/index.js +6 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
- package/dist/features/admin/constants/filter-tabs.js +106 -0
- package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
- package/dist/features/admin/repository/site-settings.repository.js +82 -1
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
- package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
- package/dist/features/admin/schemas/firestore.js +5 -1
- package/dist/features/admin/schemas/site-settings-form.js +30 -1
- package/dist/features/auctions/actions/bid-actions.js +13 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
- package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
- package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
- package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
- package/dist/features/audit-log/schemas/firestore.js +14 -0
- package/dist/features/auth/permissions/constants.d.ts +17 -1
- package/dist/features/auth/permissions/constants.js +18 -0
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
- package/dist/features/categories/api/[id]/description-template/route.js +107 -1
- package/dist/features/categories/components/BrandDetailPageView.js +2 -2
- package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
- package/dist/features/categories/components/BundleDetailView.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
- package/dist/features/categories/components/CategoryForm.js +12 -1
- package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
- package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
- package/dist/features/categories/repository/market-price-index.repository.js +105 -0
- package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
- package/dist/features/categories/repository/price-observation.repository.js +132 -0
- package/dist/features/events/components/EventSaleBanner.js +1 -1
- package/dist/features/events/components/EventStatusBadge.js +1 -1
- package/dist/features/faq/components/FAQAccordion.js +2 -1
- package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
- package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
- package/dist/features/faq/components/RelatedFAQs.js +1 -1
- package/dist/features/filters/FilterFacetSection.js +1 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
- package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
- package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
- package/dist/features/gateway-events/schemas/firestore.js +125 -0
- package/dist/features/gateway-events/schemas/index.d.ts +81 -0
- package/dist/features/gateway-events/schemas/index.js +79 -0
- package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.js +37 -1
- package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
- package/dist/features/homepage/components/BrandsSection.js +1 -1
- package/dist/features/homepage/components/CTABannerSection.js +1 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
- package/dist/features/homepage/components/HeroCarousel.js +2 -2
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
- package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
- package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
- package/dist/features/inventory/components/ReceiveStationView.js +413 -0
- package/dist/features/inventory/components/operator-message.d.ts +29 -0
- package/dist/features/inventory/components/operator-message.js +41 -0
- package/dist/features/inventory/index.d.ts +13 -0
- package/dist/features/inventory/index.js +28 -0
- package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
- package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
- package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
- package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
- package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
- package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
- package/dist/features/inventory/schemas/firestore.d.ts +197 -0
- package/dist/features/inventory/schemas/firestore.js +159 -0
- package/dist/features/layout/AppLayoutShell.d.ts +12 -1
- package/dist/features/layout/AppLayoutShell.js +25 -12
- package/dist/features/layout/AutoBreadcrumbs.js +162 -3
- package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +2 -2
- package/dist/features/media/MediaAvatar.js +1 -1
- package/dist/features/media/MediaImage.d.ts +24 -4
- package/dist/features/media/MediaImage.js +44 -4
- package/dist/features/media/MediaLightbox.js +1 -1
- package/dist/features/media/modals/ImageCropModal.js +1 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/upload/MediaUploadField.js +91 -3
- package/dist/features/obligations/constants/policies.d.ts +92 -0
- package/dist/features/obligations/constants/policies.js +378 -0
- package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
- package/dist/features/obligations/repository/obligations.repository.js +158 -0
- package/dist/features/obligations/schemas/firestore.d.ts +160 -0
- package/dist/features/obligations/schemas/firestore.js +87 -0
- package/dist/features/orders/actions/order-actions.d.ts +43 -4
- package/dist/features/orders/actions/order-actions.js +60 -3
- package/dist/features/orders/actions/refund-actions.js +70 -10
- package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
- package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
- package/dist/features/orders/components/OrdersList.js +2 -2
- package/dist/features/orders/components/RefundHistoryTable.js +3 -1
- package/dist/features/orders/components/index.d.ts +2 -0
- package/dist/features/orders/components/index.js +6 -0
- package/dist/features/orders/constants/transitions.d.ts +59 -0
- package/dist/features/orders/constants/transitions.js +104 -0
- package/dist/features/orders/repository/orders.repository.d.ts +109 -6
- package/dist/features/orders/repository/orders.repository.js +464 -21
- package/dist/features/orders/schemas/firestore.d.ts +270 -0
- package/dist/features/orders/schemas/firestore.js +24 -0
- package/dist/features/orders/schemas/index.d.ts +61 -0
- package/dist/features/orders/schemas/index.js +22 -0
- package/dist/features/orders/types/index.d.ts +79 -0
- package/dist/features/parts/components/PartsIndexPageView.js +8 -1
- package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
- package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
- package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
- package/dist/features/payment-cases/schemas/firestore.js +105 -0
- package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
- package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
- package/dist/features/payments/repository/payout.repository.d.ts +0 -1
- package/dist/features/payments/repository/payout.repository.js +0 -1
- package/dist/features/points/repository/points.repository.d.ts +122 -0
- package/dist/features/points/repository/points.repository.js +304 -1
- package/dist/features/points/schemas/adjust-form.d.ts +58 -0
- package/dist/features/points/schemas/adjust-form.js +63 -0
- package/dist/features/points/schemas/firestore.d.ts +108 -1
- package/dist/features/points/schemas/firestore.js +84 -0
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
- package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
- package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
- package/dist/features/price-index/market-stats.d.ts +82 -0
- package/dist/features/price-index/market-stats.js +230 -0
- package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
- package/dist/features/print/components/BoxLabelPrintView.js +66 -0
- package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
- package/dist/features/print/components/LabelProfilePicker.js +38 -0
- package/dist/features/print/components/labels.d.ts +117 -0
- package/dist/features/print/components/labels.js +258 -0
- package/dist/features/print/components/labels.style.css +46 -0
- package/dist/features/print/index.d.ts +6 -0
- package/dist/features/print/index.js +16 -0
- package/dist/features/products/columns/productTableColumns.js +5 -4
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
- package/dist/features/products/components/PrizeDrawCollage.js +1 -1
- package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
- package/dist/features/products/components/PrizeRevealModal.js +2 -2
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +34 -23
- package/dist/features/products/components/ProductGrid.js +86 -62
- package/dist/features/products/constants/card-badges.d.ts +97 -0
- package/dist/features/products/constants/card-badges.js +100 -0
- package/dist/features/products/repository/products.repository.js +34 -1
- package/dist/features/products/schemas/firestore.d.ts +46 -3
- package/dist/features/products/schemas/firestore.js +21 -0
- package/dist/features/promotions/components/PromotionsView.js +1 -1
- package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
- package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
- package/dist/features/promotions/schemas/firestore.js +30 -3
- package/dist/features/promotions/schemas/index.d.ts +6 -6
- package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
- package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
- package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
- package/dist/features/protection-claims/schemas/firestore.js +130 -0
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/schemas/firestore.d.ts +20 -1
- package/dist/features/scams/constants/scam-types.d.ts +2 -0
- package/dist/features/scams/constants/scam-types.js +18 -0
- package/dist/features/scams/schemas/report-form.d.ts +3 -3
- package/dist/features/scams/schemas/report-form.js +26 -1
- package/dist/features/search/components/Search.js +9 -9
- package/dist/features/search/components/SearchResultsClient.js +18 -3
- package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
- package/dist/features/search/components/SearchResultsPageView.js +2 -2
- package/dist/features/seller/actions/offer-actions.js +16 -1
- package/dist/features/seller/actions/seller-actions.js +14 -3
- package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
- package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
- package/dist/features/seller/components/PrintCenterView.js +41 -30
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
- package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
- package/dist/features/seller/components/SellerProductShell.js +123 -13
- package/dist/features/seller/components/SellerReviewsView.js +4 -2
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
- package/dist/features/seller/schemas/coupon-form.js +27 -0
- package/dist/features/seller/schemas/product-form.d.ts +3 -0
- package/dist/features/seller/schemas/product-form.js +5 -0
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +14 -0
- package/dist/features/shell/SectionForm.d.ts +19 -0
- package/dist/features/shell/SectionForm.js +133 -9
- package/dist/features/shell/SectionForm.style.css +54 -0
- package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
- package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
- package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
- package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
- package/dist/features/stores/components/StoreGuideHubView.js +1 -1
- package/dist/features/stores/components/StoreHeader.js +1 -1
- package/dist/features/support/schemas/firestore.d.ts +73 -2
- package/dist/features/support/schemas/firestore.js +59 -0
- package/dist/index.d.ts +16 -24
- package/dist/index.js +38 -47
- package/dist/next/ErrorBoundary.js +1 -1
- package/dist/next/routing/route-map.d.ts +24 -0
- package/dist/next/routing/route-map.js +40 -0
- package/dist/providers/payment-manual/index.d.ts +15 -1
- package/dist/providers/payment-manual/index.js +37 -0
- package/dist/providers/payment-phonepe/index.d.ts +14 -1
- package/dist/providers/payment-phonepe/index.js +36 -0
- package/dist/providers/payment-razorpay/index.d.ts +44 -1
- package/dist/providers/payment-razorpay/index.js +99 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
- package/dist/providers/shipping-shiprocket/index.js +18 -0
- package/dist/schemas/registry.d.ts +44 -11
- package/dist/server-entry.d.ts +2 -0
- package/dist/server-entry.js +27 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.js +98 -0
- package/dist/styles.css +418 -149
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +15 -12
- package/dist/tokens/themes/default-light.js +14 -11
- package/dist/tokens/tokens.css +106 -23
- package/dist/ui/DataTable.style.css +4 -4
- package/dist/ui/columns/cell-renderers.d.ts +20 -0
- package/dist/ui/columns/cell-renderers.js +26 -1
- package/dist/ui/columns/index.d.ts +1 -1
- package/dist/ui/columns/index.js +4 -1
- package/dist/ui/components/Badge.style.css +1 -1
- package/dist/ui/components/Breadcrumb.js +19 -1
- package/dist/ui/components/BulkActionBar.style.css +4 -4
- package/dist/ui/components/Button.style.css +1 -1
- package/dist/ui/components/Checkbox.style.css +1 -1
- package/dist/ui/components/FallbackShell.js +1 -1
- package/dist/ui/components/Form.d.ts +14 -1
- package/dist/ui/components/Form.js +2 -2
- package/dist/ui/components/FormField.js +18 -4
- package/dist/ui/components/FormField.style.css +43 -3
- package/dist/ui/components/GatedPrice.style.css +1 -1
- package/dist/ui/components/IconButton.style.css +1 -1
- package/dist/ui/components/Input.js +22 -1
- package/dist/ui/components/Input.style.css +38 -22
- package/dist/ui/components/ListingFilterDrawer.js +1 -1
- package/dist/ui/components/ListingToolbar.js +1 -1
- package/dist/ui/components/PaginatedSelect.js +0 -0
- package/dist/ui/components/Radio.style.css +1 -1
- package/dist/ui/components/Repeater.d.ts +53 -0
- package/dist/ui/components/Repeater.js +7 -0
- package/dist/ui/components/RichTextEditor.d.ts +20 -1
- package/dist/ui/components/RichTextEditor.js +23 -2
- package/dist/ui/components/Select.style.css +7 -21
- package/dist/ui/components/Semantic.js +27 -3
- package/dist/ui/components/TagInput.style.css +4 -9
- package/dist/ui/components/Textarea.style.css +4 -18
- package/dist/ui/components/Toggle.style.css +1 -1
- package/dist/ui/components/Typography.d.ts +3 -3
- package/dist/ui/components/Typography.js +15 -15
- package/dist/ui/components/ViewToggle.style.css +4 -4
- package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
- package/dist/ui/forms/AddAnotherToggle.js +56 -0
- package/dist/ui/forms/ColorPickerField.js +15 -2
- package/dist/ui/forms/FieldCheckbox.js +15 -2
- package/dist/ui/forms/FieldInput.d.ts +22 -1
- package/dist/ui/forms/FieldInput.js +19 -5
- package/dist/ui/forms/FieldLabel.d.ts +35 -0
- package/dist/ui/forms/FieldLabel.js +70 -0
- package/dist/ui/forms/FieldSelect.d.ts +4 -1
- package/dist/ui/forms/FieldSelect.js +27 -5
- package/dist/ui/forms/FieldTextarea.d.ts +4 -1
- package/dist/ui/forms/FieldTextarea.js +22 -5
- package/dist/ui/forms/FormShell.d.ts +17 -1
- package/dist/ui/forms/FormShell.js +36 -2
- package/dist/ui/forms/FormShell.style.css +41 -33
- package/dist/ui/forms/index.d.ts +5 -1
- package/dist/ui/forms/index.js +2 -0
- package/dist/ui/icons/icon-registry.d.ts +1 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/utils/id-generators.d.ts +80 -0
- package/dist/utils/id-generators.js +93 -0
- package/dist/utils/search-txt-builders.d.ts +12 -0
- package/dist/utils/search-txt-builders.js +17 -0
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +106 -5
- package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
- package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
- package/dist/features/loyalty/api/balance/route.d.ts +0 -12
- package/dist/features/loyalty/api/balance/route.js +0 -41
- package/dist/features/loyalty/api/earn/route.d.ts +0 -12
- package/dist/features/loyalty/api/earn/route.js +0 -38
- package/dist/features/loyalty/api/history/route.d.ts +0 -12
- package/dist/features/loyalty/api/history/route.js +0 -58
- package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
- package/dist/features/loyalty/api/redeem/route.js +0 -38
- package/dist/features/loyalty/columns/index.d.ts +0 -17
- package/dist/features/loyalty/columns/index.js +0 -40
- package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
- package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
- package/dist/features/loyalty/components/index.d.ts +0 -1
- package/dist/features/loyalty/components/index.js +0 -1
- package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
- package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
- package/dist/features/loyalty/index.d.ts +0 -6
- package/dist/features/loyalty/index.js +0 -6
- package/dist/features/loyalty/manifest.d.ts +0 -2
- package/dist/features/loyalty/manifest.js +0 -16
- package/dist/features/loyalty/messages/en.json +0 -19
- package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
- package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
- package/dist/features/loyalty/schemas/index.d.ts +0 -85
- package/dist/features/loyalty/schemas/index.js +0 -40
- package/dist/features/loyalty/server.d.ts +0 -6
- package/dist/features/loyalty/server.js +0 -6
- package/dist/features/loyalty/types/index.d.ts +0 -31
- package/dist/features/loyalty/types/index.js +0 -1
- package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
- package/dist/features/loyalty/types/loyalty-config.js +0 -1
- package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
- package/dist/features/loyalty/types/loyalty-math.js +0 -27
- package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
- package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
|
@@ -11,7 +11,82 @@ const GRADIENTS = {
|
|
|
11
11
|
amber: "var(--appkit-gradient-warning-stat)",
|
|
12
12
|
rose: "var(--appkit-gradient-danger-stat)",
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* A 40×24 trend line. Deliberately NOT recharts.
|
|
16
|
+
*
|
|
17
|
+
* 🛑 recharts IS installed and is used for the three real charts in this app —
|
|
18
|
+
* but it is a ~100 KB client bundle with a `ResponsiveContainer` that measures
|
|
19
|
+
* on mount, and a dashboard home renders six to eight of these. Six
|
|
20
|
+
* ResizeObservers to draw six polylines is a layout-thrash and a bundle cost
|
|
21
|
+
* for 24 pixels of decoration. An inline `<svg>` with a `<polyline>` is the
|
|
22
|
+
* whole feature.
|
|
23
|
+
*
|
|
24
|
+
* `preserveAspectRatio="none"` so the line fills its box at any size: the
|
|
25
|
+
* values are normalised to 0–100 here, so the viewBox IS the data range and
|
|
26
|
+
* stretching it is correct rather than distorting.
|
|
27
|
+
*/
|
|
28
|
+
function Sparkline({ series, rising, }) {
|
|
29
|
+
const min = Math.min(...series);
|
|
30
|
+
const max = Math.max(...series);
|
|
31
|
+
/*
|
|
32
|
+
* 🛑 A FLAT SERIES IS DRAWN FLAT, not divided by zero. When every value is
|
|
33
|
+
* equal `max - min` is 0; the guard puts the line down the middle, which is
|
|
34
|
+
* what "no change" looks like. Without it every point becomes NaN and the
|
|
35
|
+
* polyline silently renders nothing — a missing sparkline that reads as
|
|
36
|
+
* "no data" about a series that is simply steady.
|
|
37
|
+
*/
|
|
38
|
+
const span = max - min || 1;
|
|
39
|
+
const points = series
|
|
40
|
+
.map((v, i) => {
|
|
41
|
+
const x = (i / (series.length - 1)) * 100;
|
|
42
|
+
// SVG y grows downward, so the value is inverted.
|
|
43
|
+
const y = 100 - ((v - min) / span) * 100;
|
|
44
|
+
return `${x.toFixed(2)},${y.toFixed(2)}`;
|
|
45
|
+
})
|
|
46
|
+
.join(" ");
|
|
47
|
+
return (_jsx("svg", { viewBox: "0 0 100 100", preserveAspectRatio: "none", className: "h-full w-full", focusable: "false", children: _jsx("polyline", { points: points, fill: "none", stroke: rising
|
|
48
|
+
? "var(--appkit-color-success)"
|
|
49
|
+
: "var(--appkit-color-error)", strokeWidth: 6, strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) }));
|
|
50
|
+
}
|
|
51
|
+
export function AdminStatCard({ label, value, sub, icon, gradient = "brand", className = "", trendPercent, trendLabel, higherIsBetter = true, series, }) {
|
|
15
52
|
const resolvedGradient = GRADIENTS[gradient] ?? gradient;
|
|
16
|
-
|
|
53
|
+
/*
|
|
54
|
+
* 🛑 `!= null`, NOT a truthiness check. `trendPercent === 0` is a real
|
|
55
|
+
* measurement — "this figure did not move" — and `if (trendPercent)` would
|
|
56
|
+
* discard exactly that reading while keeping every other one. The same
|
|
57
|
+
* mistake as `rating !== undefined` passing for `rating: 0`, which showed
|
|
58
|
+
* five stars on unreviewed products (and is fixed two commits over).
|
|
59
|
+
*/
|
|
60
|
+
const showTrend = trendPercent != null;
|
|
61
|
+
/* Two points minimum: one point is not a line, and a 1-point polyline
|
|
62
|
+
* renders as nothing at all rather than as a dot. */
|
|
63
|
+
const showSpark = Array.isArray(series) && series.length >= 2;
|
|
64
|
+
const up = showTrend && trendPercent > 0;
|
|
65
|
+
const down = showTrend && trendPercent < 0;
|
|
66
|
+
const flat = showTrend && trendPercent === 0;
|
|
67
|
+
/*
|
|
68
|
+
* 🛑 GOOD/BAD IS NOT UP/DOWN. Refunds, cancellations, failed payments and
|
|
69
|
+
* error counts all rise when things go wrong, so `higherIsBetter` decides
|
|
70
|
+
* the colour and the arrow only decides the direction. Tying the tone to
|
|
71
|
+
* the arrow would paint a spike in refunds green.
|
|
72
|
+
*/
|
|
73
|
+
const good = higherIsBetter ? up : down;
|
|
74
|
+
const bad = higherIsBetter ? down : up;
|
|
75
|
+
const trendTone = flat ? "muted" : good ? "success" : bad ? "error" : "muted";
|
|
76
|
+
const trendArrow = flat ? "–" : up ? "▲" : "▼";
|
|
77
|
+
const trendText = flat
|
|
78
|
+
? "no change"
|
|
79
|
+
: `${up ? "up" : "down"} ${Math.abs(trendPercent).toFixed(1).replace(/\.0$/, "")}%`;
|
|
80
|
+
// The sparkline's colour follows the same good/bad rule, not its slope.
|
|
81
|
+
const sparkRising = good || (flat && higherIsBetter);
|
|
82
|
+
return (_jsxs(Div, { className: `relative border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] overflow-hidden ${className}`, rounded: "xl", shadow: "sm-hover-md", children: [_jsx(DynamicBgDiv, { background: resolvedGradient, className: "absolute top-0 left-0 right-0 h-[3px]", "aria-hidden": "true" }), _jsxs(Row, { paddingX: "x-5", paddingY: "b-md-lg", padding: "t-lg", align: "start", justify: "between", gap: "3", children: [_jsxs(Div, { className: "min-w-0 flex-1", children: [_jsx(Text, { className: "text-[11px] tracking-widest text-[var(--appkit-color-text-muted)]", weight: "semibold", transform: "uppercase", children: label }), _jsx(Heading, { level: 3, className: "mt-2 tabular-nums leading-none text-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: value }), sub && (_jsx(Text, { className: "mt-1.5 text-[var(--appkit-color-text-muted)]", size: "xs", children: sub }))] }), icon && (_jsx(DynamicBgDiv, { background: resolvedGradient, className: "flex-shrink-0 w-10 h-10 flex items-center justify-center rounded-lg text-[length:var(--appkit-text-xl)]", children: icon }))] }), (showTrend || showSpark) && (_jsxs(Row, { paddingX: "x-5", padding: "b-md", align: "center", justify: "between", gap: "3", children: [showTrend ? (_jsxs(Text, { size: "xs", color: trendTone, weight: "semibold", children: [_jsxs("span", { "aria-hidden": "true", children: [trendArrow, " "] }), trendText, trendLabel ? (_jsxs(Text, { as: "span", size: "xs", color: "muted", weight: "normal", children: [" ", trendLabel] })) : null] })) : (_jsx("span", {})), showSpark && (
|
|
83
|
+
/*
|
|
84
|
+
🛑 `aria-hidden`, with NO accessible label. A sparkline is a
|
|
85
|
+
decorative restatement of a trend already given in words
|
|
86
|
+
directly beside it — describing it again would make a screen
|
|
87
|
+
reader read the same fact twice. If the series ever carried
|
|
88
|
+
information the trend line does not, it needs a real chart with
|
|
89
|
+
a real description, not a label bolted onto 40 pixels.
|
|
90
|
+
*/
|
|
91
|
+
_jsx(Div, { "aria-hidden": "true", className: "h-6 w-20 flex-shrink-0 opacity-80", children: _jsx(Sparkline, { series: series, rising: sparkRising }) }))] }))] }));
|
|
17
92
|
}
|
|
@@ -105,6 +105,10 @@ export { AdminPayoutMarkPaidModal } from "./AdminPayoutMarkPaidModal";
|
|
|
105
105
|
export type { AdminPayoutMarkPaidModalProps } from "./AdminPayoutMarkPaidModal";
|
|
106
106
|
export { AdminAuditLogView } from "./AdminAuditLogView";
|
|
107
107
|
export type { AdminAuditLogViewProps } from "./AdminAuditLogView";
|
|
108
|
+
export { AdminMoneyCasesView } from "./AdminMoneyCasesView";
|
|
109
|
+
export type { AdminMoneyCasesViewProps } from "./AdminMoneyCasesView";
|
|
110
|
+
export { AdminGatewayEventsView } from "./AdminGatewayEventsView";
|
|
111
|
+
export type { AdminGatewayEventsViewProps } from "./AdminGatewayEventsView";
|
|
108
112
|
export { ViewAuditLogEntryModal } from "./ViewAuditLogEntryModal";
|
|
109
113
|
export type { AuditLogEntryDetail, ViewAuditLogEntryModalProps } from "./ViewAuditLogEntryModal";
|
|
110
114
|
export { ViewNotificationModal } from "./ViewNotificationModal";
|
|
@@ -57,6 +57,12 @@ export { AdminHistoryView } from "./AdminHistoryView.js";
|
|
|
57
57
|
export { AdminPayoutsView } from "./AdminPayoutsView.js";
|
|
58
58
|
export { AdminPayoutMarkPaidModal } from "./AdminPayoutMarkPaidModal.js";
|
|
59
59
|
export { AdminAuditLogView } from "./AdminAuditLogView.js";
|
|
60
|
+
/*
|
|
61
|
+
* Payment protection — the operator queue for everything where money is at
|
|
62
|
+
* risk, and the first surface `paymentCases` has ever had.
|
|
63
|
+
*/
|
|
64
|
+
export { AdminMoneyCasesView } from "./AdminMoneyCasesView.js";
|
|
65
|
+
export { AdminGatewayEventsView } from "./AdminGatewayEventsView.js";
|
|
60
66
|
export { ViewAuditLogEntryModal } from "./ViewAuditLogEntryModal.js";
|
|
61
67
|
export { ViewNotificationModal } from "./ViewNotificationModal.js";
|
|
62
68
|
export { AdminReviewsView } from "./AdminReviewsView.js";
|
|
@@ -699,3 +699,159 @@ export declare const SELLER_BID_STATUS_TABS: readonly [{
|
|
|
699
699
|
readonly id: "cancelled";
|
|
700
700
|
readonly label: "Cancelled";
|
|
701
701
|
}];
|
|
702
|
+
/** Admin > Money cases — `PaymentCaseStatus`. `open` is the birth state. */
|
|
703
|
+
export declare const ADMIN_PAYMENT_CASE_STATUS_TABS: readonly [{
|
|
704
|
+
readonly id: "All";
|
|
705
|
+
readonly label: "All";
|
|
706
|
+
}, {
|
|
707
|
+
readonly id: "open";
|
|
708
|
+
readonly label: "Open";
|
|
709
|
+
}, {
|
|
710
|
+
readonly id: "under-review";
|
|
711
|
+
readonly label: "Under review";
|
|
712
|
+
}, {
|
|
713
|
+
readonly id: "actioned";
|
|
714
|
+
readonly label: "Actioned";
|
|
715
|
+
}, {
|
|
716
|
+
readonly id: "dismissed";
|
|
717
|
+
readonly label: "Dismissed";
|
|
718
|
+
}];
|
|
719
|
+
/**
|
|
720
|
+
* Admin > Money cases — `PaymentCaseKind`, all eleven.
|
|
721
|
+
*
|
|
722
|
+
* Labels are what an operator recognises, not the field value: `missing_order`
|
|
723
|
+
* reads as "Captured, no order", which is what the problem IS. The ids stay
|
|
724
|
+
* byte-exact against the union because they go straight into a Sieve equality
|
|
725
|
+
* and a near-miss returns zero rows forever with no error (Root Cause #33).
|
|
726
|
+
*/
|
|
727
|
+
export declare const ADMIN_PAYMENT_CASE_KIND_TABS: readonly [{
|
|
728
|
+
readonly id: "All";
|
|
729
|
+
readonly label: "All";
|
|
730
|
+
}, {
|
|
731
|
+
readonly id: "missing_order";
|
|
732
|
+
readonly label: "Captured, no order";
|
|
733
|
+
}, {
|
|
734
|
+
readonly id: "dispute";
|
|
735
|
+
readonly label: "Chargeback";
|
|
736
|
+
}, {
|
|
737
|
+
readonly id: "manual_refund_due";
|
|
738
|
+
readonly label: "Refund owed";
|
|
739
|
+
}, {
|
|
740
|
+
readonly id: "refund_mismatch";
|
|
741
|
+
readonly label: "Refund mismatch";
|
|
742
|
+
}, {
|
|
743
|
+
readonly id: "amount_mismatch";
|
|
744
|
+
readonly label: "Amount mismatch";
|
|
745
|
+
}, {
|
|
746
|
+
readonly id: "unprocessed_event";
|
|
747
|
+
readonly label: "Unprocessed event";
|
|
748
|
+
}, {
|
|
749
|
+
readonly id: "status_conflict";
|
|
750
|
+
readonly label: "Status conflict";
|
|
751
|
+
}, {
|
|
752
|
+
readonly id: "protection_claim";
|
|
753
|
+
readonly label: "Protection claim";
|
|
754
|
+
}, {
|
|
755
|
+
readonly id: "grievance";
|
|
756
|
+
readonly label: "Grievance";
|
|
757
|
+
}, {
|
|
758
|
+
readonly id: "shipping_unpriced";
|
|
759
|
+
readonly label: "Shipping unpriced";
|
|
760
|
+
}, {
|
|
761
|
+
readonly id: "dead_job";
|
|
762
|
+
readonly label: "Dead job";
|
|
763
|
+
}, {
|
|
764
|
+
readonly id: "ledger_drift";
|
|
765
|
+
readonly label: "Points drift";
|
|
766
|
+
}];
|
|
767
|
+
/** Admin > Money cases — `PaymentCaseSeverity`. Escalate-only, never downgraded. */
|
|
768
|
+
export declare const ADMIN_PAYMENT_CASE_SEVERITY_TABS: readonly [{
|
|
769
|
+
readonly id: "All";
|
|
770
|
+
readonly label: "All";
|
|
771
|
+
}, {
|
|
772
|
+
readonly id: "error";
|
|
773
|
+
readonly label: "Error";
|
|
774
|
+
}, {
|
|
775
|
+
readonly id: "warning";
|
|
776
|
+
readonly label: "Warning";
|
|
777
|
+
}, {
|
|
778
|
+
readonly id: "info";
|
|
779
|
+
readonly label: "Info";
|
|
780
|
+
}];
|
|
781
|
+
/**
|
|
782
|
+
* Admin > Gateway events — `GatewayEventStatus`.
|
|
783
|
+
*
|
|
784
|
+
* `ignored` is a real, healthy outcome and not a failure: an event type we are
|
|
785
|
+
* subscribed to but do not implement is recorded verbatim and settled
|
|
786
|
+
* `ignored`, which is the whole reason the inbox records unknown events rather
|
|
787
|
+
* than dropping them. `conflict` means a late event would have regressed an
|
|
788
|
+
* order's status — also not an error.
|
|
789
|
+
*/
|
|
790
|
+
export declare const ADMIN_GATEWAY_EVENT_STATUS_TABS: readonly [{
|
|
791
|
+
readonly id: "All";
|
|
792
|
+
readonly label: "All";
|
|
793
|
+
}, {
|
|
794
|
+
readonly id: "received";
|
|
795
|
+
readonly label: "Received";
|
|
796
|
+
}, {
|
|
797
|
+
readonly id: "processing";
|
|
798
|
+
readonly label: "Processing";
|
|
799
|
+
}, {
|
|
800
|
+
readonly id: "processed";
|
|
801
|
+
readonly label: "Processed";
|
|
802
|
+
}, {
|
|
803
|
+
readonly id: "failed";
|
|
804
|
+
readonly label: "Failed";
|
|
805
|
+
}, {
|
|
806
|
+
readonly id: "conflict";
|
|
807
|
+
readonly label: "Late / conflict";
|
|
808
|
+
}, {
|
|
809
|
+
readonly id: "ignored";
|
|
810
|
+
readonly label: "Ignored";
|
|
811
|
+
}];
|
|
812
|
+
/** Admin > Gateway events — `GatewayEventKind`. */
|
|
813
|
+
export declare const ADMIN_GATEWAY_EVENT_KIND_TABS: readonly [{
|
|
814
|
+
readonly id: "All";
|
|
815
|
+
readonly label: "All";
|
|
816
|
+
}, {
|
|
817
|
+
readonly id: "paid";
|
|
818
|
+
readonly label: "Paid";
|
|
819
|
+
}, {
|
|
820
|
+
readonly id: "failed";
|
|
821
|
+
readonly label: "Failed";
|
|
822
|
+
}, {
|
|
823
|
+
readonly id: "refund";
|
|
824
|
+
readonly label: "Refund";
|
|
825
|
+
}, {
|
|
826
|
+
readonly id: "dispute";
|
|
827
|
+
readonly label: "Dispute";
|
|
828
|
+
}, {
|
|
829
|
+
readonly id: "other";
|
|
830
|
+
readonly label: "Other";
|
|
831
|
+
}];
|
|
832
|
+
/** Admin > Protection claims — `ProtectionClaimStatus`. */
|
|
833
|
+
export declare const ADMIN_PROTECTION_CLAIM_STATUS_TABS: readonly [{
|
|
834
|
+
readonly id: "All";
|
|
835
|
+
readonly label: "All";
|
|
836
|
+
}, {
|
|
837
|
+
readonly id: "open";
|
|
838
|
+
readonly label: "Open";
|
|
839
|
+
}, {
|
|
840
|
+
readonly id: "awaiting-return";
|
|
841
|
+
readonly label: "Awaiting return";
|
|
842
|
+
}, {
|
|
843
|
+
readonly id: "inspecting";
|
|
844
|
+
readonly label: "Inspecting";
|
|
845
|
+
}, {
|
|
846
|
+
readonly id: "upheld";
|
|
847
|
+
readonly label: "Upheld";
|
|
848
|
+
}, {
|
|
849
|
+
readonly id: "rejected";
|
|
850
|
+
readonly label: "Rejected";
|
|
851
|
+
}, {
|
|
852
|
+
readonly id: "withdrawn";
|
|
853
|
+
readonly label: "Withdrawn";
|
|
854
|
+
}, {
|
|
855
|
+
readonly id: "expired";
|
|
856
|
+
readonly label: "Expired";
|
|
857
|
+
}];
|
|
@@ -401,3 +401,109 @@ export const SELLER_BID_STATUS_TABS = [
|
|
|
401
401
|
{ id: "lost", label: "Lost" },
|
|
402
402
|
{ id: "cancelled", label: "Cancelled" },
|
|
403
403
|
];
|
|
404
|
+
// ============================================================================
|
|
405
|
+
// PAYMENT PROTECTION — the four collections the money spine writes to
|
|
406
|
+
//
|
|
407
|
+
// All eight arrays below are registered in `audit-filter-tab-enums`, whose
|
|
408
|
+
// COVERAGE check is what makes them worth having: a kind with no chip is a kind
|
|
409
|
+
// an operator cannot isolate, and these are the queues where that costs money
|
|
410
|
+
// rather than convenience (Root Cause #72).
|
|
411
|
+
//
|
|
412
|
+
// They are rendered in a filter PANEL, not an always-visible chip row — eleven
|
|
413
|
+
// case kinds and twelve obligation kinds are a complete set, not a scannable
|
|
414
|
+
// one, and `renderFilterPanel` is where a complete set belongs.
|
|
415
|
+
// ============================================================================
|
|
416
|
+
/** Admin > Money cases — `PaymentCaseStatus`. `open` is the birth state. */
|
|
417
|
+
export const ADMIN_PAYMENT_CASE_STATUS_TABS = [
|
|
418
|
+
ALL_TAB,
|
|
419
|
+
{ id: "open", label: "Open" },
|
|
420
|
+
{ id: "under-review", label: "Under review" },
|
|
421
|
+
{ id: "actioned", label: "Actioned" },
|
|
422
|
+
{ id: "dismissed", label: "Dismissed" },
|
|
423
|
+
];
|
|
424
|
+
/**
|
|
425
|
+
* Admin > Money cases — `PaymentCaseKind`, all eleven.
|
|
426
|
+
*
|
|
427
|
+
* Labels are what an operator recognises, not the field value: `missing_order`
|
|
428
|
+
* reads as "Captured, no order", which is what the problem IS. The ids stay
|
|
429
|
+
* byte-exact against the union because they go straight into a Sieve equality
|
|
430
|
+
* and a near-miss returns zero rows forever with no error (Root Cause #33).
|
|
431
|
+
*/
|
|
432
|
+
export const ADMIN_PAYMENT_CASE_KIND_TABS = [
|
|
433
|
+
ALL_TAB,
|
|
434
|
+
{ id: "missing_order", label: "Captured, no order" },
|
|
435
|
+
{ id: "dispute", label: "Chargeback" },
|
|
436
|
+
{ id: "manual_refund_due", label: "Refund owed" },
|
|
437
|
+
{ id: "refund_mismatch", label: "Refund mismatch" },
|
|
438
|
+
{ id: "amount_mismatch", label: "Amount mismatch" },
|
|
439
|
+
{ id: "unprocessed_event", label: "Unprocessed event" },
|
|
440
|
+
{ id: "status_conflict", label: "Status conflict" },
|
|
441
|
+
{ id: "protection_claim", label: "Protection claim" },
|
|
442
|
+
{ id: "grievance", label: "Grievance" },
|
|
443
|
+
{ id: "shipping_unpriced", label: "Shipping unpriced" },
|
|
444
|
+
{ id: "dead_job", label: "Dead job" },
|
|
445
|
+
{ id: "ledger_drift", label: "Points drift" },
|
|
446
|
+
];
|
|
447
|
+
/** Admin > Money cases — `PaymentCaseSeverity`. Escalate-only, never downgraded. */
|
|
448
|
+
export const ADMIN_PAYMENT_CASE_SEVERITY_TABS = [
|
|
449
|
+
ALL_TAB,
|
|
450
|
+
{ id: "error", label: "Error" },
|
|
451
|
+
{ id: "warning", label: "Warning" },
|
|
452
|
+
{ id: "info", label: "Info" },
|
|
453
|
+
];
|
|
454
|
+
/**
|
|
455
|
+
* Admin > Gateway events — `GatewayEventStatus`.
|
|
456
|
+
*
|
|
457
|
+
* `ignored` is a real, healthy outcome and not a failure: an event type we are
|
|
458
|
+
* subscribed to but do not implement is recorded verbatim and settled
|
|
459
|
+
* `ignored`, which is the whole reason the inbox records unknown events rather
|
|
460
|
+
* than dropping them. `conflict` means a late event would have regressed an
|
|
461
|
+
* order's status — also not an error.
|
|
462
|
+
*/
|
|
463
|
+
export const ADMIN_GATEWAY_EVENT_STATUS_TABS = [
|
|
464
|
+
ALL_TAB,
|
|
465
|
+
{ id: "received", label: "Received" },
|
|
466
|
+
{ id: "processing", label: "Processing" },
|
|
467
|
+
{ id: "processed", label: "Processed" },
|
|
468
|
+
{ id: "failed", label: "Failed" },
|
|
469
|
+
{ id: "conflict", label: "Late / conflict" },
|
|
470
|
+
{ id: "ignored", label: "Ignored" },
|
|
471
|
+
];
|
|
472
|
+
/** Admin > Gateway events — `GatewayEventKind`. */
|
|
473
|
+
export const ADMIN_GATEWAY_EVENT_KIND_TABS = [
|
|
474
|
+
ALL_TAB,
|
|
475
|
+
{ id: "paid", label: "Paid" },
|
|
476
|
+
{ id: "failed", label: "Failed" },
|
|
477
|
+
{ id: "refund", label: "Refund" },
|
|
478
|
+
{ id: "dispute", label: "Dispute" },
|
|
479
|
+
{ id: "other", label: "Other" },
|
|
480
|
+
];
|
|
481
|
+
/*
|
|
482
|
+
* 🛑 NO obligation tab arrays, and the absence is deliberate.
|
|
483
|
+
*
|
|
484
|
+
* `ADMIN_OBLIGATION_STATE_TABS` and `ADMIN_OBLIGATION_KIND_TABS` were written
|
|
485
|
+
* here and removed before shipping, because `/admin/maintenance/obligations`
|
|
486
|
+
* does not filter:
|
|
487
|
+
*
|
|
488
|
+
* · the page reads `obligationsRepository.listDue()`, which returns OPEN and
|
|
489
|
+
* overdue rows by definition — so a state filter would offer five chips of
|
|
490
|
+
* which exactly one can ever match anything;
|
|
491
|
+
* · `ObligationsRepository` declares **no `SIEVE_FIELDS`**, on its own stated
|
|
492
|
+
* reasoning that a filterable surface nothing calls is the speculative-infra
|
|
493
|
+
* pattern. Adding one to feed chips nobody needs would be that pattern
|
|
494
|
+
* twice over.
|
|
495
|
+
*
|
|
496
|
+
* Twelve chips with nothing behind them is exactly the dead control this file's
|
|
497
|
+
* COVERAGE note exists to prevent — it would just fail in the other direction.
|
|
498
|
+
*/
|
|
499
|
+
/** Admin > Protection claims — `ProtectionClaimStatus`. */
|
|
500
|
+
export const ADMIN_PROTECTION_CLAIM_STATUS_TABS = [
|
|
501
|
+
ALL_TAB,
|
|
502
|
+
{ id: "open", label: "Open" },
|
|
503
|
+
{ id: "awaiting-return", label: "Awaiting return" },
|
|
504
|
+
{ id: "inspecting", label: "Inspecting" },
|
|
505
|
+
{ id: "upheld", label: "Upheld" },
|
|
506
|
+
{ id: "rejected", label: "Rejected" },
|
|
507
|
+
{ id: "withdrawn", label: "Withdrawn" },
|
|
508
|
+
{ id: "expired", label: "Expired" },
|
|
509
|
+
];
|
|
@@ -5,6 +5,28 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { BaseRepository } from "../../../providers/db-firebase";
|
|
7
7
|
import { SiteSettingsDocument, SiteSettingsCredentialsMasked, SiteSettingsUpdateInput } from "../schemas";
|
|
8
|
+
/**
|
|
9
|
+
* Flatten a nested update into Firestore dotted field paths, so a partial
|
|
10
|
+
* group update MERGES into the stored map instead of replacing it.
|
|
11
|
+
*
|
|
12
|
+
* `update({ commissions: { gstPercent: 18 } })` deletes every other key under
|
|
13
|
+
* `commissions`; `update({ "commissions.gstPercent": 18 })` touches one leaf.
|
|
14
|
+
* See the call site for the five keys that were silently destroyed by the
|
|
15
|
+
* former (D13).
|
|
16
|
+
*
|
|
17
|
+
* Three cases are deliberately NOT recursed into:
|
|
18
|
+
*
|
|
19
|
+
* · **Arrays** — an array is a VALUE, not a map. Flattening
|
|
20
|
+
* `legalPages.sections.0.title` would make a shorter replacement array leave
|
|
21
|
+
* the old tail in place, which is a worse bug than the one being fixed.
|
|
22
|
+
* · **`undefined`** — kept at its own path so a caller can still delete a
|
|
23
|
+
* field. Recursing would turn it into a path to nothing.
|
|
24
|
+
* · **`Date` and any other class instance** — Firestore stores a `Date` as a
|
|
25
|
+
* Timestamp; walking its properties would write `{}`. Tested by rejecting
|
|
26
|
+
* anything whose prototype is not `Object.prototype`, which also covers
|
|
27
|
+
* `FieldValue` sentinels and `Timestamp` itself.
|
|
28
|
+
*/
|
|
29
|
+
export declare function toDottedPaths(input: Record<string, unknown>, prefix?: string): Record<string, unknown>;
|
|
8
30
|
/**
|
|
9
31
|
* Repository for site settings management
|
|
10
32
|
*
|
|
@@ -17,6 +17,53 @@ import { cacheManager } from "../../../core/CacheManager.js";
|
|
|
17
17
|
import { SITE_SETTINGS_COLLECTION, DEFAULT_SITE_SETTINGS_DATA, } from "../schemas/index.js";
|
|
18
18
|
import { DatabaseError } from "../../../errors/index.js";
|
|
19
19
|
import { decryptSecret, encryptSecret, maskSecret } from "../../../security/index.js";
|
|
20
|
+
/**
|
|
21
|
+
* Flatten a nested update into Firestore dotted field paths, so a partial
|
|
22
|
+
* group update MERGES into the stored map instead of replacing it.
|
|
23
|
+
*
|
|
24
|
+
* `update({ commissions: { gstPercent: 18 } })` deletes every other key under
|
|
25
|
+
* `commissions`; `update({ "commissions.gstPercent": 18 })` touches one leaf.
|
|
26
|
+
* See the call site for the five keys that were silently destroyed by the
|
|
27
|
+
* former (D13).
|
|
28
|
+
*
|
|
29
|
+
* Three cases are deliberately NOT recursed into:
|
|
30
|
+
*
|
|
31
|
+
* · **Arrays** — an array is a VALUE, not a map. Flattening
|
|
32
|
+
* `legalPages.sections.0.title` would make a shorter replacement array leave
|
|
33
|
+
* the old tail in place, which is a worse bug than the one being fixed.
|
|
34
|
+
* · **`undefined`** — kept at its own path so a caller can still delete a
|
|
35
|
+
* field. Recursing would turn it into a path to nothing.
|
|
36
|
+
* · **`Date` and any other class instance** — Firestore stores a `Date` as a
|
|
37
|
+
* Timestamp; walking its properties would write `{}`. Tested by rejecting
|
|
38
|
+
* anything whose prototype is not `Object.prototype`, which also covers
|
|
39
|
+
* `FieldValue` sentinels and `Timestamp` itself.
|
|
40
|
+
*/
|
|
41
|
+
export function toDottedPaths(input, prefix = "") {
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const [key, value] of Object.entries(input)) {
|
|
44
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
45
|
+
const isPlainObject = typeof value === "object" &&
|
|
46
|
+
value !== null &&
|
|
47
|
+
!Array.isArray(value) &&
|
|
48
|
+
Object.getPrototypeOf(value) === Object.prototype;
|
|
49
|
+
if (isPlainObject) {
|
|
50
|
+
const nested = toDottedPaths(value, path);
|
|
51
|
+
/*
|
|
52
|
+
* An EMPTY object is written at its own path rather than vanishing.
|
|
53
|
+
* `{ watermark: {} }` is a caller saying "clear this group"; dropping it
|
|
54
|
+
* because it produced no leaves would silently ignore the instruction.
|
|
55
|
+
*/
|
|
56
|
+
if (Object.keys(nested).length === 0)
|
|
57
|
+
out[path] = value;
|
|
58
|
+
else
|
|
59
|
+
Object.assign(out, nested);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
out[path] = value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
20
67
|
/**
|
|
21
68
|
* Repository for site settings management
|
|
22
69
|
*
|
|
@@ -113,10 +160,44 @@ export class SiteSettingsRepository extends BaseRepository {
|
|
|
113
160
|
...finalUpdates,
|
|
114
161
|
updatedAt: new Date(),
|
|
115
162
|
});
|
|
163
|
+
/*
|
|
164
|
+
* ── D13: DOTTED PATHS, not a wholesale nested-map replace ────────────
|
|
165
|
+
*
|
|
166
|
+
* 🛑 This was `.update(updateData)` with nested objects, and Firestore's
|
|
167
|
+
* `update()` REPLACES a nested map wholesale rather than merging into
|
|
168
|
+
* it. So saving `{ commissions: { platformFeePercent: 2 } }` deleted
|
|
169
|
+
* every other key under `commissions`.
|
|
170
|
+
*
|
|
171
|
+
* That is not hypothetical. `AdminSiteSettingsView`'s commissions
|
|
172
|
+
* payload omitted FIVE keys — `saleProtectionFeeEnabled`,
|
|
173
|
+
* `saleProtectionFeePercent`, `saleProtectionFeeMin`,
|
|
174
|
+
* `codHandlingFeeCap`, `codHandlingFeePercent` — with no state, no field
|
|
175
|
+
* and no control for any of them. So the FIRST save of any commissions
|
|
176
|
+
* field silently:
|
|
177
|
+
*
|
|
178
|
+
* · stopped sale protection being sold, a product we charge 3% (min
|
|
179
|
+
* ₹49) for, with no error and nothing in the UI to notice; and
|
|
180
|
+
* · reverted COD handling to code defaults.
|
|
181
|
+
*
|
|
182
|
+
* It also made CLAUDE.md's stated remediation — "enable them once at
|
|
183
|
+
* Admin → Site Settings → Commissions" — impossible, because there was
|
|
184
|
+
* no control there to enable them with.
|
|
185
|
+
*
|
|
186
|
+
* Flattening to dotted paths is the structural fix: `commissions.gstPercent`
|
|
187
|
+
* touches exactly that leaf. The alternative (adding the five missing
|
|
188
|
+
* fields to the form) fixes TODAY'S instance and leaves the next group
|
|
189
|
+
* that grows a field to hit the same wall — and `legalPages` had already
|
|
190
|
+
* hit it independently (D19), which is the evidence that this recurs.
|
|
191
|
+
*
|
|
192
|
+
* 🛑 ARRAYS AND `undefined` ARE NOT FLATTENED. An array is a value, not a
|
|
193
|
+
* map: flattening `legalPages.sections.0.title` would make a shorter
|
|
194
|
+
* replacement array leave the old tail behind. And `undefined` must stay
|
|
195
|
+
* a top-level delete rather than becoming a dotted path to nothing.
|
|
196
|
+
*/
|
|
116
197
|
await this.db
|
|
117
198
|
.collection(this.collection)
|
|
118
199
|
.doc(this.SINGLETON_ID)
|
|
119
|
-
.update(updateData);
|
|
200
|
+
.update(toDottedPaths(updateData));
|
|
120
201
|
const latest = await this.getSingleton();
|
|
121
202
|
cacheManager.set(this.cacheKey(), latest, {
|
|
122
203
|
ttl: SiteSettingsRepository.CACHE_TTL_MS,
|
|
@@ -92,6 +92,17 @@ export declare const brandFormSchema: z.ZodObject<{
|
|
|
92
92
|
website: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
93
93
|
country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
94
94
|
founded: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
highlightsText: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
96
|
+
faqs: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
97
|
+
question: z.ZodString;
|
|
98
|
+
answer: z.ZodString;
|
|
99
|
+
}, "strip", z.ZodTypeAny, {
|
|
100
|
+
question: string;
|
|
101
|
+
answer: string;
|
|
102
|
+
}, {
|
|
103
|
+
question: string;
|
|
104
|
+
answer: string;
|
|
105
|
+
}>, "many">>;
|
|
95
106
|
isActive: z.ZodBoolean;
|
|
96
107
|
displayOrder: z.ZodOptional<z.ZodNumber>;
|
|
97
108
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -99,20 +110,30 @@ export declare const brandFormSchema: z.ZodObject<{
|
|
|
99
110
|
isActive: boolean;
|
|
100
111
|
country?: string | undefined;
|
|
101
112
|
slug?: string | undefined;
|
|
113
|
+
faqs?: {
|
|
114
|
+
question: string;
|
|
115
|
+
answer: string;
|
|
116
|
+
}[] | undefined;
|
|
102
117
|
description?: string | undefined;
|
|
103
118
|
displayOrder?: number | undefined;
|
|
104
119
|
logoURL?: string | undefined;
|
|
105
120
|
website?: string | undefined;
|
|
106
121
|
founded?: number | undefined;
|
|
122
|
+
highlightsText?: string | undefined;
|
|
107
123
|
}, {
|
|
108
124
|
name: string;
|
|
109
125
|
isActive: boolean;
|
|
110
126
|
country?: string | undefined;
|
|
111
127
|
slug?: string | undefined;
|
|
128
|
+
faqs?: {
|
|
129
|
+
question: string;
|
|
130
|
+
answer: string;
|
|
131
|
+
}[] | undefined;
|
|
112
132
|
description?: string | undefined;
|
|
113
133
|
displayOrder?: number | undefined;
|
|
114
134
|
logoURL?: string | undefined;
|
|
115
135
|
website?: string | undefined;
|
|
116
136
|
founded?: number | undefined;
|
|
137
|
+
highlightsText?: string | undefined;
|
|
117
138
|
}>;
|
|
118
139
|
export type BrandFormValues = z.infer<typeof brandFormSchema>;
|
|
@@ -177,6 +177,50 @@ export const brandFormSchema = z.object({
|
|
|
177
177
|
section: "identity", order: 2, row: "pair", label: "Country of origin",
|
|
178
178
|
}),
|
|
179
179
|
founded: annotate(z.number().int().min(1800, "That is earlier than any brand on record.").max(new Date().getFullYear(), "A founding year cannot be in the future.").optional(), { section: "identity", order: 3, row: "pair", kind: "number", label: "Founded year" }),
|
|
180
|
+
/*
|
|
181
|
+
* ── Editorial content ────────────────────────────────────────────────────
|
|
182
|
+
*
|
|
183
|
+
* 🛑 BOTH OF THESE HAVE RENDERED ON THE BRAND PAGE SINCE THEY SHIPPED, with
|
|
184
|
+
* no way to author them. `BrandDetailPageView:418` mounts
|
|
185
|
+
* `<CategoryHighlightsAndFaqSection highlights={brand?.highlights}
|
|
186
|
+
* faqs={brand?.faqs} />`, `CategoryDocument` declares both with a comment
|
|
187
|
+
* saying they render on "category and BRAND detail pages", and
|
|
188
|
+
* `CATEGORIES_UPDATABLE_FIELDS` has always permitted the write. The only
|
|
189
|
+
* missing piece was a form — the category editor had one, the brand editor
|
|
190
|
+
* did not, so brand highlights and FAQs were unreachable.
|
|
191
|
+
*
|
|
192
|
+
* `highlightsText` is a newline-separated textarea rather than a repeater,
|
|
193
|
+
* matching the category editor exactly: these are a flat `string[]`, an
|
|
194
|
+
* admin pasting five bullets wants to paste five lines, and order is
|
|
195
|
+
* preserved by the text itself.
|
|
196
|
+
*/
|
|
197
|
+
highlightsText: annotate(z.string().optional().or(z.literal("")), {
|
|
198
|
+
section: "content", sectionLabel: "Content", order: 1, row: "full",
|
|
199
|
+
kind: "textarea", label: "Highlights — one per line",
|
|
200
|
+
help: "Short \"why shop this brand\" bullets, shown above the FAQs.",
|
|
201
|
+
}),
|
|
202
|
+
/*
|
|
203
|
+
* 🛑 DECLARED HERE SO THE PARSE COVERS IT, rendered by a custom `renderers`
|
|
204
|
+
* entry in the editor. `buildSectionsFromSchema` has no `kind` for a
|
|
205
|
+
* per-row shape, and inventing one for a single consumer would be the
|
|
206
|
+
* speculative-infra move — `logoURL` already establishes the pattern of a
|
|
207
|
+
* schema field with a bespoke renderer.
|
|
208
|
+
*
|
|
209
|
+
* It lives in the DRAFT rather than its own `useState`, unlike the category
|
|
210
|
+
* editor's three repeaters. Those predate this form being schema-driven;
|
|
211
|
+
* here the draft can hold the array, so validation, dirty-tracking and the
|
|
212
|
+
* error summary all see it, and there is one source of truth instead of two.
|
|
213
|
+
*/
|
|
214
|
+
faqs: annotate(z
|
|
215
|
+
.array(z.object({
|
|
216
|
+
question: z.string().min(1, "A question is required").max(300),
|
|
217
|
+
answer: z.string().min(1, "An answer is required").max(2000),
|
|
218
|
+
}))
|
|
219
|
+
.max(8, "At most 8 questions")
|
|
220
|
+
.optional(), {
|
|
221
|
+
section: "content", order: 2, row: "full", label: "Brand FAQs",
|
|
222
|
+
help: "Rendered beneath the highlights on the brand page.",
|
|
223
|
+
}),
|
|
180
224
|
isActive: annotate(z.boolean(), {
|
|
181
225
|
section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
|
|
182
226
|
label: "Active",
|
|
@@ -292,7 +292,11 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
|
|
|
292
292
|
platformShippingPercent: 10,
|
|
293
293
|
platformShippingFixedMin: 0,
|
|
294
294
|
autoPayoutWindowDays: 7,
|
|
295
|
-
|
|
295
|
+
// 7, not 2 — see `PAYOUT_HOLD_FLOOR_DAYS`. A 2-day hold releases the
|
|
296
|
+
// seller's money inside both the 7-day return window and the 7-day
|
|
297
|
+
// sale-protection claim window, so it was never a legal value; it was
|
|
298
|
+
// merely an unread one (D28).
|
|
299
|
+
payoutHoldDays: 7,
|
|
296
300
|
minPayoutAmount: 100,
|
|
297
301
|
auctionListingFee: 0,
|
|
298
302
|
preOrderListingFee: 0,
|