@open-mercato/core 0.9.1-develop.7473.1.de5b22888f → 0.9.1-develop.7475.1.28ca93ed97
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/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/catalog_price_history_entry/index.js +53 -0
- package/dist/generated/entities/catalog_price_history_entry/index.js.map +7 -0
- package/dist/generated/entities/customer_group_terms/index.js +2 -0
- package/dist/generated/entities/customer_group_terms/index.js.map +2 -2
- package/dist/generated/entities/ecommerce_store/index.js +33 -0
- package/dist/generated/entities/ecommerce_store/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js +29 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js +23 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +8 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +72 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/customerGroupsFixtures.js.map +2 -2
- package/dist/modules/catalog/acl.js +8 -1
- package/dist/modules/catalog/acl.js.map +2 -2
- package/dist/modules/catalog/api/config/omnibus/route.js +184 -0
- package/dist/modules/catalog/api/config/omnibus/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/history/route.js +131 -0
- package/dist/modules/catalog/api/prices/history/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js +184 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js.map +7 -0
- package/dist/modules/catalog/api/products/route.js +54 -245
- package/dist/modules/catalog/api/products/route.js.map +3 -3
- package/dist/modules/catalog/api/tags/route.js +6 -0
- package/dist/modules/catalog/api/tags/route.js.map +2 -2
- package/dist/modules/catalog/backend/config/catalog/page.js +3 -1
- package/dist/modules/catalog/backend/config/catalog/page.js.map +2 -2
- package/dist/modules/catalog/cli.js +80 -2
- package/dist/modules/catalog/cli.js.map +2 -2
- package/dist/modules/catalog/commands/categories.js +51 -2
- package/dist/modules/catalog/commands/categories.js.map +2 -2
- package/dist/modules/catalog/commands/prices.js +43 -1
- package/dist/modules/catalog/commands/prices.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +71 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +7 -0
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/OmnibusSettings.js +703 -0
- package/dist/modules/catalog/components/OmnibusSettings.js.map +7 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js +152 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js.map +7 -0
- package/dist/modules/catalog/components/lookupSources.js +31 -0
- package/dist/modules/catalog/components/lookupSources.js.map +7 -0
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js +8 -2
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +11 -1
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/catalog/data/entities.js +122 -1
- package/dist/modules/catalog/data/entities.js.map +2 -2
- package/dist/modules/catalog/data/validators.js +78 -0
- package/dist/modules/catalog/data/validators.js.map +2 -2
- package/dist/modules/catalog/di.js +18 -0
- package/dist/modules/catalog/di.js.map +2 -2
- package/dist/modules/catalog/lib/omnibus.js +285 -0
- package/dist/modules/catalog/lib/omnibus.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js +146 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusCache.js +89 -0
- package/dist/modules/catalog/lib/omnibusCache.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusConfig.js +64 -0
- package/dist/modules/catalog/lib/omnibusConfig.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js +191 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js +73 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js +94 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusTypes.js +115 -0
- package/dist/modules/catalog/lib/omnibusTypes.js.map +7 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js +55 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js.map +7 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js +103 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js.map +7 -0
- package/dist/modules/catalog/lib/pricing.js +26 -2
- package/dist/modules/catalog/lib/pricing.js.map +2 -2
- package/dist/modules/catalog/lib/productFilters.js +273 -0
- package/dist/modules/catalog/lib/productFilters.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeKeys.js +105 -0
- package/dist/modules/catalog/lib/productScopeKeys.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeReindex.js +73 -0
- package/dist/modules/catalog/lib/productScopeReindex.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js.map +7 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js +480 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js.map +7 -0
- package/dist/modules/catalog/setup.js +3 -1
- package/dist/modules/catalog/setup.js.map +2 -2
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js +16 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js.map +7 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js +17 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js.map +7 -0
- package/dist/modules/catalog/translations.js +10 -0
- package/dist/modules/catalog/translations.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +28 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js +5 -0
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js.map +2 -2
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js +111 -3
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js.map +2 -2
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js +43 -0
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js.map +7 -0
- package/dist/modules/customer_groups/data/entities.js +3 -0
- package/dist/modules/customer_groups/data/entities.js.map +2 -2
- package/dist/modules/customer_groups/data/validators.js +9 -0
- package/dist/modules/customer_groups/data/validators.js.map +2 -2
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js +17 -0
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js.map +7 -0
- package/dist/modules/customer_groups/services/customerGroupsService.js +62 -15
- package/dist/modules/customer_groups/services/customerGroupsService.js.map +2 -2
- package/dist/modules/ecommerce/acl.js +13 -0
- package/dist/modules/ecommerce/acl.js.map +7 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js +72 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/openapi.js +27 -0
- package/dist/modules/ecommerce/api/openapi.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js +109 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js +265 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js +67 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js +296 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js +73 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js +50 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js +163 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js +177 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js +78 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js +25 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js +58 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js +183 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js +92 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/crud.js +401 -0
- package/dist/modules/ecommerce/api/stores/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/route.js +64 -0
- package/dist/modules/ecommerce/api/stores/route.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/commands/stores.js +110 -0
- package/dist/modules/ecommerce/commands/stores.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js +90 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js +33 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js +11 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js.map +7 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js +24 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js +190 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js +67 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js +69 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js +218 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js +270 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js +313 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js +164 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js +162 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js +357 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js +155 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js +167 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreListPage.js +290 -0
- package/dist/modules/ecommerce/components/StoreListPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js +132 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js +20 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js.map +7 -0
- package/dist/modules/ecommerce/components/channelLookups.js +28 -0
- package/dist/modules/ecommerce/components/channelLookups.js.map +7 -0
- package/dist/modules/ecommerce/components/storeAdmin.js +41 -0
- package/dist/modules/ecommerce/components/storeAdmin.js.map +7 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js +197 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js.map +7 -0
- package/dist/modules/ecommerce/components/storeChannels.js +140 -0
- package/dist/modules/ecommerce/components/storeChannels.js.map +7 -0
- package/dist/modules/ecommerce/components/storeDomains.js +167 -0
- package/dist/modules/ecommerce/components/storeDomains.js.map +7 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js +62 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js.map +7 -0
- package/dist/modules/ecommerce/components/storeGeneral.js +95 -0
- package/dist/modules/ecommerce/components/storeGeneral.js.map +7 -0
- package/dist/modules/ecommerce/components/storeSeo.js +69 -0
- package/dist/modules/ecommerce/components/storeSeo.js.map +7 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js +45 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js +28 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js.map +7 -0
- package/dist/modules/ecommerce/data/enrichers.js +157 -0
- package/dist/modules/ecommerce/data/enrichers.js.map +7 -0
- package/dist/modules/ecommerce/data/entities.js +197 -0
- package/dist/modules/ecommerce/data/entities.js.map +7 -0
- package/dist/modules/ecommerce/data/validators.js +406 -0
- package/dist/modules/ecommerce/data/validators.js.map +7 -0
- package/dist/modules/ecommerce/di.js +11 -0
- package/dist/modules/ecommerce/di.js.map +7 -0
- package/dist/modules/ecommerce/events.js +27 -0
- package/dist/modules/ecommerce/events.js.map +7 -0
- package/dist/modules/ecommerce/index.js +16 -0
- package/dist/modules/ecommerce/index.js.map +7 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js +112 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js +184 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js.map +7 -0
- package/dist/modules/ecommerce/lib/buyerContext.js +284 -0
- package/dist/modules/ecommerce/lib/buyerContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js +186 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js +236 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js.map +7 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js +29 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudEvents.js +94 -0
- package/dist/modules/ecommerce/lib/crudEvents.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudSupport.js +64 -0
- package/dist/modules/ecommerce/lib/crudSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js +99 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js +39 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js.map +7 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js +57 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js.map +7 -0
- package/dist/modules/ecommerce/lib/references.js +70 -0
- package/dist/modules/ecommerce/lib/references.js.map +7 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js +99 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js +109 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBranding.js +40 -0
- package/dist/modules/ecommerce/lib/storeBranding.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js +76 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContext.js +393 -0
- package/dist/modules/ecommerce/lib/storeContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContextService.js +43 -0
- package/dist/modules/ecommerce/lib/storeContextService.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeLocale.js +60 -0
- package/dist/modules/ecommerce/lib/storeLocale.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js +41 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js +248 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js +241 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js +71 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js +447 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js +441 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js +15 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js +393 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js +90 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js +107 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js +670 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js +156 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js +99 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js +303 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js +35 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js +33 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/types.js +1 -0
- package/dist/modules/ecommerce/lib/types.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js +32 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js +17 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/notifications.client.js +47 -0
- package/dist/modules/ecommerce/notifications.client.js.map +7 -0
- package/dist/modules/ecommerce/notifications.js +48 -0
- package/dist/modules/ecommerce/notifications.js.map +7 -0
- package/dist/modules/ecommerce/search.js +83 -0
- package/dist/modules/ecommerce/search.js.map +7 -0
- package/dist/modules/ecommerce/setup.js +17 -0
- package/dist/modules/ecommerce/setup.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js +16 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js.map +7 -0
- package/dist/modules/query_index/lib/batch.js +23 -9
- package/dist/modules/query_index/lib/batch.js.map +2 -2
- package/dist/modules/query_index/lib/doc-enrichers.js +212 -0
- package/dist/modules/query_index/lib/doc-enrichers.js.map +7 -0
- package/dist/modules/query_index/lib/document.js +2 -0
- package/dist/modules/query_index/lib/document.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +68 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +7 -0
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +2 -0
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js +17 -0
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js.map +7 -0
- package/dist/modules/translations/components/TranslationManager.js +3 -3
- package/dist/modules/translations/components/TranslationManager.js.map +2 -2
- package/dist/modules/translations/data/validators.js +1 -1
- package/dist/modules/translations/data/validators.js.map +1 -1
- package/dist/modules/translations/lib/batch.js +21 -1
- package/dist/modules/translations/lib/batch.js.map +2 -2
- package/dist/modules/translations/lib/helpers.js +3 -0
- package/dist/modules/translations/lib/helpers.js.map +2 -2
- package/dist/modules/translations/lib/resolve-field-list.js +14 -2
- package/dist/modules/translations/lib/resolve-field-list.js.map +2 -2
- package/generated/entities/catalog_price_history_entry/index.ts +25 -0
- package/generated/entities/customer_group_terms/index.ts +1 -0
- package/generated/entities/ecommerce_store/index.ts +15 -0
- package/generated/entities/ecommerce_store_channel_binding/index.ts +13 -0
- package/generated/entities/ecommerce_store_domain_binding/index.ts +10 -0
- package/generated/entities.ids.generated.ts +8 -1
- package/generated/entity-fields-registry.ts +72 -0
- package/package.json +7 -7
- package/src/helpers/integration/customerGroupsFixtures.ts +2 -0
- package/src/modules/auth/i18n/de.json +8 -0
- package/src/modules/auth/i18n/en.json +8 -0
- package/src/modules/auth/i18n/es.json +8 -0
- package/src/modules/auth/i18n/ko.json +8 -0
- package/src/modules/auth/i18n/pl.json +8 -0
- package/src/modules/catalog/AGENTS.md +5 -2
- package/src/modules/catalog/acl.ts +7 -0
- package/src/modules/catalog/api/config/omnibus/route.ts +204 -0
- package/src/modules/catalog/api/prices/history/route.ts +139 -0
- package/src/modules/catalog/api/prices/omnibus-preview/route.ts +202 -0
- package/src/modules/catalog/api/products/route.ts +53 -308
- package/src/modules/catalog/api/tags/route.ts +6 -0
- package/src/modules/catalog/backend/config/catalog/page.tsx +2 -0
- package/src/modules/catalog/cli.ts +84 -1
- package/src/modules/catalog/commands/categories.ts +54 -2
- package/src/modules/catalog/commands/prices.ts +43 -1
- package/src/modules/catalog/commands/products.ts +84 -1
- package/src/modules/catalog/commands/variants.ts +7 -0
- package/src/modules/catalog/components/OmnibusSettings.tsx +832 -0
- package/src/modules/catalog/components/PriceEditorOmnibusRow.tsx +219 -0
- package/src/modules/catalog/components/lookupSources.ts +29 -0
- package/src/modules/catalog/components/prices/PriceScopeSelectors.tsx +9 -0
- package/src/modules/catalog/components/products/VariantBuilder.tsx +9 -0
- package/src/modules/catalog/data/entities.ts +123 -1
- package/src/modules/catalog/data/validators.ts +118 -0
- package/src/modules/catalog/di.ts +23 -0
- package/src/modules/catalog/i18n/de.json +77 -0
- package/src/modules/catalog/i18n/en.json +77 -0
- package/src/modules/catalog/i18n/es.json +77 -0
- package/src/modules/catalog/i18n/ko.json +77 -0
- package/src/modules/catalog/i18n/pl.json +77 -0
- package/src/modules/catalog/lib/omnibus.ts +406 -0
- package/src/modules/catalog/lib/omnibusBackfill.ts +198 -0
- package/src/modules/catalog/lib/omnibusCache.ts +111 -0
- package/src/modules/catalog/lib/omnibusConfig.ts +73 -0
- package/src/modules/catalog/lib/omnibusHistoryQueries.ts +248 -0
- package/src/modules/catalog/lib/omnibusPresentedEntry.ts +76 -0
- package/src/modules/catalog/lib/omnibusProductListEnrichment.ts +125 -0
- package/src/modules/catalog/lib/omnibusTypes.ts +202 -0
- package/src/modules/catalog/lib/optionSchemaTranslations.ts +55 -0
- package/src/modules/catalog/lib/priceHistoryQuery.ts +155 -0
- package/src/modules/catalog/lib/pricing.ts +42 -4
- package/src/modules/catalog/lib/productFilters.ts +349 -0
- package/src/modules/catalog/lib/productScopeKeys.ts +162 -0
- package/src/modules/catalog/lib/productScopeReindex.ts +139 -0
- package/src/modules/catalog/migrations/.snapshot-open-mercato.json +572 -0
- package/src/modules/catalog/migrations/Migration20261005105352_catalog.ts +39 -0
- package/src/modules/catalog/migrations/Migration20261005150824_catalog.ts +39 -0
- package/src/modules/catalog/services/catalogOmnibusService.ts +642 -0
- package/src/modules/catalog/setup.ts +2 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-deleted.ts +18 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-updated.ts +19 -0
- package/src/modules/catalog/translations.ts +12 -0
- package/src/modules/configs/i18n/de.json +5 -1
- package/src/modules/configs/i18n/en.json +5 -1
- package/src/modules/configs/i18n/es.json +5 -1
- package/src/modules/configs/i18n/ko.json +5 -1
- package/src/modules/configs/i18n/pl.json +5 -1
- package/src/modules/configs/lib/upgrade-actions.ts +35 -0
- package/src/modules/customer_groups/api/customer-groups/[id]/terms/route.ts +7 -0
- package/src/modules/customer_groups/components/CustomerGroupTermsSection.tsx +124 -2
- package/src/modules/customer_groups/components/customerGroupAssortmentScope.ts +46 -0
- package/src/modules/customer_groups/data/entities.ts +4 -0
- package/src/modules/customer_groups/data/validators.ts +14 -0
- package/src/modules/customer_groups/i18n/de.json +12 -0
- package/src/modules/customer_groups/i18n/en.json +12 -0
- package/src/modules/customer_groups/i18n/es.json +12 -0
- package/src/modules/customer_groups/i18n/ko.json +12 -0
- package/src/modules/customer_groups/i18n/pl.json +12 -0
- package/src/modules/customer_groups/migrations/.snapshot-open-mercato.json +17 -0
- package/src/modules/customer_groups/migrations/Migration20261005110250_customer_groups.ts +15 -0
- package/src/modules/customer_groups/services/customerGroupsService.ts +74 -23
- package/src/modules/ecommerce/acl.ts +9 -0
- package/src/modules/ecommerce/api/domain-mappings/route.ts +76 -0
- package/src/modules/ecommerce/api/openapi.ts +28 -0
- package/src/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.ts +141 -0
- package/src/modules/ecommerce/api/store-channel-bindings/crud.ts +283 -0
- package/src/modules/ecommerce/api/store-channel-bindings/route.ts +67 -0
- package/src/modules/ecommerce/api/store-domain-bindings/crud.ts +324 -0
- package/src/modules/ecommerce/api/store-domain-bindings/route.ts +73 -0
- package/src/modules/ecommerce/api/storefront/categories/[slug]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/categories/openapiSchemas.ts +63 -0
- package/src/modules/ecommerce/api/storefront/categories/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/context/route.ts +203 -0
- package/src/modules/ecommerce/api/storefront/products/[idOrHandle]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/products/openapiSchemas.ts +193 -0
- package/src/modules/ecommerce/api/storefront/products/route.ts +81 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.ts +25 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/storefrontRouteSupport.ts +68 -0
- package/src/modules/ecommerce/api/stores/[id]/branding/route.ts +205 -0
- package/src/modules/ecommerce/api/stores/[id]/preview-branding/route.ts +99 -0
- package/src/modules/ecommerce/api/stores/crud.ts +457 -0
- package/src/modules/ecommerce/api/stores/route.ts +66 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.tsx +5 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.tsx +5 -0
- package/src/modules/ecommerce/commands/stores.ts +154 -0
- package/src/modules/ecommerce/components/ChannelAssortmentCount.tsx +138 -0
- package/src/modules/ecommerce/components/ChannelBindingFormSections.tsx +40 -0
- package/src/modules/ecommerce/components/ChannelLookupPicker.tsx +5 -0
- package/src/modules/ecommerce/components/DomainStatusWarning.tsx +32 -0
- package/src/modules/ecommerce/components/StoreAvailabilityDefaultsSection.tsx +219 -0
- package/src/modules/ecommerce/components/StoreBrandingControls.tsx +73 -0
- package/src/modules/ecommerce/components/StoreBrandingPreview.tsx +77 -0
- package/src/modules/ecommerce/components/StoreBrandingTab.tsx +242 -0
- package/src/modules/ecommerce/components/StoreChannelBindingDialog.tsx +306 -0
- package/src/modules/ecommerce/components/StoreChannelsTab.tsx +375 -0
- package/src/modules/ecommerce/components/StoreCreateDialog.tsx +204 -0
- package/src/modules/ecommerce/components/StoreDomainBindingDialog.tsx +198 -0
- package/src/modules/ecommerce/components/StoreDomainsTab.tsx +426 -0
- package/src/modules/ecommerce/components/StoreEditPage.tsx +193 -0
- package/src/modules/ecommerce/components/StoreGeneralTab.tsx +189 -0
- package/src/modules/ecommerce/components/StoreListPage.tsx +326 -0
- package/src/modules/ecommerce/components/StoreSeoTab.tsx +152 -0
- package/src/modules/ecommerce/components/StoreStatusBadge.tsx +22 -0
- package/src/modules/ecommerce/components/channelLookups.ts +24 -0
- package/src/modules/ecommerce/components/storeAdmin.ts +56 -0
- package/src/modules/ecommerce/components/storeBrandingForm.ts +230 -0
- package/src/modules/ecommerce/components/storeChannels.ts +210 -0
- package/src/modules/ecommerce/components/storeDomains.ts +221 -0
- package/src/modules/ecommerce/components/storeEditTabs.tsx +76 -0
- package/src/modules/ecommerce/components/storeGeneral.ts +155 -0
- package/src/modules/ecommerce/components/storeSeo.ts +78 -0
- package/src/modules/ecommerce/components/useChannelAssortmentCount.ts +67 -0
- package/src/modules/ecommerce/components/useStoreAccess.ts +36 -0
- package/src/modules/ecommerce/data/enrichers.ts +213 -0
- package/src/modules/ecommerce/data/entities.ts +168 -0
- package/src/modules/ecommerce/data/validators.ts +587 -0
- package/src/modules/ecommerce/di.ts +9 -0
- package/src/modules/ecommerce/events.ts +27 -0
- package/src/modules/ecommerce/i18n/de.json +341 -0
- package/src/modules/ecommerce/i18n/en.json +341 -0
- package/src/modules/ecommerce/i18n/es.json +341 -0
- package/src/modules/ecommerce/i18n/ko.json +341 -0
- package/src/modules/ecommerce/i18n/pl.json +341 -0
- package/src/modules/ecommerce/index.ts +14 -0
- package/src/modules/ecommerce/lib/assortmentCount.ts +175 -0
- package/src/modules/ecommerce/lib/brandingStyles.ts +215 -0
- package/src/modules/ecommerce/lib/buyerContext.ts +401 -0
- package/src/modules/ecommerce/lib/cacheInvalidation.ts +302 -0
- package/src/modules/ecommerce/lib/cacheKeys.ts +340 -0
- package/src/modules/ecommerce/lib/createConflictRecheck.ts +31 -0
- package/src/modules/ecommerce/lib/crudEvents.ts +128 -0
- package/src/modules/ecommerce/lib/crudSupport.ts +85 -0
- package/src/modules/ecommerce/lib/domainBindingRebind.ts +138 -0
- package/src/modules/ecommerce/lib/domainMappingSummaries.ts +71 -0
- package/src/modules/ecommerce/lib/exclusiveFlag.ts +90 -0
- package/src/modules/ecommerce/lib/references.ts +93 -0
- package/src/modules/ecommerce/lib/seedDraftStore.ts +125 -0
- package/src/modules/ecommerce/lib/storeBindingCascade.ts +138 -0
- package/src/modules/ecommerce/lib/storeBranding.ts +48 -0
- package/src/modules/ecommerce/lib/storeBrandingRoute.ts +91 -0
- package/src/modules/ecommerce/lib/storeContext.ts +669 -0
- package/src/modules/ecommerce/lib/storeContextService.ts +71 -0
- package/src/modules/ecommerce/lib/storeLocale.ts +88 -0
- package/src/modules/ecommerce/lib/storeNotifications.ts +55 -0
- package/src/modules/ecommerce/lib/storefrontCatalogSupport.ts +427 -0
- package/src/modules/ecommerce/lib/storefrontCategories.ts +419 -0
- package/src/modules/ecommerce/lib/storefrontCategoryCache.ts +113 -0
- package/src/modules/ecommerce/lib/storefrontDetail.ts +654 -0
- package/src/modules/ecommerce/lib/storefrontFacets.ts +697 -0
- package/src/modules/ecommerce/lib/storefrontOptionFilter.ts +44 -0
- package/src/modules/ecommerce/lib/storefrontPricing.ts +583 -0
- package/src/modules/ecommerce/lib/storefrontProductCache.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontProductScope.ts +181 -0
- package/src/modules/ecommerce/lib/storefrontProducts.ts +963 -0
- package/src/modules/ecommerce/lib/storefrontQuery.ts +215 -0
- package/src/modules/ecommerce/lib/storefrontRateLimit.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontSearch.ts +454 -0
- package/src/modules/ecommerce/lib/storefrontSearchCache.ts +49 -0
- package/src/modules/ecommerce/lib/subscriberSupport.ts +41 -0
- package/src/modules/ecommerce/lib/types.ts +69 -0
- package/src/modules/ecommerce/migrations/.snapshot-open-mercato.json +829 -0
- package/src/modules/ecommerce/migrations/Migration20261005113233_ecommerce.ts +32 -0
- package/src/modules/ecommerce/migrations/Migration20261006112733_ecommerce.ts +15 -0
- package/src/modules/ecommerce/notifications.client.ts +46 -0
- package/src/modules/ecommerce/notifications.ts +46 -0
- package/src/modules/ecommerce/search.ts +93 -0
- package/src/modules/ecommerce/setup.ts +15 -0
- package/src/modules/ecommerce/subscribers/assortment-empty-notifications.ts +12 -0
- package/src/modules/ecommerce/subscribers/availability-policy-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-category-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-price-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-product-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/domain-binding-rebind.ts +14 -0
- package/src/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-notifications.ts +12 -0
- package/src/modules/query_index/lib/batch.ts +25 -9
- package/src/modules/query_index/lib/doc-enrichers.ts +306 -0
- package/src/modules/query_index/lib/document.ts +2 -0
- package/src/modules/query_index/lib/engine.ts +58 -1
- package/src/modules/query_index/lib/indexer.ts +8 -0
- package/src/modules/query_index/lib/search-tokens.ts +2 -0
- package/src/modules/query_index/migrations/Migration20261005201500_query_index.ts +42 -0
- package/src/modules/translations/components/TranslationManager.tsx +3 -3
- package/src/modules/translations/data/validators.ts +1 -1
- package/src/modules/translations/lib/batch.ts +47 -0
- package/src/modules/translations/lib/helpers.ts +4 -0
- package/src/modules/translations/lib/resolve-field-list.ts +16 -2
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ecommerce.audit.stores.branding.update": "Aktualizacja brandingu sklepu",
|
|
3
|
+
"ecommerce.backend.store.actions.retry": "Spróbuj ponownie",
|
|
4
|
+
"ecommerce.backend.store.availability.allowBackorder": "Zezwalaj na zamówienia w realizacji (backorder)",
|
|
5
|
+
"ecommerce.backend.store.availability.allowBackorderHint": "Kupujący mogą zamawiać produkty niedostępne w magazynie.",
|
|
6
|
+
"ecommerce.backend.store.availability.description": "Domyślne zasady stanów magazynowych dla wszystkich produktów w tym sklepie. Polityka ustawiona dla produktu lub wariantu zastępuje te wartości, więc takie polityki opisują tylko wyjątki.",
|
|
7
|
+
"ecommerce.backend.store.availability.errors.load": "Nie udało się wczytać domyślnej dostępności.",
|
|
8
|
+
"ecommerce.backend.store.availability.errors.save": "Nie udało się zapisać domyślnej dostępności.",
|
|
9
|
+
"ecommerce.backend.store.availability.flash.saved": "Domyślna dostępność zapisana",
|
|
10
|
+
"ecommerce.backend.store.availability.hideWhenOutOfStock": "Ukrywaj produkty niedostępne w magazynie",
|
|
11
|
+
"ecommerce.backend.store.availability.hideWhenOutOfStockHint": "Produkty bez zapasu nie są wyświetlane w tym sklepie.",
|
|
12
|
+
"ecommerce.backend.store.availability.leadTime": "Czas realizacji zamówienia backorder (dni)",
|
|
13
|
+
"ecommerce.backend.store.availability.leadTimeHint": "Ile dni zajmuje wysyłka produktu zamówionego w trybie backorder. Wymagane, gdy backordery są dozwolone.",
|
|
14
|
+
"ecommerce.backend.store.availability.loading": "Wczytywanie domyślnej dostępności...",
|
|
15
|
+
"ecommerce.backend.store.availability.readOnly.noAvailabilityManage": "Możesz przeglądać te ustawienia, ale nie możesz ich zmieniać. Zapis wymaga uprawnienia do zarządzania politykami dostępności.",
|
|
16
|
+
"ecommerce.backend.store.availability.readOnly.noStoreManage": "Możesz przeglądać te ustawienia, ale nie możesz ich zmieniać. Zmiana wymaga uprawnienia do zarządzania sklepami.",
|
|
17
|
+
"ecommerce.backend.store.availability.readOnly.noView": "Nie masz dostępu do polityk dostępności, więc domyślne ustawienia sklepu nie mogą zostać wyświetlone.",
|
|
18
|
+
"ecommerce.backend.store.availability.save": "Zapisz domyślną dostępność",
|
|
19
|
+
"ecommerce.backend.store.availability.title": "Domyślna dostępność",
|
|
20
|
+
"ecommerce.backend.store.backToList": "Wróć do sklepów",
|
|
21
|
+
"ecommerce.backend.store.branding.accentColor": "Kolor akcentu",
|
|
22
|
+
"ecommerce.backend.store.branding.accentForeground": "Tekst na kolorze akcentu",
|
|
23
|
+
"ecommerce.backend.store.branding.assetUrlHint": "Adres http(s) lub ścieżka zaczynająca się od /. Zostaw puste, aby nie ustawiać.",
|
|
24
|
+
"ecommerce.backend.store.branding.assetsTitle": "Logo i favicon",
|
|
25
|
+
"ecommerce.backend.store.branding.backgroundColor": "Kolor tła",
|
|
26
|
+
"ecommerce.backend.store.branding.colorPlaceholder": "oklch(0.3 0.15 270) lub #1a2b3c",
|
|
27
|
+
"ecommerce.backend.store.branding.coloursTitle": "Kolory",
|
|
28
|
+
"ecommerce.backend.store.branding.description": "Kolory, zaokrąglenie narożników, czcionki i logo używane przez sklep. Puste wartości używają pokazanych wartości domyślnych.",
|
|
29
|
+
"ecommerce.backend.store.branding.errors.save": "Nie udało się zapisać brandingu.",
|
|
30
|
+
"ecommerce.backend.store.branding.faviconUrl": "Adres URL favicony",
|
|
31
|
+
"ecommerce.backend.store.branding.flash.saved": "Branding zapisany",
|
|
32
|
+
"ecommerce.backend.store.branding.font.systemMono": "Systemowa monospace",
|
|
33
|
+
"ecommerce.backend.store.branding.font.systemSans": "Systemowa bezszeryfowa",
|
|
34
|
+
"ecommerce.backend.store.branding.font.systemSerif": "Systemowa szeryfowa",
|
|
35
|
+
"ecommerce.backend.store.branding.fontBase": "Czcionka tekstu",
|
|
36
|
+
"ecommerce.backend.store.branding.fontHeading": "Czcionka nagłówków",
|
|
37
|
+
"ecommerce.backend.store.branding.fontInherit": "Taka sama jak czcionka tekstu",
|
|
38
|
+
"ecommerce.backend.store.branding.foregroundColor": "Kolor tekstu",
|
|
39
|
+
"ecommerce.backend.store.branding.logoUrl": "Adres URL logo",
|
|
40
|
+
"ecommerce.backend.store.branding.preview.groupTitle": "Podgląd na żywo",
|
|
41
|
+
"ecommerce.backend.store.branding.preview.heroButton": "Kup teraz",
|
|
42
|
+
"ecommerce.backend.store.branding.preview.heroText": "Podgląd Twojego sklepu z wybranymi kolorami, narożnikami i czcionkami.",
|
|
43
|
+
"ecommerce.backend.store.branding.preview.heroTitle": "Nowości",
|
|
44
|
+
"ecommerce.backend.store.branding.preview.hint": "Podgląd aktualizuje się podczas edycji i nie jest zapisywany, dopóki nie zapiszesz brandingu.",
|
|
45
|
+
"ecommerce.backend.store.branding.preview.navCart": "Koszyk",
|
|
46
|
+
"ecommerce.backend.store.branding.preview.navCategories": "Kategorie",
|
|
47
|
+
"ecommerce.backend.store.branding.preview.navShop": "Sklep",
|
|
48
|
+
"ecommerce.backend.store.branding.preview.productName": "Przykładowy produkt",
|
|
49
|
+
"ecommerce.backend.store.branding.preview.title": "Podgląd sklepu",
|
|
50
|
+
"ecommerce.backend.store.branding.primaryColor": "Kolor główny",
|
|
51
|
+
"ecommerce.backend.store.branding.primaryForeground": "Tekst na kolorze głównym",
|
|
52
|
+
"ecommerce.backend.store.branding.radius": "Zaokrąglenie narożników",
|
|
53
|
+
"ecommerce.backend.store.branding.radiusHint": "Jak bardzo zaokrąglone są przyciski, karty i pola, od kwadratowych (0) do 5rem.",
|
|
54
|
+
"ecommerce.backend.store.branding.readOnly": "Możesz przeglądać ten branding, ale nie możesz go zmieniać. Zmiana wymaga uprawnienia do zarządzania brandingiem sklepu.",
|
|
55
|
+
"ecommerce.backend.store.branding.save": "Zapisz branding",
|
|
56
|
+
"ecommerce.backend.store.branding.styleTitle": "Kształt i typografia",
|
|
57
|
+
"ecommerce.backend.store.branding.title": "Branding",
|
|
58
|
+
"ecommerce.backend.store.channels.actions.add": "Dodaj powiązanie kanału",
|
|
59
|
+
"ecommerce.backend.store.channels.actions.delete": "Usuń",
|
|
60
|
+
"ecommerce.backend.store.channels.actions.edit": "Edytuj",
|
|
61
|
+
"ecommerce.backend.store.channels.actions.makeDefault": "Ustaw jako domyślny",
|
|
62
|
+
"ecommerce.backend.store.channels.actions.view": "Podgląd",
|
|
63
|
+
"ecommerce.backend.store.channels.add.submit": "Dodaj powiązanie",
|
|
64
|
+
"ecommerce.backend.store.channels.add.title": "Dodaj powiązanie kanału",
|
|
65
|
+
"ecommerce.backend.store.channels.columns.channel": "Kanał sprzedaży",
|
|
66
|
+
"ecommerce.backend.store.channels.columns.count": "Widoczne produkty",
|
|
67
|
+
"ecommerce.backend.store.channels.columns.default": "Domyślny",
|
|
68
|
+
"ecommerce.backend.store.channels.columns.priceKind": "Rodzaj ceny",
|
|
69
|
+
"ecommerce.backend.store.channels.columns.priceSortFallback": "Sortowanie po cenie w dużym katalogu",
|
|
70
|
+
"ecommerce.backend.store.channels.columns.requireAuthentication": "Logowanie",
|
|
71
|
+
"ecommerce.backend.store.channels.columns.scope": "Asortyment",
|
|
72
|
+
"ecommerce.backend.store.channels.count.authenticationEmpty": "0 produktów widocznych dla anonimowych odwiedzających: wymagane jest logowanie, a zakres nie obejmuje żadnych produktów nawet bez tego wymogu.",
|
|
73
|
+
"ecommerce.backend.store.channels.count.basis": "Liczone dla anonimowego odwiedzającego, z uwzględnieniem ograniczeń domyślnej grupy klientów. Niezapisane zmiany też są uwzględniane.",
|
|
74
|
+
"ecommerce.backend.store.channels.count.cellReduced": "0 ({count} bez wymogu logowania)",
|
|
75
|
+
"ecommerce.backend.store.channels.count.error": "Liczba produktów jest teraz niedostępna.",
|
|
76
|
+
"ecommerce.backend.store.channels.count.loading": "Liczenie produktów…",
|
|
77
|
+
"ecommerce.backend.store.channels.count.reducedByAuthentication": "0 produktów dla anonimowych odwiedzających, ponieważ wymagane jest logowanie; {count} bez tego wymogu.",
|
|
78
|
+
"ecommerce.backend.store.channels.count.restricted": "Produkty pasujące do tego zakresu: {count}.",
|
|
79
|
+
"ecommerce.backend.store.channels.count.saveFirst": "Zapisz powiązanie, aby zobaczyć, ile produktów pokazuje. Potem licznik aktualizuje się przy każdej zmianie zakresu.",
|
|
80
|
+
"ecommerce.backend.store.channels.count.title": "Bieżąca liczba produktów",
|
|
81
|
+
"ecommerce.backend.store.channels.count.unindexed": "Aktywne produkty bez indeksu widoczności: {count}. Przy ograniczonym zakresie pozostają ukryte i nie są liczone, dopóki indeksowanie ich nie obejmie.",
|
|
82
|
+
"ecommerce.backend.store.channels.count.unrestricted": "Wszystkie produkty w katalogu tego kanału: {count}.",
|
|
83
|
+
"ecommerce.backend.store.channels.defaultBadge": "Domyślny",
|
|
84
|
+
"ecommerce.backend.store.channels.delete.confirmButton": "Usuń powiązanie",
|
|
85
|
+
"ecommerce.backend.store.channels.delete.confirmText": "Sklep przestanie korzystać z tego kanału. Sam kanał sprzedaży nie zostanie usunięty i można go powiązać ponownie.",
|
|
86
|
+
"ecommerce.backend.store.channels.delete.confirmTextDefault": "To jest powiązanie domyślne. Dopóki nie ustawisz innego powiązania jako domyślnego, sklep nie może obsługiwać żądań i odpowiada na każde błędem. Sam kanał sprzedaży nie zostanie usunięty.",
|
|
87
|
+
"ecommerce.backend.store.channels.delete.confirmTitle": "Usunąć powiązanie „{channel}”?",
|
|
88
|
+
"ecommerce.backend.store.channels.description": "Kanały sprzedaży, przez które sprzedaje ten sklep. Każde powiązanie określa, co kanał pokazuje i komu: rodzaj ceny, zakres asortymentu, wymóg logowania i sortowanie po cenie w dużym katalogu.",
|
|
89
|
+
"ecommerce.backend.store.channels.dialog.description": "Powiąż kanał sprzedaży z tym sklepem i zdecyduj, co pokazuje i komu: zakres asortymentu, wymóg logowania oraz zachowanie sortowania po cenie w dużym katalogu.",
|
|
90
|
+
"ecommerce.backend.store.channels.edit.submit": "Zapisz powiązanie",
|
|
91
|
+
"ecommerce.backend.store.channels.edit.title": "Edytuj powiązanie kanału",
|
|
92
|
+
"ecommerce.backend.store.channels.empty.description": "Powiąż kanał sprzedaży i ustaw go jako domyślny. Bez domyślnego powiązania kanału sklep nie może obsługiwać żądań.",
|
|
93
|
+
"ecommerce.backend.store.channels.empty.title": "Nie powiązano jeszcze kanału sprzedaży",
|
|
94
|
+
"ecommerce.backend.store.channels.entityPlural": "powiązania kanałów",
|
|
95
|
+
"ecommerce.backend.store.channels.errors.create": "Nie udało się dodać powiązania kanału.",
|
|
96
|
+
"ecommerce.backend.store.channels.errors.delete": "Nie udało się usunąć powiązania kanału.",
|
|
97
|
+
"ecommerce.backend.store.channels.errors.load": "Nie udało się wczytać powiązań kanałów.",
|
|
98
|
+
"ecommerce.backend.store.channels.errors.makeDefault": "Nie udało się ustawić powiązania jako domyślnego.",
|
|
99
|
+
"ecommerce.backend.store.channels.errors.update": "Nie udało się zaktualizować powiązania kanału.",
|
|
100
|
+
"ecommerce.backend.store.channels.flash.created": "Dodano powiązanie kanału",
|
|
101
|
+
"ecommerce.backend.store.channels.flash.defaultSet": "{channel} jest teraz domyślnym kanałem tego sklepu.",
|
|
102
|
+
"ecommerce.backend.store.channels.flash.deleted": "Usunięto powiązanie kanału",
|
|
103
|
+
"ecommerce.backend.store.channels.flash.updated": "Zaktualizowano powiązanie kanału",
|
|
104
|
+
"ecommerce.backend.store.channels.form.categoryIds": "Kategorie",
|
|
105
|
+
"ecommerce.backend.store.channels.form.categoryPlaceholder": "Szukaj kategorii",
|
|
106
|
+
"ecommerce.backend.store.channels.form.excludeCategoryIds": "Kategorie",
|
|
107
|
+
"ecommerce.backend.store.channels.form.excludeHint": "Ukryte produkty, kategorie i tagi mają pierwszeństwo przed powyższym wyborem.",
|
|
108
|
+
"ecommerce.backend.store.channels.form.excludeProductIds": "Produkty",
|
|
109
|
+
"ecommerce.backend.store.channels.form.excludeTagIds": "Tagi",
|
|
110
|
+
"ecommerce.backend.store.channels.form.excludeTitle": "Zawsze ukrywaj",
|
|
111
|
+
"ecommerce.backend.store.channels.form.includeHint": "Produkt jest widoczny, gdy należy do dowolnej z wybranych kategorii i ma dowolny z wybranych tagów. Puste pole nie filtruje, więc pozostaw oba puste, aby pokazać cały katalog kanału; wyczyszczenie pola nigdy nie ukrywa wszystkiego.",
|
|
112
|
+
"ecommerce.backend.store.channels.form.includeTitle": "Pokazuj tylko produkty z",
|
|
113
|
+
"ecommerce.backend.store.channels.form.isDefault": "Domyślny kanał tego sklepu",
|
|
114
|
+
"ecommerce.backend.store.channels.form.isDefaultHint": "Sklep obsługuje powiązanie domyślne. Ustawienie tego powiązania jako domyślnego zdejmuje oznaczenie z obecnego domyślnego.",
|
|
115
|
+
"ecommerce.backend.store.channels.form.isDefaultLocked": "To jest powiązanie domyślne. Aby to zmienić, ustaw inne powiązanie jako domyślne; sklep bez domyślnego kanału nie może obsługiwać żądań.",
|
|
116
|
+
"ecommerce.backend.store.channels.form.policiesTitle": "Zasady katalogu",
|
|
117
|
+
"ecommerce.backend.store.channels.form.priceKind": "Nadpisanie rodzaju ceny",
|
|
118
|
+
"ecommerce.backend.store.channels.form.priceKindHint": "Opcjonalne. Rodzaj ceny widoczny dla anonimowych odwiedzających w tym kanale. Pozostaw puste, aby użyć domyślnego rodzaju ceny.",
|
|
119
|
+
"ecommerce.backend.store.channels.form.priceKindPlaceholder": "Domyślny rodzaj ceny",
|
|
120
|
+
"ecommerce.backend.store.channels.form.priceSortFallback": "Sortowanie po cenie powyżej {cap} produktów",
|
|
121
|
+
"ecommerce.backend.store.channels.form.priceSortFallbackHint": "Sklep sortuje po cenie co najwyżej {cap} pasujących produktów. Wybierz, co dzieje się w tym kanale, gdy pasuje ich więcej.",
|
|
122
|
+
"ecommerce.backend.store.channels.form.productPlaceholder": "Szukaj produktów",
|
|
123
|
+
"ecommerce.backend.store.channels.form.requireAuthentication": "Wymagaj logowania, aby zobaczyć produkty",
|
|
124
|
+
"ecommerce.backend.store.channels.form.requireAuthenticationHint": "Anonimowi odwiedzający nie widzą w tym kanale żadnych produktów; zalogowani kupujący widzą swój zwykły asortyment. Dotyczy to tylko widoczności katalogu, nie całego sklepu: strony i logowanie pozostają dostępne. Zmiana obowiązuje po zapisaniu.",
|
|
125
|
+
"ecommerce.backend.store.channels.form.salesChannel": "Kanał sprzedaży",
|
|
126
|
+
"ecommerce.backend.store.channels.form.salesChannelPlaceholder": "Wybierz kanał sprzedaży…",
|
|
127
|
+
"ecommerce.backend.store.channels.form.tagIds": "Tagi",
|
|
128
|
+
"ecommerce.backend.store.channels.form.tagPlaceholder": "Szukaj tagów",
|
|
129
|
+
"ecommerce.backend.store.channels.noDefault": "Żadne powiązanie nie jest domyślne, więc sklep nie może obsługiwać żądań. Ustaw jedno powiązanie jako domyślne.",
|
|
130
|
+
"ecommerce.backend.store.channels.priceKindDefault": "Domyślny rodzaj ceny",
|
|
131
|
+
"ecommerce.backend.store.channels.priceSortFallback.approximate": "Przybliżona kolejność z domyślnego rodzaju ceny",
|
|
132
|
+
"ecommerce.backend.store.channels.priceSortFallback.approximateConsequence": "Gdy pasuje więcej niż {cap} produktów, kolejność cenowa jest liczona z domyślnego rodzaju ceny, a nie z cen danego kupującego. Jedynym sygnałem jest nagłówek odpowiedzi, którego żaden klient nie widzi, więc kupujący z cenami kontraktowymi mogą zobaczyć kolejność niezgodną z tym, ile płacą.",
|
|
133
|
+
"ecommerce.backend.store.channels.priceSortFallback.unavailable": "Wycofaj sortowanie po cenie",
|
|
134
|
+
"ecommerce.backend.store.channels.priceSortFallback.unavailableConsequence": "Gdy pasuje więcej niż {cap} produktów, sortowanie po cenie jest w tym kanale wycofywane: sortowanie rosnąco i malejąco po cenie nie jest oferowane, a kupujący z udostępnionego linku sortowanego po cenie dostaje katalog w domyślnej kolejności zamiast błędu.",
|
|
135
|
+
"ecommerce.backend.store.channels.public": "Publiczny",
|
|
136
|
+
"ecommerce.backend.store.channels.readOnly": "Możesz przeglądać te powiązania, ale ich nie zmieniać. Zmiana wymaga uprawnienia do zarządzania kanałami sklepu.",
|
|
137
|
+
"ecommerce.backend.store.channels.requireAuthenticationBadge": "Wymagane logowanie",
|
|
138
|
+
"ecommerce.backend.store.channels.scopeAll": "Wszystkie produkty",
|
|
139
|
+
"ecommerce.backend.store.channels.scopeRestricted": "Ograniczony (reguły: {count})",
|
|
140
|
+
"ecommerce.backend.store.channels.title": "Kanały",
|
|
141
|
+
"ecommerce.backend.store.channels.view.title": "Powiązanie kanału",
|
|
142
|
+
"ecommerce.backend.store.domains.actions.add": "Dodaj powiązanie domeny",
|
|
143
|
+
"ecommerce.backend.store.domains.actions.delete": "Usuń",
|
|
144
|
+
"ecommerce.backend.store.domains.actions.edit": "Edytuj",
|
|
145
|
+
"ecommerce.backend.store.domains.actions.makePrimary": "Ustaw jako główną",
|
|
146
|
+
"ecommerce.backend.store.domains.add.description": "Powiąż zarejestrowaną domenę, opcjonalnie z prefiksem ścieżki, aby sklep był pod nią dostępny. Obsługuje tylko aktywna domena.",
|
|
147
|
+
"ecommerce.backend.store.domains.add.submit": "Dodaj powiązanie",
|
|
148
|
+
"ecommerce.backend.store.domains.add.title": "Dodaj powiązanie domeny",
|
|
149
|
+
"ecommerce.backend.store.domains.columns.domain": "Domena",
|
|
150
|
+
"ecommerce.backend.store.domains.columns.failureReason": "Powód błędu",
|
|
151
|
+
"ecommerce.backend.store.domains.columns.lastDnsCheck": "Ostatnie sprawdzenie DNS",
|
|
152
|
+
"ecommerce.backend.store.domains.columns.primary": "Główna",
|
|
153
|
+
"ecommerce.backend.store.domains.columns.status": "Status",
|
|
154
|
+
"ecommerce.backend.store.domains.delete.confirmButton": "Usuń powiązanie",
|
|
155
|
+
"ecommerce.backend.store.domains.delete.confirmText": "Sklep przestanie odpowiadać pod tym adresem. Sama domena nie zostanie usunięta i można ją powiązać ponownie.",
|
|
156
|
+
"ecommerce.backend.store.domains.delete.confirmTextPrimary": "To jest główne powiązanie. Sklep przestanie odpowiadać pod tym adresem i nie będzie miał domeny głównej, dopóki nie wybierzesz innej. Sama domena nie zostanie usunięta.",
|
|
157
|
+
"ecommerce.backend.store.domains.delete.confirmTitle": "Usunąć powiązanie „{address}”?",
|
|
158
|
+
"ecommerce.backend.store.domains.description": "Domeny, pod którymi działa ten sklep. Status domeny jest zarządzany w zarządzaniu domenami i tutaj jest tylko do odczytu. Obsługuje tylko aktywna domena.",
|
|
159
|
+
"ecommerce.backend.store.domains.edit.submit": "Zapisz powiązanie",
|
|
160
|
+
"ecommerce.backend.store.domains.edit.title": "Edytuj powiązanie domeny",
|
|
161
|
+
"ecommerce.backend.store.domains.empty.description": "Powiąż aktywną domenę, opcjonalnie z prefiksem ścieżki, aby sklep był dostępny.",
|
|
162
|
+
"ecommerce.backend.store.domains.empty.title": "Brak powiązanych domen",
|
|
163
|
+
"ecommerce.backend.store.domains.entityPlural": "powiązania domen",
|
|
164
|
+
"ecommerce.backend.store.domains.errors.create": "Nie udało się dodać powiązania domeny.",
|
|
165
|
+
"ecommerce.backend.store.domains.errors.delete": "Nie udało się usunąć powiązania domeny.",
|
|
166
|
+
"ecommerce.backend.store.domains.errors.load": "Nie udało się wczytać powiązań domen.",
|
|
167
|
+
"ecommerce.backend.store.domains.errors.loadMappings": "Nie udało się wczytać dostępnych domen.",
|
|
168
|
+
"ecommerce.backend.store.domains.errors.makePrimary": "Nie udało się ustawić powiązania jako głównego.",
|
|
169
|
+
"ecommerce.backend.store.domains.errors.update": "Nie udało się zaktualizować powiązania domeny.",
|
|
170
|
+
"ecommerce.backend.store.domains.failure.aRecordMismatch": "Rekord A wskazuje na {actual} zamiast na {expected}",
|
|
171
|
+
"ecommerce.backend.store.domains.failure.apexNotEnabled": "Rekord A wskazuje na {actual}, ale domeny główne nie są włączone w tym wdrożeniu",
|
|
172
|
+
"ecommerce.backend.store.domains.failure.cnameMismatch": "Rekord CNAME wskazuje na {actual} zamiast na {expected}",
|
|
173
|
+
"ecommerce.backend.store.domains.failure.dnsLookup": "Zapytanie DNS o rekord {recordType} nie powiodło się",
|
|
174
|
+
"ecommerce.backend.store.domains.failure.httpStatus": "Kontrola TLS zwróciła HTTP {status}",
|
|
175
|
+
"ecommerce.backend.store.domains.failure.noRecords": "Nie znaleziono rekordu CNAME ani A",
|
|
176
|
+
"ecommerce.backend.store.domains.failure.proxyUnreachable": "Domena znajduje się za serwerem proxy, który nie przekazuje ruchu do tej platformy",
|
|
177
|
+
"ecommerce.backend.store.domains.failure.tlsFailed": "Kontrola TLS nie powiodła się",
|
|
178
|
+
"ecommerce.backend.store.domains.failure.tlsTimeout": "Upłynął limit czasu kontroli TLS",
|
|
179
|
+
"ecommerce.backend.store.domains.flash.created": "Dodano powiązanie domeny",
|
|
180
|
+
"ecommerce.backend.store.domains.flash.deleted": "Usunięto powiązanie domeny",
|
|
181
|
+
"ecommerce.backend.store.domains.flash.primaryChanged": "{address} jest teraz domeną główną. {previous} nie jest już główna.",
|
|
182
|
+
"ecommerce.backend.store.domains.flash.primarySet": "{address} jest teraz domeną główną.",
|
|
183
|
+
"ecommerce.backend.store.domains.flash.updated": "Zaktualizowano powiązanie domeny",
|
|
184
|
+
"ecommerce.backend.store.domains.form.domain": "Domena",
|
|
185
|
+
"ecommerce.backend.store.domains.form.pathPrefix": "Prefiks ścieżki",
|
|
186
|
+
"ecommerce.backend.store.domains.form.pathPrefixHint": "Opcjonalnie. Udostępnij ten sklep tylko pod ścieżką, np. /de. Pozostaw puste, aby obsługiwać całą domenę. Gdy prefiksy się nakładają, wygrywa najdłuższy pasujący prefiks.",
|
|
187
|
+
"ecommerce.backend.store.domains.form.primary": "Domena główna",
|
|
188
|
+
"ecommerce.backend.store.domains.form.primaryHint": "Adres używany w linkach kanonicznych. Ustawienie tego powiązania jako głównego zdejmuje oznaczenie z obecnego głównego powiązania tego sklepu.",
|
|
189
|
+
"ecommerce.backend.store.domains.limitHint": "Organizacja może mieć najwyżej dwie domeny: jedną aktywną i jedną oczekującą na zastąpienie. Aby obsłużyć kolejny sklep pod tą samą domeną, nadaj mu prefiks ścieżki, np. /de, zamiast dodawać domenę.",
|
|
190
|
+
"ecommerce.backend.store.domains.manageLink": "Otwórz zarządzanie domenami",
|
|
191
|
+
"ecommerce.backend.store.domains.neverChecked": "Jeszcze nie sprawdzano",
|
|
192
|
+
"ecommerce.backend.store.domains.noMappings": "Ta organizacja nie ma jeszcze domen. Zarejestruj jedną w zarządzaniu domenami, a następnie powiąż ją tutaj.",
|
|
193
|
+
"ecommerce.backend.store.domains.primaryBadge": "Główna",
|
|
194
|
+
"ecommerce.backend.store.domains.readOnly": "Możesz przeglądać te powiązania, ale ich nie zmieniać. Zmiana wymaga uprawnienia do zarządzania domenami sklepu.",
|
|
195
|
+
"ecommerce.backend.store.domains.removed.description": "Domena, na którą wskazuje to powiązanie, została usunięta w zarządzaniu domenami, więc sklep już tu nie odpowiada. Edytuj powiązanie, aby wybrać inną domenę, lub je usuń.",
|
|
196
|
+
"ecommerce.backend.store.domains.removed.title": "Domena usunięta",
|
|
197
|
+
"ecommerce.backend.store.domains.removedHostname": "Usunięta domena",
|
|
198
|
+
"ecommerce.backend.store.domains.status.active": "Aktywna",
|
|
199
|
+
"ecommerce.backend.store.domains.status.dnsFailed": "Błąd DNS",
|
|
200
|
+
"ecommerce.backend.store.domains.status.pending": "Oczekująca",
|
|
201
|
+
"ecommerce.backend.store.domains.status.removed": "Usunięta",
|
|
202
|
+
"ecommerce.backend.store.domains.status.tlsFailed": "Błąd TLS",
|
|
203
|
+
"ecommerce.backend.store.domains.status.unknown": "Nieznany",
|
|
204
|
+
"ecommerce.backend.store.domains.status.verified": "Zweryfikowana",
|
|
205
|
+
"ecommerce.backend.store.domains.title": "Domeny",
|
|
206
|
+
"ecommerce.backend.store.domains.unavailable": "Szczegóły domeny są chwilowo niedostępne.",
|
|
207
|
+
"ecommerce.backend.store.domains.warning.notServing": "Ta domena ma status: {status}. Obsługuje tylko aktywna domena, więc sklep jeszcze nie odpowiada pod adresem {hostname}.",
|
|
208
|
+
"ecommerce.backend.store.entityType": "Sklep",
|
|
209
|
+
"ecommerce.backend.store.errors.load": "Nie udało się wczytać sklepu.",
|
|
210
|
+
"ecommerce.backend.store.general.description": "Nazwa sklepu, jego identyfikatory, języki, w których jest wyświetlany, oraz waluta.",
|
|
211
|
+
"ecommerce.backend.store.general.errors.save": "Nie udało się zapisać sklepu.",
|
|
212
|
+
"ecommerce.backend.store.general.flash.saved": "Sklep zapisany",
|
|
213
|
+
"ecommerce.backend.store.general.readOnly": "Możesz przeglądać ten sklep, ale nie możesz go zmieniać. Zmiana wymaga uprawnienia do zarządzania sklepami.",
|
|
214
|
+
"ecommerce.backend.store.general.save": "Zapisz zmiany",
|
|
215
|
+
"ecommerce.backend.store.general.status": "Status",
|
|
216
|
+
"ecommerce.backend.store.general.statusArchivedHint": "Zarchiwizowanego sklepu nie można przywrócić.",
|
|
217
|
+
"ecommerce.backend.store.general.statusHint": "Sklep w wersji roboczej nie udostępnia witryny. Sklep można zarchiwizować na liście sklepów.",
|
|
218
|
+
"ecommerce.backend.store.general.title": "Tożsamość i lokalizacja",
|
|
219
|
+
"ecommerce.backend.store.loading": "Wczytywanie sklepu...",
|
|
220
|
+
"ecommerce.backend.store.notFound.description": "Ten sklep nie istnieje w wybranej organizacji lub został usunięty.",
|
|
221
|
+
"ecommerce.backend.store.notFound.label": "Nie znaleziono sklepu",
|
|
222
|
+
"ecommerce.backend.store.seo.defaultMetaDescription": "Domyślny opis meta",
|
|
223
|
+
"ecommerce.backend.store.seo.defaultMetaDescriptionHint": "Krótki opis Twojego sklepu wyświetlany w wynikach wyszukiwania, gdy nie jest dostępny opis produktu.",
|
|
224
|
+
"ecommerce.backend.store.seo.description": "Skonfiguruj, jak Twój sklep pojawia się w wynikach wyszukiwania i dla zautomatyzowanych robotów indeksujących.",
|
|
225
|
+
"ecommerce.backend.store.seo.errors.save": "Nie udało się zapisać ustawień SEO.",
|
|
226
|
+
"ecommerce.backend.store.seo.flash.saved": "Ustawienia SEO zostały zapisane",
|
|
227
|
+
"ecommerce.backend.store.seo.googleSiteVerification": "Token weryfikacji witryny Google",
|
|
228
|
+
"ecommerce.backend.store.seo.googleSiteVerificationHint": "Token udostępniony przez Google Search Console do weryfikacji posiadania witryny.",
|
|
229
|
+
"ecommerce.backend.store.seo.readOnly": "Możesz przeglądać te ustawienia SEO, ale nie możesz ich zmieniać. Zmiana wymaga uprawnień do zarządzania sklepami.",
|
|
230
|
+
"ecommerce.backend.store.seo.robotsTxt": "robots.txt",
|
|
231
|
+
"ecommerce.backend.store.seo.robotsTxtHint": "Instrukcje dla robotów wyszukiwarek dotyczące tego, które części Twojego sklepu indeksować.",
|
|
232
|
+
"ecommerce.backend.store.seo.save": "Zapisz ustawienia SEO",
|
|
233
|
+
"ecommerce.backend.store.seo.siteName": "Nazwa witryny",
|
|
234
|
+
"ecommerce.backend.store.seo.siteNameHint": "Nazwa Twojego sklepu wyświetlana w wynikach wyszukiwania i karcie przeglądarki.",
|
|
235
|
+
"ecommerce.backend.store.seo.title": "Optymalizacja dla wyszukiwarek",
|
|
236
|
+
"ecommerce.backend.store.summary.code": "Kod",
|
|
237
|
+
"ecommerce.backend.store.summary.currency": "Waluta",
|
|
238
|
+
"ecommerce.backend.store.summary.defaultChannel": "Domyślny kanał",
|
|
239
|
+
"ecommerce.backend.store.summary.defaultLocale": "Język domyślny",
|
|
240
|
+
"ecommerce.backend.store.summary.primaryDomain": "Domena główna",
|
|
241
|
+
"ecommerce.backend.store.summary.slug": "Slug",
|
|
242
|
+
"ecommerce.backend.store.summary.supportedLocales": "Obsługiwane języki",
|
|
243
|
+
"ecommerce.backend.store.summary.title": "Podsumowanie sklepu",
|
|
244
|
+
"ecommerce.backend.store.tabs.ariaLabel": "Sekcje sklepu",
|
|
245
|
+
"ecommerce.backend.store.tabs.branding": "Branding",
|
|
246
|
+
"ecommerce.backend.store.tabs.channels": "Kanały",
|
|
247
|
+
"ecommerce.backend.store.tabs.domains": "Domeny",
|
|
248
|
+
"ecommerce.backend.store.tabs.general": "Ogólne",
|
|
249
|
+
"ecommerce.backend.store.tabs.seo": "SEO",
|
|
250
|
+
"ecommerce.backend.stores.actions.archive": "Archiwizuj",
|
|
251
|
+
"ecommerce.backend.stores.actions.channels": "Kanały",
|
|
252
|
+
"ecommerce.backend.stores.actions.create": "Utwórz sklep",
|
|
253
|
+
"ecommerce.backend.stores.actions.domains": "Domeny",
|
|
254
|
+
"ecommerce.backend.stores.actions.edit": "Edytuj",
|
|
255
|
+
"ecommerce.backend.stores.archive.confirmButton": "Archiwizuj sklep",
|
|
256
|
+
"ecommerce.backend.stores.archive.confirmText": "Zarchiwizowany sklep przestaje obsługiwać swoją witrynę (HTTP 410). Jego konfiguracja i historia zostają zachowane, ale archiwizacji nie można cofnąć.",
|
|
257
|
+
"ecommerce.backend.stores.archive.confirmTitle": "Zarchiwizować sklep „{name}”?",
|
|
258
|
+
"ecommerce.backend.stores.columns.channel": "Kanał",
|
|
259
|
+
"ecommerce.backend.stores.columns.code": "Kod",
|
|
260
|
+
"ecommerce.backend.stores.columns.created": "Utworzono",
|
|
261
|
+
"ecommerce.backend.stores.columns.name": "Nazwa",
|
|
262
|
+
"ecommerce.backend.stores.columns.noDefaultChannel": "Brak domyślnego kanału",
|
|
263
|
+
"ecommerce.backend.stores.columns.primaryDomain": "Domena główna",
|
|
264
|
+
"ecommerce.backend.stores.columns.status": "Status",
|
|
265
|
+
"ecommerce.backend.stores.create.description": "Sklep zaczyna jako szkic. Aby go opublikować, dodaj później jego domenę i kanał sprzedaży.",
|
|
266
|
+
"ecommerce.backend.stores.create.submit": "Utwórz sklep",
|
|
267
|
+
"ecommerce.backend.stores.create.title": "Utwórz sklep",
|
|
268
|
+
"ecommerce.backend.stores.empty.description": "Nowa przestrzeń robocza automatycznie otrzymuje jeden sklep w wersji szkicu. Jeśli ta przestrzeń istniała przed włączeniem modułu sklepów, uruchom akcję aktualizacji „Utwórz domyślny sklep” z pulpitu, aby go utworzyć, albo utwórz sklep teraz.",
|
|
269
|
+
"ecommerce.backend.stores.empty.descriptionReadOnly": "Nowa przestrzeń robocza automatycznie otrzymuje jeden sklep w wersji szkicu. Jeśli ta przestrzeń istniała przed włączeniem modułu sklepów, administrator musi uruchomić akcję aktualizacji „Utwórz domyślny sklep” z pulpitu.",
|
|
270
|
+
"ecommerce.backend.stores.empty.title": "Brak sklepów",
|
|
271
|
+
"ecommerce.backend.stores.entityPlural": "sklepów",
|
|
272
|
+
"ecommerce.backend.stores.errors.archive": "Nie udało się zarchiwizować sklepu.",
|
|
273
|
+
"ecommerce.backend.stores.errors.create": "Nie udało się utworzyć sklepu.",
|
|
274
|
+
"ecommerce.backend.stores.errors.load": "Nie udało się wczytać sklepów.",
|
|
275
|
+
"ecommerce.backend.stores.filters.status": "Status",
|
|
276
|
+
"ecommerce.backend.stores.flash.archived": "Sklep zarchiwizowany",
|
|
277
|
+
"ecommerce.backend.stores.flash.created": "Sklep utworzony",
|
|
278
|
+
"ecommerce.backend.stores.form.code": "Kod",
|
|
279
|
+
"ecommerce.backend.stores.form.codeHint": "Wewnętrzny identyfikator, unikalny w przestrzeni roboczej. Małe litery, cyfry, myślniki i podkreślenia.",
|
|
280
|
+
"ecommerce.backend.stores.form.currency": "Waluta",
|
|
281
|
+
"ecommerce.backend.stores.form.currencyHint": "Trzyliterowy kod ISO, na przykład EUR.",
|
|
282
|
+
"ecommerce.backend.stores.form.defaultLocale": "Język domyślny",
|
|
283
|
+
"ecommerce.backend.stores.form.defaultLocaleHint": "Kod języka, na przykład en lub pl-PL.",
|
|
284
|
+
"ecommerce.backend.stores.form.name": "Nazwa",
|
|
285
|
+
"ecommerce.backend.stores.form.slug": "Slug",
|
|
286
|
+
"ecommerce.backend.stores.form.slugHint": "Krótka nazwa używana w adresach sklepu, unikalna w przestrzeni roboczej. Małe litery, cyfry i myślniki.",
|
|
287
|
+
"ecommerce.backend.stores.form.supportedLocales": "Obsługiwane języki",
|
|
288
|
+
"ecommerce.backend.stores.form.supportedLocalesHint": "Języki, w których można wyświetlać sklep. Musi zawierać język domyślny.",
|
|
289
|
+
"ecommerce.backend.stores.search.placeholder": "Szukaj według nazwy, kodu lub sluga",
|
|
290
|
+
"ecommerce.backend.stores.status.active": "Aktywny",
|
|
291
|
+
"ecommerce.backend.stores.status.archived": "Zarchiwizowany",
|
|
292
|
+
"ecommerce.backend.stores.status.draft": "Szkic",
|
|
293
|
+
"ecommerce.errors.brandingPermissionRequired": "Nie masz uprawnień do ustawienia brandingu sklepu.",
|
|
294
|
+
"ecommerce.errors.brandingRouteRequired": "Nie można tutaj zmienić brandingu. Zapisz go przez endpoint brandingu (PUT /api/ecommerce/stores/{id}/branding).",
|
|
295
|
+
"ecommerce.errors.channelBindingNotFound": "Wybrane powiązanie kanału nie istnieje w tej organizacji.",
|
|
296
|
+
"ecommerce.errors.codeDuplicate": "Sklep z tym kodem już istnieje.",
|
|
297
|
+
"ecommerce.errors.defaultChannelConflict": "W tym samym czasie inne powiązanie kanału tego sklepu zostało ustawione jako domyślne. Odśwież i spróbuj ponownie.",
|
|
298
|
+
"ecommerce.errors.domainBindingDuplicate": "Ta domena i prefiks ścieżki obsługują już sklep.",
|
|
299
|
+
"ecommerce.errors.domainBindingNotFound": "Wybrane powiązanie domeny nie istnieje w tej organizacji.",
|
|
300
|
+
"ecommerce.errors.domainMappingNotFound": "Wybrana domena nie należy do tej organizacji.",
|
|
301
|
+
"ecommerce.errors.domainMappingsUnavailable": "Domeny są teraz niedostępne. Spróbuj ponownie później.",
|
|
302
|
+
"ecommerce.errors.internal": "Coś poszło nie tak. Spróbuj ponownie.",
|
|
303
|
+
"ecommerce.errors.invalidJsonBody": "Treść żądania nie jest poprawnym JSON-em.",
|
|
304
|
+
"ecommerce.errors.operationBlocked": "Ta zmiana została zablokowana. Sprawdź sklep i spróbuj ponownie.",
|
|
305
|
+
"ecommerce.errors.organizationRequired": "Najpierw wybierz organizację.",
|
|
306
|
+
"ecommerce.errors.priceKindNotFound": "Wybrany rodzaj ceny nie istnieje w tej organizacji.",
|
|
307
|
+
"ecommerce.errors.primaryConflict": "W tym samym czasie inny sklep został ustawiony jako główny. Odśwież i spróbuj ponownie.",
|
|
308
|
+
"ecommerce.errors.primaryDomainConflict": "W tym samym czasie inne powiązanie domeny tego sklepu zostało ustawione jako główne. Odśwież i spróbuj ponownie.",
|
|
309
|
+
"ecommerce.errors.salesChannelNotFound": "Wybrany kanał sprzedaży nie istnieje w tej organizacji.",
|
|
310
|
+
"ecommerce.errors.slugDuplicate": "Sklep z tym slugiem już istnieje.",
|
|
311
|
+
"ecommerce.errors.storeNotFound": "Wybrany sklep nie istnieje w tej organizacji.",
|
|
312
|
+
"ecommerce.errors.unauthorized": "Zaloguj się, aby kontynuować.",
|
|
313
|
+
"ecommerce.module.title": "Sklepy",
|
|
314
|
+
"ecommerce.notifications.store.assortmentEmpty.body": "Zakresy kanału i grupy klientów nie zostawiają tym kupującym żadnych widocznych produktów.",
|
|
315
|
+
"ecommerce.notifications.store.assortmentEmpty.title": "Asortyment sklepu jest pusty dla części kupujących",
|
|
316
|
+
"ecommerce.notifications.store.channelBindingMissing.body": "Sklep nie obsłuży żądań, dopóki nie zostanie skonfigurowane domyślne powiązanie z kanałem.",
|
|
317
|
+
"ecommerce.notifications.store.channelBindingMissing.title": "Sklep nie ma domyślnego kanału sprzedaży",
|
|
318
|
+
"ecommerce.search.badge.store": "Sklep",
|
|
319
|
+
"ecommerce.search.status.active": "Aktywny",
|
|
320
|
+
"ecommerce.search.status.archived": "Zarchiwizowany",
|
|
321
|
+
"ecommerce.search.status.draft": "Szkic",
|
|
322
|
+
"ecommerce.validation.archivedStoreTerminal": "Zarchiwizowanego sklepu nie można ponownie otworzyć. Zamiast tego utwórz nowy sklep.",
|
|
323
|
+
"ecommerce.validation.backorderLeadTimeRequired": "Podaj czas realizacji backorderu w pełnych dniach (0 lub więcej).",
|
|
324
|
+
"ecommerce.validation.borderRadiusInvalid": "Promień zaokrąglenia musi wynosić 0 lub być wartością w rem (do 5rem) albo px (do 80px).",
|
|
325
|
+
"ecommerce.validation.brandingFieldUnknown": "To ustawienie brandingu nie istnieje.",
|
|
326
|
+
"ecommerce.validation.codeInvalid": "Kod może zawierać tylko małe litery, cyfry, myślniki i podkreślenia.",
|
|
327
|
+
"ecommerce.validation.colorInvalid": "Kolor musi być wartością OKLCH, np. oklch(0.3 0.15 270), lub wartością szesnastkową, np. #1a2b3c.",
|
|
328
|
+
"ecommerce.validation.currencyCodeInvalid": "Kod waluty musi być trzyliterowym kodem ISO, np. EUR.",
|
|
329
|
+
"ecommerce.validation.defaultLocaleNotSupported": "Domyślny język musi należeć do obsługiwanych języków.",
|
|
330
|
+
"ecommerce.validation.draftRequireAuthenticationInvalid": "Robocza wartość wymogu uwierzytelnienia musi być równa true lub false.",
|
|
331
|
+
"ecommerce.validation.draftScopeInvalid": "Roboczy zakres może zawierać tylko identyfikatory kategorii, tagów oraz wykluczonych produktów, kategorii i tagów.",
|
|
332
|
+
"ecommerce.validation.draftScopeJsonInvalid": "Roboczy zakres musi być asortymentem zakodowanym jako JSON.",
|
|
333
|
+
"ecommerce.validation.fontNotAllowed": "Wybierz czcionkę z listy dostępnych czcionek.",
|
|
334
|
+
"ecommerce.validation.googleSiteVerificationInvalid": "Wpisz token z Google Search Console: tylko litery, cyfry, myślniki i podkreślenia, do 128 znaków.",
|
|
335
|
+
"ecommerce.validation.localeInvalid": "Język musi być kodem języka, np. en lub en-US.",
|
|
336
|
+
"ecommerce.validation.localesDuplicate": "Każdy obsługiwany język może wystąpić tylko raz.",
|
|
337
|
+
"ecommerce.validation.pathPrefixInvalid": "Prefiks ścieżki może zawierać tylko małe litery, cyfry, myślniki i ukośniki, np. /shop.",
|
|
338
|
+
"ecommerce.validation.slugInvalid": "Slug może zawierać tylko małe litery, cyfry i pojedyncze myślniki między nimi.",
|
|
339
|
+
"ecommerce.validation.urlInvalid": "Podaj prawidłowy adres URL http(s) lub ścieżkę zaczynającą się od /.",
|
|
340
|
+
"notifications.categories.ecommerce": "E-commerce"
|
|
341
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ModuleInfo } from '@open-mercato/shared/modules/registry'
|
|
2
|
+
|
|
3
|
+
export const metadata: ModuleInfo = {
|
|
4
|
+
name: 'ecommerce',
|
|
5
|
+
title: 'Ecommerce Stores',
|
|
6
|
+
version: '0.1.0',
|
|
7
|
+
description: 'Storefront definition, hostname and sales-channel binding, buyer-context resolution and per-store branding for the public storefront API.',
|
|
8
|
+
author: 'Open Mercato Team',
|
|
9
|
+
license: 'MIT',
|
|
10
|
+
ejectable: true,
|
|
11
|
+
requires: ['catalog', 'sales', 'customer_accounts', 'customer_groups'],
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { features } from './acl'
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { AwilixContainer } from 'awilix'
|
|
2
|
+
import type { AssortmentScope, EffectiveAssortmentScope } from '@open-mercato/shared/lib/catalog-visibility'
|
|
3
|
+
import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
|
|
4
|
+
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
5
|
+
import type { QueryEngine, Where } from '@open-mercato/shared/lib/query/types'
|
|
6
|
+
import { PRODUCT_SCOPE_KEYS_DOC_KEY } from '@open-mercato/core/modules/catalog/lib/productScopeKeys'
|
|
7
|
+
import { E } from '#generated/entities.ids.generated'
|
|
8
|
+
import { ecommerceAssortmentScopeSchema } from '../data/validators'
|
|
9
|
+
import { resolveAnonymousAssortmentScope } from './buyerContext'
|
|
10
|
+
import type { Translate } from './crudSupport'
|
|
11
|
+
import { buildStorefrontProductScope, composeStorefrontProductFilters } from './storefrontProductScope'
|
|
12
|
+
|
|
13
|
+
const logger = createLogger('ecommerce').child({ component: 'assortment-count' })
|
|
14
|
+
|
|
15
|
+
export type AssortmentCountScopeSource = 'saved' | 'draft'
|
|
16
|
+
|
|
17
|
+
export type AssortmentCountResponse = {
|
|
18
|
+
count: number
|
|
19
|
+
scopeSource: AssortmentCountScopeSource
|
|
20
|
+
requireAuthentication: boolean
|
|
21
|
+
reducedByAuthentication: boolean
|
|
22
|
+
countWithoutAuthentication: number
|
|
23
|
+
unindexedCount: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type AssortmentCountDraft = {
|
|
27
|
+
scope?: AssortmentScope | null
|
|
28
|
+
requireAuthentication?: boolean
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type AssortmentCountDraftResult =
|
|
32
|
+
| { ok: true; draft: AssortmentCountDraft }
|
|
33
|
+
| { ok: false; fieldErrors: Record<string, string> }
|
|
34
|
+
|
|
35
|
+
export const DRAFT_SCOPE_PARAM = 'draftScope'
|
|
36
|
+
export const DRAFT_REQUIRE_AUTHENTICATION_PARAM = 'draftRequireAuthentication'
|
|
37
|
+
|
|
38
|
+
function readSingleParam(searchParams: URLSearchParams, name: string): string | null | 'duplicate' {
|
|
39
|
+
const values = searchParams.getAll(name)
|
|
40
|
+
if (values.length === 0) return null
|
|
41
|
+
if (values.length > 1) return 'duplicate'
|
|
42
|
+
return values[0]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Parses the unsaved Channels-tab state a count request may carry. `draftScope` is a JSON-encoded
|
|
47
|
+
* `assortment_scope` validated with the schema the channel binding write path uses, so `allOf` and
|
|
48
|
+
* any unknown key are rejected exactly as they are on save; `draftRequireAuthentication` is a
|
|
49
|
+
* boolean token. Absent parameters fall back to the saved binding.
|
|
50
|
+
*/
|
|
51
|
+
export function parseAssortmentCountDraft(searchParams: URLSearchParams, translate: Translate): AssortmentCountDraftResult {
|
|
52
|
+
const fieldErrors: Record<string, string> = {}
|
|
53
|
+
const draft: AssortmentCountDraft = {}
|
|
54
|
+
|
|
55
|
+
const rawScope = readSingleParam(searchParams, DRAFT_SCOPE_PARAM)
|
|
56
|
+
if (rawScope !== null) {
|
|
57
|
+
const invalidJson = translate(
|
|
58
|
+
'ecommerce.validation.draftScopeJsonInvalid',
|
|
59
|
+
'The draft scope must be a JSON-encoded assortment scope.',
|
|
60
|
+
)
|
|
61
|
+
if (rawScope === 'duplicate') {
|
|
62
|
+
fieldErrors[DRAFT_SCOPE_PARAM] = invalidJson
|
|
63
|
+
} else {
|
|
64
|
+
let decoded: unknown
|
|
65
|
+
let decodable = true
|
|
66
|
+
try {
|
|
67
|
+
decoded = JSON.parse(rawScope)
|
|
68
|
+
} catch {
|
|
69
|
+
decodable = false
|
|
70
|
+
fieldErrors[DRAFT_SCOPE_PARAM] = invalidJson
|
|
71
|
+
}
|
|
72
|
+
if (decodable) {
|
|
73
|
+
const parsed = ecommerceAssortmentScopeSchema.safeParse(decoded)
|
|
74
|
+
if (parsed.success) {
|
|
75
|
+
draft.scope = parsed.data
|
|
76
|
+
} else {
|
|
77
|
+
fieldErrors[DRAFT_SCOPE_PARAM] = translate(
|
|
78
|
+
'ecommerce.validation.draftScopeInvalid',
|
|
79
|
+
'The draft scope may only contain category, tag and excluded product, category and tag ids.',
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const rawRequireAuthentication = readSingleParam(searchParams, DRAFT_REQUIRE_AUTHENTICATION_PARAM)
|
|
87
|
+
if (rawRequireAuthentication !== null) {
|
|
88
|
+
const parsed = rawRequireAuthentication === 'duplicate' ? null : parseBooleanToken(rawRequireAuthentication)
|
|
89
|
+
if (parsed === null) {
|
|
90
|
+
fieldErrors[DRAFT_REQUIRE_AUTHENTICATION_PARAM] = translate(
|
|
91
|
+
'ecommerce.validation.draftRequireAuthenticationInvalid',
|
|
92
|
+
'The draft require-authentication value must be true or false.',
|
|
93
|
+
)
|
|
94
|
+
} else {
|
|
95
|
+
draft.requireAuthentication = parsed
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (Object.keys(fieldErrors).length > 0) return { ok: false, fieldErrors }
|
|
100
|
+
return { ok: true, draft }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
type CountScope = { tenantId: string; organizationId: string }
|
|
104
|
+
|
|
105
|
+
async function countStorefrontProducts(
|
|
106
|
+
queryEngine: QueryEngine,
|
|
107
|
+
scope: CountScope,
|
|
108
|
+
assortmentScope: EffectiveAssortmentScope,
|
|
109
|
+
extra?: Where,
|
|
110
|
+
): Promise<number> {
|
|
111
|
+
if (Array.isArray(assortmentScope) && assortmentScope.length === 0) return 0
|
|
112
|
+
const productScope = buildStorefrontProductScope({ ...scope, buyer: { assortmentScope } })
|
|
113
|
+
const result = await queryEngine.query(E.catalog.catalog_product, {
|
|
114
|
+
tenantId: productScope.tenantId,
|
|
115
|
+
organizationId: productScope.organizationId,
|
|
116
|
+
withDeleted: productScope.withDeleted,
|
|
117
|
+
filters: composeStorefrontProductFilters(productScope, extra),
|
|
118
|
+
fields: ['id'],
|
|
119
|
+
page: { page: 1, pageSize: 1 },
|
|
120
|
+
})
|
|
121
|
+
return result.total
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Live product count behind the Channels tab (SPEC-029 §9.2, §10a US-E1): how many products the
|
|
126
|
+
* channel would show an anonymous buyer. The effective assortment comes from the storefront's own
|
|
127
|
+
* buyer resolution (`resolveAnonymousAssortmentScope`) and is counted through the same
|
|
128
|
+
* `buildStorefrontProductScope` + `composeStorefrontProductFilters` query the listing composes, so
|
|
129
|
+
* the admin number cannot drift from the storefront's total.
|
|
130
|
+
*
|
|
131
|
+
* `count` is the anonymous figure — `0` while `requireAuthentication` is on — and
|
|
132
|
+
* `countWithoutAuthentication` is what the same scope would show with the gate off, so the form can
|
|
133
|
+
* say how many products the toggle hides. `unindexedCount` reports active products with no
|
|
134
|
+
* `scope_keys` document yet: they fail closed under any restricted scope, so a non-zero value
|
|
135
|
+
* explains a count that looks too low.
|
|
136
|
+
*/
|
|
137
|
+
export async function countChannelAssortment(
|
|
138
|
+
container: AwilixContainer,
|
|
139
|
+
input: {
|
|
140
|
+
tenantId: string
|
|
141
|
+
organizationId: string
|
|
142
|
+
channelAssortmentScope: AssortmentScope | null
|
|
143
|
+
requireAuthentication: boolean
|
|
144
|
+
scopeSource: AssortmentCountScopeSource
|
|
145
|
+
},
|
|
146
|
+
): Promise<AssortmentCountResponse> {
|
|
147
|
+
const queryEngine = container.resolve('queryEngine') as QueryEngine
|
|
148
|
+
const scope: CountScope = { tenantId: input.tenantId, organizationId: input.organizationId }
|
|
149
|
+
const openScope = await resolveAnonymousAssortmentScope(container, {
|
|
150
|
+
tenantId: input.tenantId,
|
|
151
|
+
channelAssortmentScope: input.channelAssortmentScope,
|
|
152
|
+
requireAuthentication: false,
|
|
153
|
+
})
|
|
154
|
+
const countWithoutAuthentication = await countStorefrontProducts(queryEngine, scope, openScope)
|
|
155
|
+
const count = input.requireAuthentication ? 0 : countWithoutAuthentication
|
|
156
|
+
const restricted = openScope !== null && openScope.length > 0
|
|
157
|
+
const unindexedCount = restricted
|
|
158
|
+
? await countStorefrontProducts(queryEngine, scope, null, { [PRODUCT_SCOPE_KEYS_DOC_KEY]: { $exists: false } })
|
|
159
|
+
: 0
|
|
160
|
+
if (unindexedCount > 0) {
|
|
161
|
+
logger.info('Active products without a scope index fail closed under a restricted assortment scope', {
|
|
162
|
+
organizationId: input.organizationId,
|
|
163
|
+
scopeSource: input.scopeSource,
|
|
164
|
+
unindexedCount,
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
count,
|
|
169
|
+
scopeSource: input.scopeSource,
|
|
170
|
+
requireAuthentication: input.requireAuthentication,
|
|
171
|
+
reducedByAuthentication: input.requireAuthentication && countWithoutAuthentication > 0,
|
|
172
|
+
countWithoutAuthentication,
|
|
173
|
+
unindexedCount,
|
|
174
|
+
}
|
|
175
|
+
}
|