@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
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* AdminMoneyCasesView โ the operator queue for everything where money is at
|
|
5
|
+
* risk, and the FIRST surface `paymentCases` has ever had.
|
|
6
|
+
*
|
|
7
|
+
* ## Why this page is the point of the whole payment-protection spine
|
|
8
|
+
*
|
|
9
|
+
* The event inbox, the four reconcilers, the obligation sweep, the dispute
|
|
10
|
+
* ingest, the protection claims and the grievance intake all converge on one
|
|
11
|
+
* collection โ and until this view existed, **nothing could read it.** Thirty-six
|
|
12
|
+
* commits of detection wrote rows into a queue with no screen. That is Root
|
|
13
|
+
* Cause #56 at the scale of a subsystem: *a feature is built, one of its
|
|
14
|
+
* surfaces is missing, and nothing notices.*
|
|
15
|
+
*
|
|
16
|
+
* The daily digest was the only consumer, and it was built first for exactly
|
|
17
|
+
* that reason โ it PUSHES, so the queue had one reader from day one. This is
|
|
18
|
+
* the pull side.
|
|
19
|
+
*
|
|
20
|
+
* ## ๐ It is NOT under `/admin/maintenance/`
|
|
21
|
+
*
|
|
22
|
+
* Maintenance means "something broke, look when you can" and is granted to
|
|
23
|
+
* `maintenance_employee`. A case here can carry a gateway's own `respond_by` โ
|
|
24
|
+
* miss it and the chargeback is lost by default irrespective of who was right โ
|
|
25
|
+
* and an `amountAtRisk` in real rupees. Hence its own section and
|
|
26
|
+
* `admin:payment-cases:read|write`, admin only.
|
|
27
|
+
*
|
|
28
|
+
* ## ๐ NO SEARCH BOX, and that is a decision
|
|
29
|
+
*
|
|
30
|
+
* `ListingViewConfig.searchPlaceholder` is optional and *"declaring it is what
|
|
31
|
+
* makes the box exist"*. `/api/admin/payment-cases` does not read `q`, and
|
|
32
|
+
* ~39 views in this codebase already render a box whose endpoint ignores the
|
|
33
|
+
* term โ the user types, the request carries it, nothing changes, no error.
|
|
34
|
+
* Omitting it is the fix; a placeholder describing a capability the endpoint
|
|
35
|
+
* lacks is the defect.
|
|
36
|
+
*
|
|
37
|
+
* ## ๐ The default sort cannot be `dueAt`
|
|
38
|
+
*
|
|
39
|
+
* `dueAt` is OPTIONAL and most cases have none โ only a dispute and a grievance
|
|
40
|
+
* carry an external clock. A Firestore `orderBy` on an optional field silently
|
|
41
|
+
* EXCLUDES every document that lacks it (Root Cause #100), so sorting by
|
|
42
|
+
* deadline would hide the great majority of the queue while looking like it had
|
|
43
|
+
* simply ordered it. `lastObservedAt` is written by `openOrObserve` on every
|
|
44
|
+
* case, every time, so it is the only safe default โ and it happens to be the
|
|
45
|
+
* right one: "what has been seen most recently".
|
|
46
|
+
*
|
|
47
|
+
* Deadline pressure is surfaced instead by the `dueAt` row text and by R4,
|
|
48
|
+
* which escalates and re-notifies at T-72h and T-24h.
|
|
49
|
+
*
|
|
50
|
+
* EXPORTS: AdminMoneyCasesView, type AdminMoneyCasesViewProps
|
|
51
|
+
*
|
|
52
|
+
* @tag domain:payment-cases
|
|
53
|
+
* @tag layer:component
|
|
54
|
+
* @tag pattern:listing
|
|
55
|
+
* @tag access:client
|
|
56
|
+
* @tag consumers:admin/money-cases
|
|
57
|
+
* @tag sideEffects:network
|
|
58
|
+
*/
|
|
59
|
+
import React, { useState } from "react";
|
|
60
|
+
import { sieveFilter, SIEVE_OP, sortBy, } from "@mohasinac/appkit/client";
|
|
61
|
+
import { Button, FilterChipGroup, ListingLayout, RecordDetailModal, Row, RowActionMenu, Stack, Text, } from "../../../ui/index.js";
|
|
62
|
+
import { RecordStatusTimeline } from "../../status-history/components/RecordStatusTimeline.js";
|
|
63
|
+
import { ReviewDecisionModal } from "../../store-extensions/components/ReviewDecisionModal.js";
|
|
64
|
+
import { paymentCaseResolveFormSchema, } from "../../payment-cases/schemas/resolve-form.js";
|
|
65
|
+
import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
|
|
66
|
+
import { ADMIN_PAYMENT_CASE_KIND_TABS, ADMIN_PAYMENT_CASE_SEVERITY_TABS, ADMIN_PAYMENT_CASE_STATUS_TABS, } from "../constants/filter-tabs.js";
|
|
67
|
+
import { toRecordArray, toRelativeDate, toStringValue, } from "../hooks/useAdminListingData.js";
|
|
68
|
+
import { DataListingView } from "./DataListingView.js";
|
|
69
|
+
/**
|
|
70
|
+
* Operator-facing names. Deliberately describe the PROBLEM rather than echo
|
|
71
|
+
* the field value โ `missing_order` is "Captured, no order", which is what has
|
|
72
|
+
* actually happened and what the next action depends on.
|
|
73
|
+
*
|
|
74
|
+
* Kept beside the chip labels rather than shared with them: the chips are terse
|
|
75
|
+
* because they sit in a grid, these head a row and can afford a clause.
|
|
76
|
+
*/
|
|
77
|
+
const KIND_LABEL = {
|
|
78
|
+
missing_order: "Captured payment with no order",
|
|
79
|
+
unprocessed_event: "Gateway event never processed",
|
|
80
|
+
status_conflict: "Late event would have regressed an order",
|
|
81
|
+
dispute: "Chargeback",
|
|
82
|
+
refund_mismatch: "Refund totals disagree with the gateway",
|
|
83
|
+
amount_mismatch: "Captured amount โ recorded total",
|
|
84
|
+
dead_job: "Job exhausted its retries",
|
|
85
|
+
grievance: "Statutory grievance",
|
|
86
|
+
shipping_unpriced: "Store shipping could not be priced",
|
|
87
|
+
protection_claim: "Protection claim",
|
|
88
|
+
manual_refund_due: "Refund owed, no automatic rail",
|
|
89
|
+
};
|
|
90
|
+
/** Rupees, for a row. Plain `toFixed` โ these are already decimal rupees. */
|
|
91
|
+
function money(value) {
|
|
92
|
+
return typeof value === "number" ? `โน${value.toFixed(2)}` : null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Narrow a JSON value to status-history entries.
|
|
96
|
+
*
|
|
97
|
+
* ๐ A FUNCTION, NOT A CAST. This was `detail.statusHistory as
|
|
98
|
+
* StatusChangeEntry[] | undefined`, which `tsc` rejects as insufficiently
|
|
99
|
+
* overlapping โ and the suggested `as unknown as` is the double cast this
|
|
100
|
+
* repo bans outright, because it has zero runtime effect and silences the one
|
|
101
|
+
* type-level signal there was.
|
|
102
|
+
*
|
|
103
|
+
* `detail` is a `JsonObject` off the wire, so narrowing is genuinely needed;
|
|
104
|
+
* the file already does exactly this for scalars via `toStringValue`. An
|
|
105
|
+
* array whose members are not objects returns undefined rather than being
|
|
106
|
+
* waved through โ the timeline renders nothing, which is the honest outcome
|
|
107
|
+
* for data it cannot read.
|
|
108
|
+
*/
|
|
109
|
+
function toStatusHistory(value) {
|
|
110
|
+
if (!Array.isArray(value))
|
|
111
|
+
return undefined;
|
|
112
|
+
const ok = value.every((e) => typeof e === "object" && e !== null);
|
|
113
|
+
return ok ? value : undefined;
|
|
114
|
+
}
|
|
115
|
+
export function AdminMoneyCasesView({ children, ...props }) {
|
|
116
|
+
const [detail, setDetail] = useState(null);
|
|
117
|
+
const [resolveTargetId, setResolveTargetId] = useState(null);
|
|
118
|
+
const [dismissTargetId, setDismissTargetId] = useState(null);
|
|
119
|
+
/*
|
|
120
|
+
* Bumped after every mutation. `DataListingView` keys its react-query cache
|
|
121
|
+
* on `queryKey`, so changing the key is what forces a refetch โ the reports
|
|
122
|
+
* page calls its own `load()` because it owns its fetch; this one does not.
|
|
123
|
+
*/
|
|
124
|
+
const [revision, setRevision] = useState(0);
|
|
125
|
+
if (React.Children.count(children) > 0) {
|
|
126
|
+
return (_jsx(ListingLayout, { portal: "admin", ...props, children: children }));
|
|
127
|
+
}
|
|
128
|
+
const patch = async (id, body) => {
|
|
129
|
+
const res = await fetch(ADMIN_ENDPOINTS.PAYMENT_CASE_BY_ID(id), {
|
|
130
|
+
method: "PATCH",
|
|
131
|
+
headers: { "Content-Type": "application/json" },
|
|
132
|
+
body: JSON.stringify(body),
|
|
133
|
+
});
|
|
134
|
+
if (!res.ok) {
|
|
135
|
+
/*
|
|
136
|
+
* Thrown so `ReviewDecisionModal` stays OPEN and keeps the note the
|
|
137
|
+
* operator just typed. Its catch shows a toast and leaves the dialog up โ
|
|
138
|
+
* a decision that did not save must not look like one that did.
|
|
139
|
+
*/
|
|
140
|
+
throw new Error(`Could not update this case (${res.status})`);
|
|
141
|
+
}
|
|
142
|
+
setRevision((r) => r + 1);
|
|
143
|
+
setDetail(null);
|
|
144
|
+
};
|
|
145
|
+
const config = {
|
|
146
|
+
portal: "admin",
|
|
147
|
+
title: "Money cases",
|
|
148
|
+
subtitle: "Everything where money is at risk โ chargebacks, captured payments with no order, refunds owed, protection claims and grievances. Opened automatically; only a human can close one.",
|
|
149
|
+
emptyLabel: "No open money cases",
|
|
150
|
+
// ๐ No `searchPlaceholder` / `search` โ the endpoint does not read `q`.
|
|
151
|
+
filterKeys: ["status", "kind", "severity"],
|
|
152
|
+
defaultSort: sortBy("lastObservedAt", "DESC"),
|
|
153
|
+
queryKey: ["admin", "payment-cases", "listing", String(revision)],
|
|
154
|
+
endpoint: ADMIN_ENDPOINTS.PAYMENT_CASES,
|
|
155
|
+
/*
|
|
156
|
+
* โโ Two traps avoided here, both measured rather than assumed โโโโโโโโโโ
|
|
157
|
+
*
|
|
158
|
+
* ๐ THERE IS NO "SORT BY SEVERITY" OPTION, even though `severity` is
|
|
159
|
+
* `canSort: true` and the option is the obvious one to offer. It stores the
|
|
160
|
+
* STRINGS `error` / `warning` / `info`, so Firestore orders them
|
|
161
|
+
* alphabetically โ and `DESC` therefore yields **warning, info, error**,
|
|
162
|
+
* putting the most urgent cases LAST. A sort that silently inverts the
|
|
163
|
+
* thing it claims to rank is worse than no sort (Root Cause #63), and it
|
|
164
|
+
* would be believed. `PAYMENT_CASE_SEVERITY_RANK` exists in TypeScript but
|
|
165
|
+
* is not a stored field, so there is nothing to order by; the severity
|
|
166
|
+
* FILTER is the correct control and it is in the panel.
|
|
167
|
+
*
|
|
168
|
+
* ๐ The two optional-field sorts NAME their own exclusion. `dueAt` and
|
|
169
|
+
* `amountAtRisk` are both optional, and a Firestore `orderBy` excludes
|
|
170
|
+
* every document that LACKS the field (Root Cause #100) โ so these sorts
|
|
171
|
+
* genuinely do shrink the list. For these two that is the right semantics
|
|
172
|
+
* ("soonest deadline" is a question about dated cases), but the shrinking
|
|
173
|
+
* must be stated: an unexplained shorter list is how someone concludes the
|
|
174
|
+
* queue is empty when it is not.
|
|
175
|
+
*/
|
|
176
|
+
sortOptions: [
|
|
177
|
+
{ value: sortBy("lastObservedAt", "DESC"), label: "Most recently seen" },
|
|
178
|
+
{ value: sortBy("lastObservedAt", "ASC"), label: "Longest unseen" },
|
|
179
|
+
{ value: sortBy("dueAt", "ASC"), label: "Soonest deadline (dated cases only)" },
|
|
180
|
+
{ value: sortBy("amountAtRisk", "DESC"), label: "Largest amount (money cases only)" },
|
|
181
|
+
{ value: sortBy("observedCount", "DESC"), label: "Most often re-seen" },
|
|
182
|
+
{ value: sortBy("createdAt", "DESC"), label: "Newest" },
|
|
183
|
+
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
184
|
+
],
|
|
185
|
+
mapRows: (response) => toRecordArray(response.items).map((item, index) => {
|
|
186
|
+
const kind = toStringValue(item.kind, "unknown");
|
|
187
|
+
const observed = typeof item.observedCount === "number" ? item.observedCount : 1;
|
|
188
|
+
const amount = money(item.amountAtRisk);
|
|
189
|
+
const due = toStringValue(item.dueAt, "");
|
|
190
|
+
return {
|
|
191
|
+
id: toStringValue(item.id, `case-${index}`),
|
|
192
|
+
primary: toStringValue(item.title, KIND_LABEL[kind] ?? kind),
|
|
193
|
+
secondary: [
|
|
194
|
+
KIND_LABEL[kind] ?? kind,
|
|
195
|
+
amount ? `${amount} at risk` : null,
|
|
196
|
+
// An external deadline is the one thing worth putting in a row.
|
|
197
|
+
due ? `due ${new Date(due).toLocaleString()}` : null,
|
|
198
|
+
// Only mentioned when it is informative โ "seen once" is noise.
|
|
199
|
+
observed > 1 ? `seen ${observed}ร` : null,
|
|
200
|
+
]
|
|
201
|
+
.filter(Boolean)
|
|
202
|
+
.join(" ยท "),
|
|
203
|
+
status: toStringValue(item.status, "open"),
|
|
204
|
+
updatedAt: toRelativeDate(item.lastObservedAt ?? item.createdAt),
|
|
205
|
+
_raw: item,
|
|
206
|
+
};
|
|
207
|
+
}),
|
|
208
|
+
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
209
|
+
onRowClick: (row) => setDetail(row._raw),
|
|
210
|
+
buildFilters: (state) => {
|
|
211
|
+
const parts = [];
|
|
212
|
+
if (state.status && state.status !== "All")
|
|
213
|
+
parts.push(sieveFilter("status", SIEVE_OP.EQ, state.status));
|
|
214
|
+
if (state.kind && state.kind !== "All")
|
|
215
|
+
parts.push(sieveFilter("kind", SIEVE_OP.EQ, state.kind));
|
|
216
|
+
if (state.severity && state.severity !== "All")
|
|
217
|
+
parts.push(sieveFilter("severity", SIEVE_OP.EQ, state.severity));
|
|
218
|
+
return parts.length > 0 ? parts.join(",") : undefined;
|
|
219
|
+
},
|
|
220
|
+
renderRowActions: (row) => {
|
|
221
|
+
const status = row.status;
|
|
222
|
+
const closed = status === "actioned" || status === "dismissed";
|
|
223
|
+
return (_jsx(RowActionMenu, { actions: [
|
|
224
|
+
{ label: "View details", onClick: () => setDetail(row._raw) },
|
|
225
|
+
/*
|
|
226
|
+
* "Take" needs no note โ it records that someone is looking, which
|
|
227
|
+
* the schema's own `superRefine` exempts from the resolution floor.
|
|
228
|
+
* Hidden once closed: re-opening a closed case is not a thing this
|
|
229
|
+
* surface offers, because `resolve()` is one-way by design.
|
|
230
|
+
*/
|
|
231
|
+
...(closed
|
|
232
|
+
? []
|
|
233
|
+
: [
|
|
234
|
+
{
|
|
235
|
+
label: status === "under-review" ? "Already taken" : "Take",
|
|
236
|
+
onClick: () => patch(row.id, { status: "under-review" }),
|
|
237
|
+
disabled: status === "under-review",
|
|
238
|
+
},
|
|
239
|
+
{ label: "Resolve", onClick: () => setResolveTargetId(row.id) },
|
|
240
|
+
{ label: "Dismiss", onClick: () => setDismissTargetId(row.id) },
|
|
241
|
+
]),
|
|
242
|
+
] }));
|
|
243
|
+
},
|
|
244
|
+
renderFilterPanel: ({ pendingFilters, setPendingFilters }) => (_jsxs(Stack, { gap: "md", children: [_jsx(FilterChipGroup, { label: "Status", tabs: ADMIN_PAYMENT_CASE_STATUS_TABS, value: pendingFilters.status ?? "", onChange: (id) => setPendingFilters((p) => ({ ...p, status: id })) }), _jsx(FilterChipGroup, { label: "Severity", tabs: ADMIN_PAYMENT_CASE_SEVERITY_TABS, value: pendingFilters.severity ?? "", onChange: (id) => setPendingFilters((p) => ({ ...p, severity: id })) }), _jsx(FilterChipGroup, { label: "Kind", tabs: ADMIN_PAYMENT_CASE_KIND_TABS, value: pendingFilters.kind ?? "", onChange: (id) => setPendingFilters((p) => ({ ...p, kind: id })) })] })),
|
|
245
|
+
};
|
|
246
|
+
const detailKind = detail ? toStringValue(detail.kind, "") : "";
|
|
247
|
+
const detailStatus = detail ? toStringValue(detail.status, "") : "";
|
|
248
|
+
const selfHealed = detail ? toStringValue(detail.selfHealedAt, "") : "";
|
|
249
|
+
return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), _jsx(RecordDetailModal, { isOpen: detail !== null, onClose: () => setDetail(null), title: detail ? toStringValue(detail.title, "Money case") : "Money case", badges: detail
|
|
250
|
+
? [
|
|
251
|
+
{ label: detailStatus || "open" },
|
|
252
|
+
{ label: KIND_LABEL[detailKind] ?? detailKind },
|
|
253
|
+
{ label: toStringValue(detail.severity, "info") },
|
|
254
|
+
]
|
|
255
|
+
: undefined, description: detail ? toStringValue(detail.detail, "") : undefined, fields: detail
|
|
256
|
+
? [
|
|
257
|
+
{ label: "Case id", value: toStringValue(detail.id, "") },
|
|
258
|
+
{ label: "Subject", value: `${toStringValue(detail.entityType, "")} ${toStringValue(detail.entityId, "")}` },
|
|
259
|
+
{ label: "Amount at risk", value: money(detail.amountAtRisk) ?? "โ" },
|
|
260
|
+
{
|
|
261
|
+
label: "External deadline",
|
|
262
|
+
value: toStringValue(detail.dueAt, "") || "none โ this case has no clock",
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
label: "Times observed",
|
|
266
|
+
value: String(detail.observedCount ?? 1),
|
|
267
|
+
},
|
|
268
|
+
{ label: "Last seen", value: toStringValue(detail.lastObservedAt, "") },
|
|
269
|
+
{ label: "Assigned to", value: toStringValue(detail.assignedTo, "") || "โ" },
|
|
270
|
+
{ label: "Gateway payment", value: toStringValue(detail.gatewayPaymentId, "") || "โ" },
|
|
271
|
+
{ label: "Resolution", value: toStringValue(detail.resolution, "") || "โ" },
|
|
272
|
+
]
|
|
273
|
+
: undefined,
|
|
274
|
+
/*
|
|
275
|
+
* ๐ `selfHealedAt` is rendered as a QUESTION, never as a resolution.
|
|
276
|
+
*
|
|
277
|
+
* A reconciler that stops observing a problem writes this field and
|
|
278
|
+
* nothing else โ the case stays `open` on purpose. "The symptom went
|
|
279
|
+
* away" and "a human understands why" are different facts, and on money
|
|
280
|
+
* only the second one closes anything: a self-healed `missing_order`
|
|
281
|
+
* might mean the retry worked, or might mean somebody refunded it by
|
|
282
|
+
* hand and the order will never exist.
|
|
283
|
+
*/
|
|
284
|
+
extra: detail ? (_jsxs(Stack, { gap: "md", children: [selfHealed ? (_jsx(Row, { surface: "info-surface", padding: "sm", rounded: "default", children: _jsxs(Text, { size: "sm", color: "info", children: ["A reconciler no longer sees this problem (as of", " ", new Date(selfHealed).toLocaleString(), "). That is not a resolution \u2014 confirm what happened, then resolve or dismiss it."] }) })) : null, _jsx(RecordStatusTimeline, { entries: toStatusHistory(detail.statusHistory), truncatedCount: typeof detail.statusHistoryTruncated === "number"
|
|
285
|
+
? detail.statusHistoryTruncated
|
|
286
|
+
: undefined, emptyLabel: "Opened automatically; nothing has happened to it yet" })] })) : undefined, footer: detail && detailStatus !== "actioned" && detailStatus !== "dismissed" ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => setResolveTargetId(toStringValue(detail.id, "")), children: "Resolve" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setDismissTargetId(toStringValue(detail.id, "")), children: "Dismiss" })] })) : undefined }), _jsx(ReviewDecisionModal, { isOpen: resolveTargetId !== null, onClose: () => setResolveTargetId(null), title: "Resolve this case", schema: paymentCaseResolveFormSchema, status: "actioned", noteField: "resolution", noteLabel: "What did you do?", noteHelp: "Required. The next person reading this case has only what you write here.", notePlaceholder: "e.g. Refunded \u20B92,511.80 to the buyer from the Razorpay dashboard; the order could not be placed because the address was missing.", confirmLabel: "Resolve case", onConfirm: (values) => patch(resolveTargetId, values) }), _jsx(ReviewDecisionModal, { isOpen: dismissTargetId !== null, onClose: () => setDismissTargetId(null), title: "Dismiss this case", schema: paymentCaseResolveFormSchema, status: "dismissed", noteField: "resolution", noteLabel: "Why is nothing wrong here?", noteHelp: "Required. A dismissed case with no reason reads identically to one nobody looked at.", notePlaceholder: "e.g. Duplicate of the event two rows above \u2014 same payment id, already refunded.", confirmLabel: "Dismiss case", onConfirm: (values) => patch(dismissTargetId, values) })] }));
|
|
287
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
4
|
* AdminPartsView โ browse and correct the generated part glossary.
|
|
5
5
|
*
|
|
@@ -156,5 +156,5 @@ export function AdminPartsView({ children, ...props }) {
|
|
|
156
156
|
if (React.Children.count(children) > 0) {
|
|
157
157
|
return (_jsxs(ListingLayout, { portal: "admin", ...props, children: [_jsx(Heading, { level: 1, className: "sr-only", children: "Parts" }), children] }));
|
|
158
158
|
}
|
|
159
|
-
return
|
|
159
|
+
return _jsx(DataListingView, { config: ADMIN_PARTS_CONFIG });
|
|
160
160
|
}
|
|
@@ -164,7 +164,42 @@ export function AdminProductsView({ children, ...props }) {
|
|
|
164
164
|
const config = {
|
|
165
165
|
portal: "admin",
|
|
166
166
|
title: "Products",
|
|
167
|
-
|
|
167
|
+
/*
|
|
168
|
+
* ๐ THE BOX PROMISED TWO MATCHES THE INDEX CANNOT MAKE. It read "Search
|
|
169
|
+
* products, SKUs, or seller names", and product search is
|
|
170
|
+
* `array-contains` over `searchTxt`, which `buildProductSearchTxt` feeds
|
|
171
|
+
* from title, description, brand, categoryNames, tags, features,
|
|
172
|
+
* condition, card and grading fields and part-code aliases.
|
|
173
|
+
*
|
|
174
|
+
* Neither promise was keepable. There is NO SKU FIELD on
|
|
175
|
+
* `ProductDocument` at all, and `storeName` โ the real seller-name field
|
|
176
|
+
* โ is not among the tokens. So an admin searching a seller got a
|
|
177
|
+
* plausible empty list, which is the harder version of a dead box: it
|
|
178
|
+
* looks like an answer.
|
|
179
|
+
*
|
|
180
|
+
* Declared through the structured `search` capability rather than a bare
|
|
181
|
+
* `searchPlaceholder`, so `fields` records what the corpus actually
|
|
182
|
+
* matches and the audit can check the placeholder against it.
|
|
183
|
+
*
|
|
184
|
+
* ๐ The promise is narrowed rather than the index widened, deliberately.
|
|
185
|
+
* Adding `storeName` to `buildProductSearchTxt` would make the sentence
|
|
186
|
+
* true only for products written AFTER the change โ every existing row
|
|
187
|
+
* keeps its stored `searchTxt` until something re-saves it โ so it needs
|
|
188
|
+
* a backfill, and that builder already truncates at 600 tokens with a
|
|
189
|
+
* documented eviction order. A real "search by seller" is its own change.
|
|
190
|
+
*/
|
|
191
|
+
search: {
|
|
192
|
+
placeholder: "Search by title, brand, category or tag",
|
|
193
|
+
fields: [
|
|
194
|
+
"title",
|
|
195
|
+
"description",
|
|
196
|
+
"brand",
|
|
197
|
+
"categoryNames",
|
|
198
|
+
"tags",
|
|
199
|
+
"features",
|
|
200
|
+
"condition",
|
|
201
|
+
],
|
|
202
|
+
},
|
|
168
203
|
emptyLabel: "No products found",
|
|
169
204
|
filterKeys: ["status", "type"],
|
|
170
205
|
defaultSort: sortBy("createdAt", "DESC"),
|
|
@@ -212,11 +247,47 @@ export function AdminProductsView({ children, ...props }) {
|
|
|
212
247
|
const base = {
|
|
213
248
|
id,
|
|
214
249
|
primary: toStringValue(item.title ?? item.name, "Untitled product"),
|
|
250
|
+
/*
|
|
251
|
+
* ๐ EVERY ROW READ "Unknown seller ยท No SKU", and both halves were
|
|
252
|
+
* fallbacks for fields that do not exist.
|
|
253
|
+
*
|
|
254
|
+
* `sellerName` is not on `ProductDocument` โ the real field is
|
|
255
|
+
* `storeName`, which a dedicated `storeNameBackfill` job keeps
|
|
256
|
+
* populated precisely so a list row needs no second read. And there
|
|
257
|
+
* is NO SKU FIELD ANYWHERE on the document, so "No SKU" was not a
|
|
258
|
+
* missing value, it was a column for a concept the schema has never
|
|
259
|
+
* had. Same shape as the fix recorded in `AdminOrdersView`, where
|
|
260
|
+
* `buyerName ?? customerName` named two fields the order document
|
|
261
|
+
* never carried.
|
|
262
|
+
*
|
|
263
|
+
* A fallback with no real field behind it is worse than a blank: it
|
|
264
|
+
* reads as data about the record, so "Unknown seller" looked like a
|
|
265
|
+
* catalogue of orphaned listings rather than a view asking for the
|
|
266
|
+
* wrong key.
|
|
267
|
+
*
|
|
268
|
+
* Price and stock replace the SKU slot because they are what an
|
|
269
|
+
* admin scanning this list is actually checking, and they are the
|
|
270
|
+
* two facts the audit named as missing from the row โ it measured
|
|
271
|
+
* ~550px of empty space between the title and the status with "no
|
|
272
|
+
* price, stock, category or location column to fill it".
|
|
273
|
+
*
|
|
274
|
+
* ๐ `sku` stays unprinted rather than being invented. Phase 5 of
|
|
275
|
+
* the plan adds a real SKU field with a generator, a backfill and an
|
|
276
|
+
* index; until it exists, a row that says "No SKU" on every product
|
|
277
|
+
* tells an admin nothing except that we asked.
|
|
278
|
+
*/
|
|
215
279
|
secondary: auctionSecondary ||
|
|
216
280
|
[
|
|
217
|
-
toStringValue(item.
|
|
218
|
-
|
|
219
|
-
|
|
281
|
+
toStringValue(item.storeName, "No store"),
|
|
282
|
+
typeof item.price === "number"
|
|
283
|
+
? `โน${item.price.toLocaleString("en-IN")}`
|
|
284
|
+
: null,
|
|
285
|
+
typeof item.stockQuantity === "number"
|
|
286
|
+
? `${item.stockQuantity} in stock`
|
|
287
|
+
: null,
|
|
288
|
+
]
|
|
289
|
+
.filter(Boolean)
|
|
290
|
+
.join(" ยท "),
|
|
220
291
|
status: toStringValue(item.status, "Unknown"),
|
|
221
292
|
updatedAt: toRelativeDate(item.updatedAt ?? item.createdAt),
|
|
222
293
|
featured: Boolean(item.featured),
|
|
@@ -16,7 +16,7 @@ const __O = {
|
|
|
16
16
|
};
|
|
17
17
|
function NavLink({ item, isActive, onClick }) {
|
|
18
18
|
return (_jsxs(Link, { href: item.href, onClick: onClick, className: `flex items-center justify-end gap-[var(--appkit-space-2-5)] rounded-lg px-[var(--appkit-space-3)] py-[var(--appkit-space-2)] text-[0.8125rem] font-medium leading-tight transition-colors ${isActive
|
|
19
|
-
? "bg-[var(--appkit-color-surface
|
|
19
|
+
? "bg-[var(--appkit-color-surface-elevated)] text-[var(--appkit-color-text)]"
|
|
20
20
|
: "text-[var(--appkit-color-text-muted)] hover:bg-surface-hover hover:text-[var(--appkit-color-text)]"}`, children: [item.icon && _jsx(Span, { size: "base", className: "shrink-0 opacity-60", children: item.icon }), _jsx(Span, { className: "truncate", children: item.label })] }));
|
|
21
21
|
}
|
|
22
22
|
function GroupsContent({ groups, activePath, onItemClick, }) {
|
|
@@ -70,7 +70,7 @@ export function AdminSidebar({ renderNavItems, renderHeader, renderFooter, activ
|
|
|
70
70
|
const mobileNavContent = groups ? (_jsx(GroupsContent, { groups: groups, activePath: activePath, onItemClick: close })) : (_jsxs(Nav, { "aria-label": "Admin sidebar", padding: "y-sm", children: [renderHeader?.(), renderNavItems?.(activePath), renderFooter?.()] }));
|
|
71
71
|
if (variant === "sidebar") {
|
|
72
72
|
const handleToggle = onToggle ?? close;
|
|
73
|
-
return (_jsxs(_Fragment, { children: [
|
|
73
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Div, { className: `hidden lg:flex fixed ${rail.edgeClass} z-40 transition-transform duration-300 top-[var(--header-height,3.5rem)] h-[calc(100vh-var(--header-height,3.5rem))] w-[18rem] ${desktopOpen ? "translate-x-0" : rail.collapsedTranslateClass}`, children: [_jsxs(Stack, { border: "default", surface: "sidePanel", className: `flex-1 ${rail.borderClass} dark:border-[var(--appkit-color-border)] ${__O.hidden}`, shadow: "xl", children: [_jsx(Div, { border: "bottom-subtle", paddingY: "y-sm-tall", className: "shrink-0", padding: "x-md", children: renderHeader ? renderHeader() : _jsx(Span, { size: "xs", weight: "semibold", transform: "uppercase", color: "muted", children: "Admin Panel" }) }), _jsx(Div, { className: `flex-1 ${__O.yAuto}`, children: navContent }), renderFooter && _jsx(Div, { border: "top", padding: "inline", children: renderFooter() })] }), _jsx(SidebarCollapseToggle, { expanded: desktopOpen, onToggle: handleToggle, edge: hand })] }), _jsx(Div, { className: "lg:hidden", children: _jsx(BottomSheet, { open: mobileOpen, onClose: close, title: "Admin Panel", children: mobileNavContent }) })] }));
|
|
74
74
|
}
|
|
75
75
|
return (_jsxs(_Fragment, { children: [mounted && mobileOpen &&
|
|
76
76
|
createPortal(_jsx(DrawerPanel, { title: "Admin Panel", onClose: close, children: navContent }), document.body), _jsx(Div, { className: "lg:hidden", children: _jsx(BottomSheet, { open: mobileOpen, onClose: close, title: "Admin Panel", children: mobileNavContent }) })] }));
|