@mohasinac/appkit 4.30.18 → 4.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/client/features/digital-code/CodeRevealPanel.js +5 -2
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +3 -3
- package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
- package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -86
- package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
- package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
- package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +5 -2
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +11 -3
- package/dist/_internal/client/hand-mode/HandModeProvider.js +2 -0
- package/dist/_internal/server/features/auctions/actions.js +14 -3
- package/dist/_internal/server/features/auctions/service.js +1 -1
- package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
- package/dist/_internal/server/features/auth/permissions.js +3 -2
- package/dist/_internal/server/features/blog/data.js +2 -2
- package/dist/_internal/server/features/blog/service.js +3 -3
- package/dist/_internal/server/features/brands/data.js +1 -1
- package/dist/_internal/server/features/brands/service.js +3 -3
- package/dist/_internal/server/features/bundles/actions.js +6 -1
- package/dist/_internal/server/features/bundles/data.js +21 -4
- package/dist/_internal/server/features/cart/data.js +3 -1
- package/dist/_internal/server/features/cart/service.js +13 -2
- package/dist/_internal/server/features/categories/data.js +26 -6
- package/dist/_internal/server/features/classified/index.d.ts +0 -1
- package/dist/_internal/server/features/classified/index.js +0 -1
- package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
- package/dist/_internal/server/features/digital-code/index.js +0 -1
- package/dist/_internal/server/features/events/actions.js +17 -4
- package/dist/_internal/server/features/events/data.js +1 -1
- package/dist/_internal/server/features/events/service.js +1 -1
- package/dist/_internal/server/features/grouped/data.js +7 -2
- package/dist/_internal/server/features/item-requests/data.js +1 -1
- package/dist/_internal/server/features/live/index.d.ts +0 -1
- package/dist/_internal/server/features/live/index.js +0 -1
- package/dist/_internal/server/features/lottery/actions.js +2 -2
- package/dist/_internal/server/features/lottery/data.js +1 -1
- package/dist/_internal/server/features/orders/actions.js +7 -7
- package/dist/_internal/server/features/orders/data.d.ts +1 -1
- package/dist/_internal/server/features/orders/data.js +14 -2
- package/dist/_internal/server/features/orders/service.js +1 -1
- package/dist/_internal/server/features/pre-orders/service.js +1 -1
- package/dist/_internal/server/features/prize-draws/actions.js +1 -1
- package/dist/_internal/server/features/products/data.js +21 -6
- package/dist/_internal/server/features/products/list-public.d.ts +9 -0
- package/dist/_internal/server/features/products/list-public.js +95 -7
- package/dist/_internal/server/features/products/service.js +1 -1
- package/dist/_internal/server/features/promotions/actions.js +1 -1
- package/dist/_internal/server/features/promotions/data.js +1 -1
- package/dist/_internal/server/features/promotions/service.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/reviews/data.js +6 -1
- package/dist/_internal/server/features/reviews/og-data.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +7 -2
- package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
- package/dist/_internal/server/features/site-settings/adapters.js +8 -5
- package/dist/_internal/server/features/stores/data.js +1 -1
- package/dist/_internal/server/features/sublisting-categories/data.js +1 -1
- package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
- package/dist/_internal/server/features/tester/visibility.js +2 -2
- package/dist/_internal/server/functions/scheduled.d.ts +3 -1
- package/dist/_internal/server/functions/scheduled.js +27 -1
- package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -1
- package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
- 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/onOrderStatusChange.js +7 -15
- package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
- package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
- package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
- package/dist/_internal/server/jobs/core/revenueRollup.js +7 -1
- package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/index.js +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +69 -22
- package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
- package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
- package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
- package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
- package/dist/_internal/shared/features/layout/types.d.ts +37 -1
- package/dist/_internal/shared/features/layout/types.js +19 -1
- package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
- package/dist/_internal/shared/features/notifications/action-url.js +47 -0
- package/dist/_internal/shared/features/offers/config.d.ts +65 -0
- package/dist/_internal/shared/features/offers/config.js +73 -2
- package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
- package/dist/_internal/shared/features/orders/schema.js +22 -2
- package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
- package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
- package/dist/_internal/shared/listing-types/capabilities.js +6 -1
- package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
- package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
- package/dist/client/api/useApiQuery.js +17 -6
- package/dist/client.d.ts +38 -20
- package/dist/client.js +39 -14
- package/dist/configs/next.js +10 -2
- package/dist/constants/api-endpoints.d.ts +18 -54
- package/dist/constants/api-endpoints.js +6 -26
- package/dist/constants/field-names.d.ts +6 -24
- package/dist/constants/field-names.js +10 -27
- package/dist/constants/geo/countries.d.ts +50 -0
- package/dist/constants/geo/countries.js +129 -0
- package/dist/constants/geo/subdivisions.d.ts +13 -0
- package/dist/constants/geo/subdivisions.js +104 -0
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +2 -2
- package/dist/constants/table-keys.d.ts +24 -0
- package/dist/constants/table-keys.js +28 -0
- package/dist/contracts/client-realtime.d.ts +6 -0
- package/dist/contracts/extend.d.ts +0 -9
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/realtime-session.d.ts +12 -12
- package/dist/contracts/realtime-session.js +79 -77
- package/dist/core/browser.d.ts +1 -1
- package/dist/core/browser.js +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/site-config.d.ts +0 -3
- package/dist/core/site-config.js +0 -3
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/errors/messages.d.ts +0 -8
- package/dist/errors/messages.js +0 -9
- package/dist/features/about/components/DeveloperView.js +7 -2
- package/dist/features/about/components/PolicyPageView.js +9 -1
- package/dist/features/about/components/PublicProfileView.js +23 -5
- package/dist/features/about/schemas/index.d.ts +8 -8
- package/dist/features/account/components/AddressFilters.js +32 -11
- package/dist/features/account/components/AddressForm.d.ts +26 -25
- package/dist/features/account/components/AddressForm.js +81 -103
- package/dist/features/account/components/AddressesIndexListing.js +8 -4
- package/dist/features/account/components/NotificationBell.js +4 -3
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOffersPanel.js +1 -1
- package/dist/features/account/components/UserSidebar.d.ts +3 -4
- package/dist/features/account/components/UserSupportView.js +89 -58
- package/dist/features/account/components/index.d.ts +1 -7
- package/dist/features/account/components/index.js +0 -3
- package/dist/features/account/hooks/useAddresses.d.ts +4 -3
- package/dist/features/account/hooks/useAddresses.js +4 -6
- package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
- package/dist/features/account/hooks/useCollapsedSections.js +211 -38
- package/dist/features/account/hooks/useProfile.d.ts +8 -0
- package/dist/features/account/index.d.ts +0 -3
- package/dist/features/account/index.js +0 -3
- package/dist/features/account/schemas/index.d.ts +0 -92
- package/dist/features/account/schemas/index.js +42 -20
- package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
- package/dist/features/addresses/components/AddressLocationFields.js +41 -0
- package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
- package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
- package/dist/features/addresses/schemas/address-form.d.ts +423 -0
- package/dist/features/addresses/schemas/address-form.js +212 -0
- package/dist/features/addresses/schemas/index.d.ts +1 -0
- package/dist/features/addresses/schemas/index.js +8 -0
- package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
- package/dist/features/admin/actions/index.d.ts +0 -1
- package/dist/features/admin/actions/index.js +0 -1
- package/dist/features/admin/actions/notification-actions.js +1 -41
- package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
- package/dist/features/admin/components/AdminActionIndexView.js +128 -0
- package/dist/features/admin/components/AdminAdEditorView.js +159 -163
- package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
- package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
- package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
- package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
- package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
- package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
- package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
- package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
- package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
- package/dist/features/admin/components/AdminFulfillmentView.js +5 -2
- package/dist/features/admin/components/AdminMediaView.js +3 -3
- package/dist/features/admin/components/AdminNavEditorView.js +69 -44
- package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
- package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
- package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
- package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
- package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
- package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
- package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
- package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
- package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
- package/dist/features/admin/components/index.d.ts +2 -2
- package/dist/features/admin/components/index.js +1 -1
- package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
- package/dist/features/admin/constants/site-settings-tabs.js +152 -0
- package/dist/features/admin/index.d.ts +0 -3
- package/dist/features/admin/index.js +0 -2
- package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
- package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
- package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
- package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
- package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
- package/dist/features/admin/schemas/admin-user-form.js +7 -0
- package/dist/features/admin/schemas/firestore.d.ts +48 -95
- package/dist/features/admin/schemas/firestore.js +15 -151
- package/dist/features/admin/schemas/nav-item-form.js +9 -2
- package/dist/features/admin/server.d.ts +0 -4
- package/dist/features/admin/server.js +0 -2
- package/dist/features/admin/types/index.d.ts +0 -7
- package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
- package/dist/features/analytics/repository/page-views.repository.js +24 -0
- package/dist/features/analytics/types.d.ts +1 -1
- package/dist/features/analytics/types.js +13 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +6 -2
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -1
- package/dist/features/auth/actions/index.d.ts +0 -1
- package/dist/features/auth/actions/index.js +0 -1
- package/dist/features/auth/actions/profile-actions.js +4 -3
- package/dist/features/auth/actions/realtime-token-actions.js +1 -12
- package/dist/features/auth/auth-helpers.js +5 -7
- package/dist/features/auth/components/ForgotPasswordView.js +1 -1
- package/dist/features/auth/components/Guards.js +2 -1
- package/dist/features/auth/components/LoginForm.d.ts +0 -2
- package/dist/features/auth/components/LoginForm.js +2 -4
- package/dist/features/auth/components/RegisterForm.js +62 -19
- package/dist/features/auth/components/ResetPasswordView.js +1 -1
- package/dist/features/auth/hooks/useAuth.js +3 -0
- package/dist/features/auth/permissions/constants.d.ts +27 -1
- package/dist/features/auth/role-predicates.d.ts +75 -7
- package/dist/features/auth/role-predicates.js +28 -2
- package/dist/features/auth/schemas/firestore.d.ts +22 -0
- package/dist/features/auth/schemas/index.d.ts +1 -1
- package/dist/features/auth/schemas/index.js +44 -8
- package/dist/features/auth/types/index.d.ts +14 -1
- package/dist/features/blog/api/route.js +10 -2
- package/dist/features/blog/components/BlogIndexListing.js +1 -1
- package/dist/features/blog/hooks/useBlog.js +2 -2
- package/dist/features/blog/repository/blog.repository.js +3 -1
- package/dist/features/blog/schemas/index.d.ts +4 -0
- package/dist/features/blog/schemas/index.js +2 -0
- package/dist/features/blog/types/index.d.ts +1 -1
- package/dist/features/cart/actions/cart-actions.js +13 -4
- package/dist/features/cart/utils/pending-ops.js +1 -1
- package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
- package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/catalogue/schemas/validation.js +47 -10
- package/dist/features/categories/components/BrandDetailPageView.js +28 -12
- package/dist/features/categories/components/CategoryDetailPageView.js +37 -20
- package/dist/features/categories/repository/categories.repository.js +3 -1
- package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
- package/dist/features/categories/schemas/bundle-form.js +149 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +10 -1
- package/dist/features/classified/components/ClassifiedContactSellerPanel.js +1 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
- package/dist/features/classified/components/ClassifiedDetailPageView.js +47 -18
- package/dist/features/consultation/components/ConsultationForm.js +1 -1
- package/dist/features/consultation/schemas/index.js +34 -10
- package/dist/features/corporate/schemas/index.js +36 -15
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -1
- package/dist/features/events/components/EventBanner.js +5 -2
- package/dist/features/events/components/EventOfferCard.js +3 -1
- package/dist/features/events/components/EventPollWidget.js +1 -1
- package/dist/features/events/components/SpinWheelView.js +3 -2
- package/dist/features/filters/FilterPanel.js +3 -3
- package/dist/features/filters/RangeFilter.d.ts +10 -0
- package/dist/features/filters/RangeFilter.js +41 -4
- package/dist/features/grouped/components/GroupedListingEditorView.js +2 -1
- package/dist/features/history/hooks/useHistory.js +29 -27
- package/dist/features/homepage/components/AdSlot.js +3 -1
- package/dist/features/homepage/components/GoogleReviewsSection.js +8 -2
- package/dist/features/homepage/components/MarketplaceHomepageView.js +58 -15
- package/dist/features/homepage/components/SocialFeedSection.js +4 -1
- package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
- package/dist/features/homepage/lib/live-stats.js +8 -1
- package/dist/features/homepage/repository/carousel.repository.js +2 -1
- package/dist/features/layout/BottomActions.js +84 -11
- package/dist/features/layout/BottomActionsContext.d.ts +1 -6
- package/dist/features/layout/BottomActionsContext.js +1 -1
- package/dist/features/layout/hooks/useBottomActions.js +2 -2
- package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
- package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -1
- package/dist/features/lottery/schemas/config-write.d.ts +9 -5
- package/dist/features/lottery/schemas/config-write.js +69 -9
- package/dist/features/media/finalize.js +3 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +5 -2
- package/dist/features/media/modals/VideoTrimModal.js +5 -2
- package/dist/features/media/upload/MediaUploadField.js +2 -2
- package/dist/features/messages/hooks/useConversation.js +18 -4
- package/dist/features/messages/hooks/useConversations.js +25 -8
- package/dist/features/orders/components/RefundRequestView.js +5 -2
- package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
- package/dist/features/orders/schemas/buyer-forms.js +31 -3
- package/dist/features/orders/schemas/index.d.ts +2 -2
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -1
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -1
- package/dist/features/products/components/GroupSettingsPanel.js +3 -1
- package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
- package/dist/features/products/components/MakeOfferButton.js +33 -11
- package/dist/features/products/components/PrizeDrawDetailPageView.js +4 -1
- package/dist/features/products/components/ProductDetailActions.js +0 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
- package/dist/features/products/components/ProductDetailPageView.js +16 -7
- package/dist/features/products/components/ShareButton.js +3 -1
- package/dist/features/products/constants/action-defs.d.ts +1 -2
- package/dist/features/products/constants/action-defs.js +40 -43
- package/dist/features/products/repository/loadProductFeatures.js +10 -2
- package/dist/features/products/repository/products.repository.d.ts +5 -1
- package/dist/features/products/repository/products.repository.js +25 -2
- package/dist/features/products/schemas/firestore.d.ts +7 -3
- package/dist/features/products/schemas/product-features.validators.js +3 -0
- package/dist/features/promotions/components/CouponCard.js +11 -8
- package/dist/features/reviews/actions/review-actions.js +8 -1
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -3
- package/dist/features/reviews/components/ReviewDetailShell.js +3 -1
- package/dist/features/scams/actions/scam-actions.d.ts +9 -1
- package/dist/features/scams/actions/scam-actions.js +52 -12
- package/dist/features/scams/components/SellerTrustBadge.d.ts +1 -1
- package/dist/features/scams/components/SellerTrustBadge.js +13 -0
- package/dist/features/scams/repository/scammer.repository.js +2 -1
- package/dist/features/scams/schemas/firestore.d.ts +15 -1
- package/dist/features/scams/schemas/report-form.d.ts +5 -5
- package/dist/features/scams/schemas/report-form.js +18 -3
- package/dist/features/search/action-index/derive.d.ts +49 -0
- package/dist/features/search/action-index/derive.js +121 -0
- package/dist/features/search/action-index/repository.d.ts +42 -0
- package/dist/features/search/action-index/repository.js +100 -0
- package/dist/features/search/action-index/settings-entries.d.ts +41 -0
- package/dist/features/search/action-index/settings-entries.js +268 -0
- package/dist/features/search/action-index/types.d.ts +81 -0
- package/dist/features/search/action-index/types.js +102 -0
- package/dist/features/search/action-index/validate-entry.d.ts +34 -0
- package/dist/features/search/action-index/validate-entry.js +114 -0
- package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
- package/dist/features/search/hooks/useNavSuggestions.js +23 -3
- package/dist/features/search/repository/search.repository.js +3 -1
- package/dist/features/seller/actions/offer-actions.js +43 -19
- package/dist/features/seller/actions/seller-actions.js +29 -5
- package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
- package/dist/features/seller/components/CategoryChipPicker.js +12 -0
- package/dist/features/seller/components/FulfillmentView.js +5 -2
- package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
- package/dist/features/seller/components/PrintCenterView.js +3 -1
- package/dist/features/seller/components/SellerAddressesView.js +5 -1
- package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
- package/dist/features/seller/components/SellerArtView.d.ts +14 -7
- package/dist/features/seller/components/SellerArtView.js +4 -119
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
- package/dist/features/seller/components/SellerClassifiedView.js +4 -124
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
- package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
- package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
- package/dist/features/seller/components/SellerGoogleReviewsView.js +2 -2
- package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
- package/dist/features/seller/components/SellerListingTypeView.js +277 -0
- package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
- package/dist/features/seller/components/SellerLiveView.js +4 -126
- package/dist/features/seller/components/SellerOrdersView.js +3 -3
- package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
- package/dist/features/seller/components/SellerProductShell.d.ts +5 -0
- package/dist/features/seller/components/SellerProductShell.js +15 -5
- package/dist/features/seller/components/SellerProductsView.js +24 -10
- package/dist/features/seller/components/SellerReviewsView.js +47 -16
- package/dist/features/seller/components/SellerShippingConfigsView.js +5 -4
- package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
- package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
- package/dist/features/seller/components/SellerStickersView.js +4 -119
- package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
- package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
- package/dist/features/seller/components/SellerSupportView.js +100 -0
- package/dist/features/seller/components/index.d.ts +4 -8
- package/dist/features/seller/components/index.js +2 -4
- package/dist/features/seller/index.d.ts +0 -1
- package/dist/features/seller/index.js +0 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
- package/dist/features/seller/schemas/coupon-form.js +155 -23
- package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
- package/dist/features/seller/schemas/offer-forms.js +28 -12
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +2 -2
- package/dist/features/shell/SectionForm.d.ts +19 -1
- package/dist/features/shell/SectionForm.js +104 -17
- package/dist/features/shell/build-sections.d.ts +23 -0
- package/dist/features/shell/build-sections.js +106 -8
- package/dist/features/shell/field-ui-meta.d.ts +44 -0
- package/dist/features/shell/field-ui-meta.js +14 -7
- package/dist/features/shell/form-sections.d.ts +46 -0
- package/dist/features/shell/form-sections.js +114 -0
- package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
- package/dist/features/shipments/schemas/validation.d.ts +2 -2
- package/dist/features/shipments/schemas/validation.js +44 -13
- package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
- package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
- package/dist/features/stores/actions/store-query-actions.js +3 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +12 -3
- package/dist/features/support/repository/support.repository.d.ts +21 -0
- package/dist/features/support/repository/support.repository.js +63 -0
- package/dist/features/support/schemas/firestore.d.ts +27 -2
- package/dist/features/support/schemas/firestore.js +2 -0
- package/dist/features/support/schemas/ticket-create-form.js +7 -0
- package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
- package/dist/features/tester/schemas/checklist-item-form.js +109 -0
- package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
- package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
- package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +291 -30
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +51 -14
- package/dist/features/wishlist/hooks/useWishlistToggle.js +8 -1
- package/dist/http/api-handler.js +2 -1
- package/dist/index.d.ts +25 -104
- package/dist/index.js +38 -143
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.js +1 -1
- package/dist/monitoring/browser.d.ts +0 -2
- package/dist/monitoring/browser.js +12 -1
- package/dist/monitoring/index.d.ts +0 -2
- package/dist/monitoring/index.js +0 -1
- package/dist/next/api/routeHandler.js +9 -4
- package/dist/next/index.d.ts +1 -2
- package/dist/next/index.js +0 -1
- package/dist/next/middleware/index.d.ts +0 -2
- package/dist/next/middleware/index.js +0 -1
- package/dist/next/routing/route-map.d.ts +8 -7
- package/dist/next/routing/route-map.js +10 -3
- package/dist/providers/auth-firebase/session.js +3 -1
- package/dist/providers/db-firebase/admin-app-lite.js +8 -8
- package/dist/providers/db-firebase/admin.js +27 -13
- package/dist/providers/db-firebase/browser-stub.d.ts +1 -11
- package/dist/providers/db-firebase/browser-stub.js +6 -11
- package/dist/providers/db-firebase/index.d.ts +0 -1
- package/dist/providers/db-firebase/index.js +0 -1
- package/dist/providers/db-firebase/rtdb-paths.d.ts +15 -6
- package/dist/providers/db-firebase/rtdb-paths.js +15 -6
- package/dist/providers/db-firebase/rtdb-url.d.ts +27 -0
- package/dist/providers/db-firebase/rtdb-url.js +50 -0
- package/dist/providers/db-firebase/sieve.d.ts +22 -0
- package/dist/providers/firebase-client/realtime.d.ts +20 -0
- package/dist/providers/firebase-client/realtime.js +34 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +1 -1
- package/dist/react/hooks/use-action-dispatch.js +8 -2
- package/dist/react/hooks/useFormStatePreservation.js +3 -1
- package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
- package/dist/react/hooks/useListingTypeFlags.js +1 -1
- package/dist/react/hooks/usePendingFilters.js +5 -3
- package/dist/react/hooks/usePendingTable.js +15 -3
- package/dist/react/hooks/useRealtimeEvent.js +20 -9
- package/dist/repositories/index.d.ts +0 -1
- package/dist/repositories/index.js +0 -1
- package/dist/schemas/registry.d.ts +197 -232
- package/dist/schemas/registry.js +5 -6
- package/dist/schemas/webhooks/razorpay.d.ts +50 -50
- package/dist/security/authorization.d.ts +9 -0
- package/dist/security/authorization.js +16 -2
- package/dist/security/browser.d.ts +1 -3
- package/dist/security/browser.js +5 -2
- package/dist/security/index.d.ts +1 -3
- package/dist/security/index.js +19 -2
- package/dist/security/pii-encrypt.js +16 -0
- package/dist/security/pii-schemas.d.ts +0 -14
- package/dist/security/pii-schemas.js +7 -15
- package/dist/seed/_helpers/category-forest.js +2 -2
- package/dist/seed/_helpers/media.d.ts +19 -0
- package/dist/seed/_helpers/media.js +75 -0
- package/dist/seed/blog-posts-seed-data.js +17 -17
- package/dist/seed/carousel-slides-seed-data.js +7 -7
- package/dist/seed/cart-seed-data.js +13 -13
- package/dist/seed/categories-seed-data.js +10 -10
- package/dist/seed/events-seed-data.js +24 -24
- package/dist/seed/factories/product.factory.js +4 -4
- package/dist/seed/factories/store.factory.js +3 -3
- package/dist/seed/factories/user.factory.js +2 -2
- package/dist/seed/grouped-listings-seed-data.js +11 -11
- package/dist/seed/homepage-sections-seed-data.js +2 -2
- package/dist/seed/index.d.ts +0 -1
- package/dist/seed/index.js +0 -1
- package/dist/seed/manifest.d.ts +1 -1
- package/dist/seed/manifest.js +0 -5
- package/dist/seed/notifications-seed-data.js +20 -1
- package/dist/seed/orders-seed-data.js +2 -2
- package/dist/seed/products-art-seed-data.js +16 -16
- package/dist/seed/products-auctions-seed-data.js +34 -34
- package/dist/seed/products-classifieds-seed-data.js +35 -37
- package/dist/seed/products-digital-codes-seed-data.js +20 -20
- package/dist/seed/products-live-items-seed-data.js +11 -11
- package/dist/seed/products-preorders-seed-data.js +13 -13
- package/dist/seed/products-prize-draws-seed-data.js +43 -43
- package/dist/seed/products-standard-seed-data.js +54 -54
- package/dist/seed/products-stickers-seed-data.js +15 -15
- package/dist/seed/reviews-seed-data.js +4 -4
- package/dist/seed/scammers-seed-data.js +3 -3
- package/dist/seed/site-settings-seed-data.js +11 -24
- package/dist/seed/store-extensions-seed-data.js +10 -10
- package/dist/seed/stores-seed-data.js +11 -11
- package/dist/seed/support-tickets-seed-data.d.ts +14 -0
- package/dist/seed/support-tickets-seed-data.js +20 -1
- package/dist/seed/users-seed-data.js +20 -20
- package/dist/server-entry.d.ts +0 -1
- package/dist/server-entry.js +0 -1
- package/dist/server.d.ts +9 -6
- package/dist/server.js +7 -13
- package/dist/styles.css +248 -68
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +2 -2
- package/dist/tokens/themes/default-light.js +2 -2
- package/dist/tokens/tokens.css +24 -4
- package/dist/ui/components/ActionRow.d.ts +50 -0
- package/dist/ui/components/ActionRow.js +53 -0
- package/dist/ui/components/ActionRow.style.css +145 -0
- package/dist/ui/components/Drawer.d.ts +10 -0
- package/dist/ui/components/Drawer.js +2 -1
- package/dist/ui/components/FilterDrawer.js +4 -1
- package/dist/ui/components/FilterDrawer.style.css +6 -12
- package/dist/ui/components/FormActionBar.js +14 -1
- package/dist/ui/components/FormActionBar.style.css +12 -11
- package/dist/ui/components/ListingLayout.js +8 -1
- package/dist/ui/components/ListingLayout.style.css +6 -13
- package/dist/ui/components/Modal.d.ts +15 -1
- package/dist/ui/components/Modal.js +17 -3
- package/dist/ui/components/QuickCreateModal.js +2 -2
- package/dist/ui/components/QuickCreateModal.style.css +78 -84
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/components/SideDrawer.d.ts +8 -0
- package/dist/ui/components/SideDrawer.js +2 -1
- package/dist/ui/components/SideDrawer.style.css +6 -3
- package/dist/ui/components/SideModal.d.ts +11 -1
- package/dist/ui/components/SideModal.js +3 -2
- package/dist/ui/components/SideModal.style.css +14 -0
- package/dist/ui/components/Typography.style.css +33 -24
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/toolbar-collapse.js +1 -2
- package/dist/ui/forms/FormShell.style.css +260 -311
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.js +1 -1
- package/dist/validation/schemas.d.ts +0 -19
- package/dist/validation/schemas.js +8 -19
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +3 -6
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: An index of "everything a user can do" is worth having exactly once and
|
|
3
|
+
* worth maintaining never. Hand-writing 260 entries beside the nav arrays
|
|
4
|
+
* they duplicate produces the drift this plan has spent every wave
|
|
5
|
+
* undoing — ten hand-written enumerations of one union (Root Cause #61),
|
|
6
|
+
* three option arrays that had each silently lost a value (W3c), fifteen
|
|
7
|
+
* postal rules (W5).
|
|
8
|
+
* WHAT: Derive the static base FROM the nav groups and the quick-action
|
|
9
|
+
* registry, so an entry cannot exist without its nav item and cannot
|
|
10
|
+
* go stale when one is renamed.
|
|
11
|
+
*
|
|
12
|
+
* W6 is what makes this possible: every nav item now carries a `description`,
|
|
13
|
+
* `keywords` and a derived `id`. Before that there was nothing to derive
|
|
14
|
+
* from — which is the actual reason `Search.tsx`'s finished `quickLinks` path
|
|
15
|
+
* was never wired to anything.
|
|
16
|
+
*
|
|
17
|
+
* EXPORTS: deriveNavEntries, deriveQuickActionEntries, buildActionIndexBase
|
|
18
|
+
*
|
|
19
|
+
* @tag domain:search
|
|
20
|
+
* @tag layer:shared
|
|
21
|
+
* @tag pattern:none
|
|
22
|
+
* @tag access:isomorphic
|
|
23
|
+
* @tag consumers:action-index route,CommandPalette
|
|
24
|
+
* @tag sideEffects:none
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Every sidebar entry, as an index entry.
|
|
28
|
+
*
|
|
29
|
+
* `sectionPath` is the breadcrumb a result row shows — "Admin › System › Site
|
|
30
|
+
* Settings" — and it is the reason the group title is worth carrying: two
|
|
31
|
+
* portals both have "Orders", and without the path a result list shows the
|
|
32
|
+
* same word twice with no way to tell which one you want.
|
|
33
|
+
*/
|
|
34
|
+
export function deriveNavEntries(sources) {
|
|
35
|
+
const entries = [];
|
|
36
|
+
for (const { portal, portalLabel, groups } of sources) {
|
|
37
|
+
for (const group of groups) {
|
|
38
|
+
for (const item of group.items) {
|
|
39
|
+
entries.push({
|
|
40
|
+
/*
|
|
41
|
+
* The nav item's own derived id, reused rather than re-derived. It
|
|
42
|
+
* is already `nav-{portal}-{slug}`, so prefixing the kind keeps the
|
|
43
|
+
* index's `{portal}:{kind}:{slug}` convention without inventing a
|
|
44
|
+
* second identity for the same thing.
|
|
45
|
+
*/
|
|
46
|
+
id: item.id ?? `${portal}:nav:${item.href}`,
|
|
47
|
+
kind: "nav",
|
|
48
|
+
portal,
|
|
49
|
+
label: item.label,
|
|
50
|
+
description: item.description,
|
|
51
|
+
keywords: item.keywords,
|
|
52
|
+
href: item.href,
|
|
53
|
+
sectionPath: `${portalLabel} › ${group.title}`,
|
|
54
|
+
...(item.requiredPermission
|
|
55
|
+
? { requiredPermission: item.requiredPermission }
|
|
56
|
+
: {}),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return entries;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Quick actions, as index entries.
|
|
65
|
+
*
|
|
66
|
+
* 🛑 An action with no resolvable href is DROPPED, not indexed with a blank
|
|
67
|
+
* one. `DASHBOARD_QUICK_ACTION_META`'s `routeKey` is dead — every page
|
|
68
|
+
* re-declares its own `*_QUICK_ACTION_HREFS` map instead — so a registry entry
|
|
69
|
+
* may genuinely have nowhere to go. Indexing it anyway produces a search
|
|
70
|
+
* result that does nothing when clicked, which is worse than not finding it.
|
|
71
|
+
*/
|
|
72
|
+
export function deriveQuickActionEntries(actions, portal, portalLabel, hrefFor) {
|
|
73
|
+
const entries = [];
|
|
74
|
+
for (const action of actions) {
|
|
75
|
+
const href = action.href ?? hrefFor(action);
|
|
76
|
+
if (!href)
|
|
77
|
+
continue;
|
|
78
|
+
entries.push({
|
|
79
|
+
id: `${portal}:action:${action.id}`,
|
|
80
|
+
kind: "action",
|
|
81
|
+
portal,
|
|
82
|
+
label: action.label,
|
|
83
|
+
description: action.description,
|
|
84
|
+
keywords: action.keywords,
|
|
85
|
+
href,
|
|
86
|
+
sectionPath: `${portalLabel} › Quick actions`,
|
|
87
|
+
...(action.iconKey ? { iconName: action.iconKey } : {}),
|
|
88
|
+
...(action.requiredPermission
|
|
89
|
+
? { requiredPermission: action.requiredPermission }
|
|
90
|
+
: {}),
|
|
91
|
+
...(action.requiredRole ? { requiredRole: action.requiredRole } : {}),
|
|
92
|
+
/*
|
|
93
|
+
* A quick action is a shortcut to something already reachable from the
|
|
94
|
+
* nav, so it ranks BELOW the nav entry for the same screen. Searching
|
|
95
|
+
* "orders" should land on Orders, not on "Create an order".
|
|
96
|
+
*/
|
|
97
|
+
weight: -10,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return entries;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Assemble the static base.
|
|
104
|
+
*
|
|
105
|
+
* Deduplicated by id, first writer winning, so a quick action that shares an
|
|
106
|
+
* id with a nav entry does not produce two rows for one destination — and the
|
|
107
|
+
* nav entry, being passed first, is the one that survives.
|
|
108
|
+
*/
|
|
109
|
+
export function buildActionIndexBase(...groups) {
|
|
110
|
+
const seen = new Set();
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const list of groups) {
|
|
113
|
+
for (const entry of list) {
|
|
114
|
+
if (seen.has(entry.id))
|
|
115
|
+
continue;
|
|
116
|
+
seen.add(entry.id);
|
|
117
|
+
out.push(entry);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { BaseRepository } from "../../../providers/db-firebase";
|
|
2
|
+
import { type ActionIndexControl, type ActionIndexEntry, type ActionIndexOverride } from "./types";
|
|
3
|
+
/** The stored document. `id` is always `ACTION_INDEX_DOC_ID`. */
|
|
4
|
+
export interface ActionIndexDocument extends ActionIndexControl {
|
|
5
|
+
id: string;
|
|
6
|
+
updatedAt?: Date;
|
|
7
|
+
updatedBy?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ActionIndexRepository extends BaseRepository<ActionIndexDocument> {
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* The control document, or an empty one.
|
|
13
|
+
*
|
|
14
|
+
* 🛑 Returns EMPTY rather than null, and that is load-bearing:
|
|
15
|
+
* `mergeActionIndex` treats a missing control as "no overrides", so a site
|
|
16
|
+
* that has never opened the admin screen still gets the full static base.
|
|
17
|
+
* A null here would make every caller write the same `?? EMPTY` and one of
|
|
18
|
+
* them would forget, blanking the search.
|
|
19
|
+
*/
|
|
20
|
+
getControl(): Promise<ActionIndexControl>;
|
|
21
|
+
/**
|
|
22
|
+
* Overwrite one entry's override.
|
|
23
|
+
*
|
|
24
|
+
* Merged into the stored map rather than replacing it, because the admin
|
|
25
|
+
* screen edits one row at a time and a whole-map write would drop every
|
|
26
|
+
* other override made in a different browser tab — the lost-update shape
|
|
27
|
+
* that `mergeLotteryConfig` exists to prevent on the lottery side.
|
|
28
|
+
*/
|
|
29
|
+
setOverride(entryId: string, override: ActionIndexOverride, actorUid: string): Promise<void>;
|
|
30
|
+
/** Drop an override, returning the entry to whatever the code says. */
|
|
31
|
+
clearOverride(entryId: string, actorUid: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Replace the admin-authored entries.
|
|
34
|
+
*
|
|
35
|
+
* Whole-array, unlike `setOverride`: the custom list is edited as a list in
|
|
36
|
+
* one screen, and its ids are chosen by the admin rather than derived, so
|
|
37
|
+
* there is no stable key to merge on.
|
|
38
|
+
*/
|
|
39
|
+
setCustomEntries(custom: ActionIndexEntry[], actorUid: string): Promise<void>;
|
|
40
|
+
private write;
|
|
41
|
+
}
|
|
42
|
+
export declare const actionIndexRepository: ActionIndexRepository;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: D7 — the action index is a Firestore CONTROL PLANE over a static TS
|
|
3
|
+
* base, not a second copy of it. An admin can hide, rename, re-describe,
|
|
4
|
+
* retag, reorder and author entries; the code keeps `kind`, `href` and
|
|
5
|
+
* every permission field for built-ins, because renaming a toggle is
|
|
6
|
+
* content and repointing a built-in route is routing.
|
|
7
|
+
* WHAT: The `actionIndex/global` singleton and its repository.
|
|
8
|
+
*
|
|
9
|
+
* ## Deliberately NOT folded into `siteSettings`
|
|
10
|
+
*
|
|
11
|
+
* That document is read by an unauthenticated, edge-cached route
|
|
12
|
+
* (`GET /api/site-settings`, `s-maxage=600`). This one is projected by role and
|
|
13
|
+
* must never be served from a shared cache — putting them together is one
|
|
14
|
+
* refactor away from publishing the admin site map, which is exactly the class
|
|
15
|
+
* of defect Root Cause #70 records.
|
|
16
|
+
*
|
|
17
|
+
* ## One document, ~85 KB
|
|
18
|
+
*
|
|
19
|
+
* ~380 entries at full size, comfortably inside Firestore's 1 MB ceiling, and
|
|
20
|
+
* one read rather than a query. The read path caches for 5 minutes and is
|
|
21
|
+
* fetched **once per session per portal** — a read per keystroke would exhaust
|
|
22
|
+
* the 50k/day free tier at roughly thirty sessions, and typeahead matching has
|
|
23
|
+
* to be sub-16ms anyway, which a network hop is not.
|
|
24
|
+
*
|
|
25
|
+
* EXPORTS: ActionIndexRepository, actionIndexRepository
|
|
26
|
+
*
|
|
27
|
+
* @tag domain:search
|
|
28
|
+
* @tag layer:repository
|
|
29
|
+
* @tag pattern:singleton-doc
|
|
30
|
+
* @tag access:server
|
|
31
|
+
* @tag consumers:/api/admin/action-index,/api/action-index
|
|
32
|
+
* @tag sideEffects:firestore
|
|
33
|
+
*/
|
|
34
|
+
import { BaseRepository } from "../../../providers/db-firebase";
|
|
35
|
+
import { ACTION_INDEX_COLLECTION, ACTION_INDEX_DOC_ID, } from "./types";
|
|
36
|
+
/** What an empty control plane looks like — no overrides, no custom entries. */
|
|
37
|
+
const EMPTY_CONTROL = { entries: {}, custom: [] };
|
|
38
|
+
export class ActionIndexRepository extends BaseRepository {
|
|
39
|
+
constructor() {
|
|
40
|
+
super(ACTION_INDEX_COLLECTION);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The control document, or an empty one.
|
|
44
|
+
*
|
|
45
|
+
* 🛑 Returns EMPTY rather than null, and that is load-bearing:
|
|
46
|
+
* `mergeActionIndex` treats a missing control as "no overrides", so a site
|
|
47
|
+
* that has never opened the admin screen still gets the full static base.
|
|
48
|
+
* A null here would make every caller write the same `?? EMPTY` and one of
|
|
49
|
+
* them would forget, blanking the search.
|
|
50
|
+
*/
|
|
51
|
+
async getControl() {
|
|
52
|
+
const doc = await this.findById(ACTION_INDEX_DOC_ID);
|
|
53
|
+
if (!doc)
|
|
54
|
+
return EMPTY_CONTROL;
|
|
55
|
+
return { entries: doc.entries ?? {}, custom: doc.custom ?? [] };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Overwrite one entry's override.
|
|
59
|
+
*
|
|
60
|
+
* Merged into the stored map rather than replacing it, because the admin
|
|
61
|
+
* screen edits one row at a time and a whole-map write would drop every
|
|
62
|
+
* other override made in a different browser tab — the lost-update shape
|
|
63
|
+
* that `mergeLotteryConfig` exists to prevent on the lottery side.
|
|
64
|
+
*/
|
|
65
|
+
async setOverride(entryId, override, actorUid) {
|
|
66
|
+
const control = await this.getControl();
|
|
67
|
+
const next = {
|
|
68
|
+
...control,
|
|
69
|
+
entries: { ...control.entries, [entryId]: override },
|
|
70
|
+
};
|
|
71
|
+
await this.write(next, actorUid);
|
|
72
|
+
}
|
|
73
|
+
/** Drop an override, returning the entry to whatever the code says. */
|
|
74
|
+
async clearOverride(entryId, actorUid) {
|
|
75
|
+
const control = await this.getControl();
|
|
76
|
+
const entries = { ...control.entries };
|
|
77
|
+
delete entries[entryId];
|
|
78
|
+
await this.write({ ...control, entries }, actorUid);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Replace the admin-authored entries.
|
|
82
|
+
*
|
|
83
|
+
* Whole-array, unlike `setOverride`: the custom list is edited as a list in
|
|
84
|
+
* one screen, and its ids are chosen by the admin rather than derived, so
|
|
85
|
+
* there is no stable key to merge on.
|
|
86
|
+
*/
|
|
87
|
+
async setCustomEntries(custom, actorUid) {
|
|
88
|
+
const control = await this.getControl();
|
|
89
|
+
await this.write({ ...control, custom }, actorUid);
|
|
90
|
+
}
|
|
91
|
+
async write(control, actorUid) {
|
|
92
|
+
const payload = { ...control, updatedAt: new Date(), updatedBy: actorUid };
|
|
93
|
+
const existing = await this.findById(ACTION_INDEX_DOC_ID);
|
|
94
|
+
if (existing)
|
|
95
|
+
await this.update(ACTION_INDEX_DOC_ID, payload);
|
|
96
|
+
else
|
|
97
|
+
await this.createWithId(ACTION_INDEX_DOC_ID, payload);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export const actionIndexRepository = new ActionIndexRepository();
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { SiteSettingsTabId } from "../../admin/constants/site-settings-tabs";
|
|
2
|
+
import type { ActionIndexEntry } from "./types";
|
|
3
|
+
/** One control on the site-settings screen. */
|
|
4
|
+
export interface SettingsIndexSource {
|
|
5
|
+
/** Slug — becomes both the entry id and the `#anchor`. */
|
|
6
|
+
slug: string;
|
|
7
|
+
label: string;
|
|
8
|
+
description: string;
|
|
9
|
+
keywords: string[];
|
|
10
|
+
tab: SiteSettingsTabId;
|
|
11
|
+
/** `toggle` for an on/off switch, `setting` for a value. */
|
|
12
|
+
kind: "toggle" | "setting";
|
|
13
|
+
/**
|
|
14
|
+
* Whether the view renders `id="setting-{slug}"` for this control.
|
|
15
|
+
*
|
|
16
|
+
* 🛑 Opt-in, and audited. An anchor that matches no `id=` in the DOM scrolls
|
|
17
|
+
* nowhere and reads as the search having missed — so claiming one you have
|
|
18
|
+
* not added is worse than not claiming it. An entry without one deep-links
|
|
19
|
+
* to its TAB, which is truthful: "this lives on the Fees tab" is a smaller
|
|
20
|
+
* promise than "here is the control", and it is one the page can keep.
|
|
21
|
+
*/
|
|
22
|
+
anchored?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The controls worth finding.
|
|
26
|
+
*
|
|
27
|
+
* Deliberately not all ~160: a search result list is only useful while it is
|
|
28
|
+
* short, and "Hero title" is not something anyone hunts for — they open the
|
|
29
|
+
* About tab and see it. What is here is what someone arrives ALREADY looking
|
|
30
|
+
* for, usually in a hurry, and usually not knowing which tab it is filed under.
|
|
31
|
+
*/
|
|
32
|
+
export declare const SITE_SETTINGS_ENTRIES: readonly SettingsIndexSource[];
|
|
33
|
+
/**
|
|
34
|
+
* The settings entries, as index entries.
|
|
35
|
+
*
|
|
36
|
+
* `deepLink` carries the whole query-and-hash — `?tab=fees#setting-cod-enabled`
|
|
37
|
+
* — rather than just the tab, because landing on the right tab and leaving the
|
|
38
|
+
* reader to find the control among forty others is most of the way to not
|
|
39
|
+
* having searched at all.
|
|
40
|
+
*/
|
|
41
|
+
export declare function deriveSettingsEntries(settingsHref: string, requiredPermission?: string): ActionIndexEntry[];
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: "It should be searchable — if I search for the maintenance toggle it
|
|
3
|
+
* should find it." A nav-only index cannot: the maintenance toggle is
|
|
4
|
+
* not a page, it is a control on tab ⓵ of an 1800-line settings screen,
|
|
5
|
+
* and the only thing naming it is a `<Toggle label="Maintenance mode">`
|
|
6
|
+
* inside that screen's JSX.
|
|
7
|
+
* WHAT: Track B — the declarative map of settings and toggles, each with the
|
|
8
|
+
* `?tab=`/`#anchor` that reaches the control itself.
|
|
9
|
+
*
|
|
10
|
+
* ## Why this is declared rather than derived
|
|
11
|
+
*
|
|
12
|
+
* Track A (`FieldUiMeta.index`) covers every schema-driven form for free. It
|
|
13
|
+
* yields **nothing** here, because `AdminSiteSettingsView` is not schema-driven
|
|
14
|
+
* — it is ~160 controls bound to individual `useState` calls, and it is on
|
|
15
|
+
* W8's tabbing list precisely because of that. Waiting for the derivation
|
|
16
|
+
* would mean the headline request — find the maintenance toggle — ships last.
|
|
17
|
+
*
|
|
18
|
+
* So this is a hand-written map, and it is the ONE in this plan that is
|
|
19
|
+
* defensible: there is no existing array it duplicates. `audit-nav-metadata`'s
|
|
20
|
+
* sibling check keeps its `tab` values inside `SiteSettingsTabId`, so the half
|
|
21
|
+
* that CAN drift is the half that is guarded.
|
|
22
|
+
*
|
|
23
|
+
* ## An anchor is CLAIMED, not assumed
|
|
24
|
+
*
|
|
25
|
+
* A deep link to `#setting-maintenance-mode` that matches no `id=` in the DOM
|
|
26
|
+
* scrolls nowhere and reads as the search having missed — so an entry opts in
|
|
27
|
+
* with `anchored: true`, and `audit-action-index` checks that the id exists.
|
|
28
|
+
* Everything else deep-links to its TAB, which is a smaller promise ("this
|
|
29
|
+
* lives on the Fees tab") and one the page can keep.
|
|
30
|
+
*
|
|
31
|
+
* The first run of that audit reported thirteen dead anchors, because this
|
|
32
|
+
* file declared twenty-two entries while the view carried nine ids. That is
|
|
33
|
+
* the rule doing its job on the commit that introduced it.
|
|
34
|
+
*
|
|
35
|
+
* EXPORTS: SITE_SETTINGS_ENTRIES, deriveSettingsEntries
|
|
36
|
+
*
|
|
37
|
+
* @tag domain:search
|
|
38
|
+
* @tag layer:shared
|
|
39
|
+
* @tag pattern:registry
|
|
40
|
+
* @tag access:isomorphic
|
|
41
|
+
* @tag consumers:action index
|
|
42
|
+
* @tag sideEffects:none
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* The controls worth finding.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately not all ~160: a search result list is only useful while it is
|
|
48
|
+
* short, and "Hero title" is not something anyone hunts for — they open the
|
|
49
|
+
* About tab and see it. What is here is what someone arrives ALREADY looking
|
|
50
|
+
* for, usually in a hurry, and usually not knowing which tab it is filed under.
|
|
51
|
+
*/
|
|
52
|
+
export const SITE_SETTINGS_ENTRIES = [
|
|
53
|
+
{
|
|
54
|
+
slug: "maintenance-mode",
|
|
55
|
+
anchored: true,
|
|
56
|
+
label: "Maintenance mode",
|
|
57
|
+
description: "Take the site offline for visitors and show a message instead.",
|
|
58
|
+
keywords: ["offline", "down for maintenance", "close the site", "under construction"],
|
|
59
|
+
tab: "branding",
|
|
60
|
+
kind: "toggle",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
slug: "maintenance-message",
|
|
64
|
+
label: "Maintenance message",
|
|
65
|
+
description: "What visitors see while the site is in maintenance mode.",
|
|
66
|
+
keywords: ["offline message", "downtime notice"],
|
|
67
|
+
tab: "branding",
|
|
68
|
+
kind: "setting",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
slug: "announcement-bar",
|
|
72
|
+
anchored: true,
|
|
73
|
+
label: "Announcement bar",
|
|
74
|
+
description: "Show a message across the top of every page.",
|
|
75
|
+
keywords: ["banner", "notice", "top bar", "sale banner"],
|
|
76
|
+
tab: "announcement",
|
|
77
|
+
kind: "toggle",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
slug: "robots-noindex",
|
|
81
|
+
anchored: true,
|
|
82
|
+
label: "Hide from search engines",
|
|
83
|
+
description: "Stop Google indexing the site. Use carefully — recovery is slow.",
|
|
84
|
+
keywords: ["noindex", "google", "seo", "deindex", "hide from google"],
|
|
85
|
+
tab: "seo",
|
|
86
|
+
kind: "toggle",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
slug: "razorpay-enabled",
|
|
90
|
+
anchored: true,
|
|
91
|
+
label: "Online payments (Razorpay)",
|
|
92
|
+
description: "Accept cards and UPI through Razorpay. Off by default; manual payment is the default.",
|
|
93
|
+
keywords: ["card payments", "razorpay", "online payment", "gateway", "upi"],
|
|
94
|
+
tab: "fees",
|
|
95
|
+
kind: "toggle",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
slug: "manual-payment-enabled",
|
|
99
|
+
anchored: true,
|
|
100
|
+
label: "Manual UPI / bank transfer",
|
|
101
|
+
description: "Let buyers pay by transfer and upload proof for review.",
|
|
102
|
+
keywords: ["upi", "bank transfer", "manual payment", "proof"],
|
|
103
|
+
tab: "fees",
|
|
104
|
+
kind: "toggle",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
slug: "cod-enabled",
|
|
108
|
+
anchored: true,
|
|
109
|
+
label: "Cash on delivery",
|
|
110
|
+
description: "Let buyers pay when the parcel arrives.",
|
|
111
|
+
keywords: ["cod", "cash on delivery", "pay on delivery"],
|
|
112
|
+
tab: "fees",
|
|
113
|
+
kind: "toggle",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
slug: "platform-commission",
|
|
117
|
+
label: "Platform commission",
|
|
118
|
+
description: "What the platform takes from each sale, and its cap.",
|
|
119
|
+
keywords: ["commission", "our cut", "platform fee", "take rate"],
|
|
120
|
+
tab: "fees",
|
|
121
|
+
kind: "setting",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
slug: "google-analytics",
|
|
125
|
+
label: "Google Analytics",
|
|
126
|
+
description: "The GA4 measurement id used for site traffic.",
|
|
127
|
+
keywords: ["ga4", "analytics id", "tracking", "measurement id", "google"],
|
|
128
|
+
tab: "integrations",
|
|
129
|
+
kind: "setting",
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
slug: "facebook-pixel",
|
|
133
|
+
label: "Facebook Pixel",
|
|
134
|
+
description: "The Meta Pixel id used for ad attribution.",
|
|
135
|
+
keywords: ["meta pixel", "facebook", "ads tracking", "conversion"],
|
|
136
|
+
tab: "integrations",
|
|
137
|
+
kind: "setting",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
slug: "free-shipping-threshold",
|
|
141
|
+
label: "Free shipping threshold",
|
|
142
|
+
description: "The order value above which delivery is free.",
|
|
143
|
+
keywords: ["free delivery", "shipping over", "minimum for free shipping"],
|
|
144
|
+
tab: "shipping",
|
|
145
|
+
kind: "setting",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
slug: "bid-increment",
|
|
149
|
+
label: "Minimum bid increment",
|
|
150
|
+
description: "The smallest amount a new bid must beat the current one by.",
|
|
151
|
+
keywords: ["bidding step", "increment", "auction minimum"],
|
|
152
|
+
tab: "auction",
|
|
153
|
+
kind: "setting",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
slug: "anti-sniping",
|
|
157
|
+
label: "Anti-sniping extension",
|
|
158
|
+
description: "Extend an auction when a bid lands in its final seconds.",
|
|
159
|
+
keywords: ["sniping", "last second bid", "extend auction", "going going gone"],
|
|
160
|
+
tab: "auction",
|
|
161
|
+
kind: "setting",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
slug: "email-notifications",
|
|
165
|
+
anchored: true,
|
|
166
|
+
label: "Email notifications",
|
|
167
|
+
description: "Whether the platform sends email at all.",
|
|
168
|
+
keywords: ["email", "resend", "transactional email", "stop emails"],
|
|
169
|
+
tab: "notifications",
|
|
170
|
+
kind: "toggle",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
slug: "whatsapp-notifications",
|
|
174
|
+
anchored: true,
|
|
175
|
+
label: "WhatsApp notifications",
|
|
176
|
+
description: "Send order updates over WhatsApp.",
|
|
177
|
+
keywords: ["whatsapp", "order updates", "meta"],
|
|
178
|
+
tab: "notifications",
|
|
179
|
+
kind: "toggle",
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
slug: "daily-digest",
|
|
183
|
+
anchored: true,
|
|
184
|
+
label: "Daily status digest",
|
|
185
|
+
description: "A once-a-day operations summary to the admin inbox.",
|
|
186
|
+
keywords: ["digest", "daily email", "summary", "ops report"],
|
|
187
|
+
tab: "notifications",
|
|
188
|
+
kind: "toggle",
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
slug: "emi-threshold",
|
|
192
|
+
label: "EMI eligibility threshold",
|
|
193
|
+
description: "The order value above which instalments are offered.",
|
|
194
|
+
keywords: ["instalments", "installments", "emi minimum", "pay monthly"],
|
|
195
|
+
tab: "emi",
|
|
196
|
+
kind: "setting",
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
slug: "gst-rates",
|
|
200
|
+
label: "GST rates and HSN defaults",
|
|
201
|
+
description: "The tax rates applied to listings, and the fallback HSN code.",
|
|
202
|
+
keywords: ["tax", "gst", "hsn", "vat"],
|
|
203
|
+
tab: "gst",
|
|
204
|
+
kind: "setting",
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
slug: "gstin",
|
|
208
|
+
label: "GSTIN and registered business",
|
|
209
|
+
description: "The registration number and legal address printed on invoices.",
|
|
210
|
+
keywords: ["gstin", "tax number", "registered address", "legal name"],
|
|
211
|
+
tab: "legal",
|
|
212
|
+
kind: "setting",
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
slug: "enabled-listing-types",
|
|
216
|
+
label: "Enabled listing types",
|
|
217
|
+
description: "Which kinds of listing sellers may create.",
|
|
218
|
+
keywords: ["auctions off", "disable pre-orders", "listing types", "turn off"],
|
|
219
|
+
tab: "listings",
|
|
220
|
+
kind: "toggle",
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
slug: "watermark",
|
|
224
|
+
label: "Photo watermark",
|
|
225
|
+
description: "The mark stamped onto uploaded product photos.",
|
|
226
|
+
keywords: ["watermark", "logo on photos", "protect images"],
|
|
227
|
+
tab: "watermark",
|
|
228
|
+
kind: "setting",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
slug: "upload-limits",
|
|
232
|
+
label: "Upload and listing limits",
|
|
233
|
+
description: "Maximum file size, image count and per-account listing caps.",
|
|
234
|
+
keywords: ["max upload", "file size", "how many listings", "quota", "limit"],
|
|
235
|
+
tab: "limits",
|
|
236
|
+
kind: "setting",
|
|
237
|
+
},
|
|
238
|
+
];
|
|
239
|
+
/**
|
|
240
|
+
* The settings entries, as index entries.
|
|
241
|
+
*
|
|
242
|
+
* `deepLink` carries the whole query-and-hash — `?tab=fees#setting-cod-enabled`
|
|
243
|
+
* — rather than just the tab, because landing on the right tab and leaving the
|
|
244
|
+
* reader to find the control among forty others is most of the way to not
|
|
245
|
+
* having searched at all.
|
|
246
|
+
*/
|
|
247
|
+
export function deriveSettingsEntries(settingsHref, requiredPermission = "settings:read") {
|
|
248
|
+
return SITE_SETTINGS_ENTRIES.map((entry) => ({
|
|
249
|
+
id: `admin:${entry.kind}:${entry.slug}`,
|
|
250
|
+
kind: entry.kind,
|
|
251
|
+
portal: "admin",
|
|
252
|
+
label: entry.label,
|
|
253
|
+
description: entry.description,
|
|
254
|
+
keywords: entry.keywords,
|
|
255
|
+
href: settingsHref,
|
|
256
|
+
deepLink: entry.anchored
|
|
257
|
+
? `?tab=${entry.tab}#setting-${entry.slug}`
|
|
258
|
+
: `?tab=${entry.tab}`,
|
|
259
|
+
sectionPath: "Admin › System › Site Settings",
|
|
260
|
+
requiredPermission,
|
|
261
|
+
/*
|
|
262
|
+
* Above nav entries. Someone searching "maintenance" wants the toggle, not
|
|
263
|
+
* the settings page it lives on — and the page will also match, on its own
|
|
264
|
+
* description, so without this the container outranks the thing.
|
|
265
|
+
*/
|
|
266
|
+
weight: 20,
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { NavPortal } from "../../../_internal/shared/features/layout/types";
|
|
2
|
+
/**
|
|
3
|
+
* What kind of thing an entry is.
|
|
4
|
+
*
|
|
5
|
+
* The distinction that matters is `nav`/`page` (somewhere you go) versus
|
|
6
|
+
* `setting`/`toggle`/`action` (something you change or do) — a search for
|
|
7
|
+
* "maintenance mode" wants the toggle, not the settings page it lives on, and
|
|
8
|
+
* only the kind tells them apart.
|
|
9
|
+
*/
|
|
10
|
+
export type ActionIndexKind = "nav" | "page" | "section" | "setting" | "toggle" | "action";
|
|
11
|
+
export interface ActionIndexEntry {
|
|
12
|
+
/** `{portal}:{kind}:{slug}` — also the overlay's React key. */
|
|
13
|
+
id: string;
|
|
14
|
+
kind: ActionIndexKind;
|
|
15
|
+
/** `public` for anything outside the three dashboards. */
|
|
16
|
+
portal: NavPortal | "public";
|
|
17
|
+
label: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
keywords?: string[];
|
|
20
|
+
href: string;
|
|
21
|
+
/**
|
|
22
|
+
* The `?tab=`/`#anchor` that reaches the exact control, when the href alone
|
|
23
|
+
* only reaches the page it lives on. This is what makes a search for
|
|
24
|
+
* "maintenance" land on the toggle rather than on Site Settings.
|
|
25
|
+
*/
|
|
26
|
+
deepLink?: string;
|
|
27
|
+
/** Breadcrumb for the result row — "Admin › System › Site Settings". */
|
|
28
|
+
sectionPath?: string;
|
|
29
|
+
requiredRole?: string;
|
|
30
|
+
requiredPermission?: string;
|
|
31
|
+
requiresTester?: boolean;
|
|
32
|
+
/** A lucide icon NAME. See the header for why this is not a component. */
|
|
33
|
+
iconName?: string;
|
|
34
|
+
/** Higher sorts first among equal-scoring matches. Default 0. */
|
|
35
|
+
weight?: number;
|
|
36
|
+
}
|
|
37
|
+
/** What an admin may change about a built-in entry. */
|
|
38
|
+
export interface ActionIndexOverride {
|
|
39
|
+
enabled?: boolean;
|
|
40
|
+
label?: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
keywords?: string[];
|
|
43
|
+
weight?: number;
|
|
44
|
+
group?: string;
|
|
45
|
+
order?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The stored control document, `actionIndex/global`.
|
|
49
|
+
*
|
|
50
|
+
* Deliberately NOT folded into `siteSettings`: that document is read publicly
|
|
51
|
+
* and edge-cached, and this one is projected by role.
|
|
52
|
+
*/
|
|
53
|
+
export interface ActionIndexControl {
|
|
54
|
+
entries: Record<string, ActionIndexOverride>;
|
|
55
|
+
/** Admin-authored entries, appended after the static base. */
|
|
56
|
+
custom: ActionIndexEntry[];
|
|
57
|
+
}
|
|
58
|
+
export declare const ACTION_INDEX_COLLECTION: "actionIndex";
|
|
59
|
+
export declare const ACTION_INDEX_DOC_ID: "global";
|
|
60
|
+
/**
|
|
61
|
+
* Apply an admin's overrides to the static base.
|
|
62
|
+
*
|
|
63
|
+
* Order is load-bearing: override, then DROP disabled, then append `custom`.
|
|
64
|
+
* Dropping last would let an admin disable an entry and have their own
|
|
65
|
+
* replacement for it disappear too, since a custom entry may legitimately
|
|
66
|
+
* reuse a built-in id to supersede it.
|
|
67
|
+
*/
|
|
68
|
+
export declare function mergeActionIndex(base: readonly ActionIndexEntry[], control: ActionIndexControl | undefined): ActionIndexEntry[];
|
|
69
|
+
/**
|
|
70
|
+
* Drop every entry the viewer may not reach.
|
|
71
|
+
*
|
|
72
|
+
* 🛑 Filtered SERVER-side, never in the browser. An entry the client is not
|
|
73
|
+
* allowed to act on is an entry it must not receive: the label alone is a site
|
|
74
|
+
* map of the admin panel, which is D8's whole point.
|
|
75
|
+
*/
|
|
76
|
+
export declare function projectActionIndexForViewer(entries: readonly ActionIndexEntry[], viewer: {
|
|
77
|
+
role?: string;
|
|
78
|
+
permissions?: readonly string[];
|
|
79
|
+
isTester?: boolean;
|
|
80
|
+
isAdmin?: boolean;
|
|
81
|
+
}): ActionIndexEntry[];
|