@vendure/admin-ui-plugin 3.5.0-minor-202510071456 → 3.5.0-minor-202510161257

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.
Files changed (25) hide show
  1. package/lib/admin-ui/browser/{chunk-BAGW7S7U.js → chunk-62WZVAGZ.js} +2 -2
  2. package/lib/admin-ui/browser/{chunk-6DITECGZ.js → chunk-HGTDPVVP.js} +2 -2
  3. package/lib/admin-ui/browser/{chunk-I75DGLYX.js → chunk-INUQUGDP.js} +2 -2
  4. package/lib/admin-ui/browser/{chunk-6VDSQ5PN.js → chunk-KLMIW47T.js} +2 -2
  5. package/lib/admin-ui/browser/{chunk-NJP3ONOL.js → chunk-LLPI2K5W.js} +2 -2
  6. package/lib/admin-ui/browser/{chunk-LMDJIU5E.js → chunk-MGKCV6RL.js} +2 -2
  7. package/lib/admin-ui/browser/{chunk-NBSVYMMZ.js → chunk-QNKDMGPR.js} +2 -2
  8. package/lib/admin-ui/browser/{chunk-XZ7UMGA4.js → chunk-S7KKXH7D.js} +2 -2
  9. package/lib/admin-ui/browser/{chunk-XZ7UMGA4.js.map → chunk-S7KKXH7D.js.map} +1 -1
  10. package/lib/admin-ui/browser/{chunk-PPIIOCTA.js → chunk-SMJBA7YN.js} +2 -2
  11. package/lib/admin-ui/browser/{chunk-26NA46T2.js → chunk-ZZ5UUYIQ.js} +2 -2
  12. package/lib/admin-ui/browser/{chunk-26NA46T2.js.map → chunk-ZZ5UUYIQ.js.map} +1 -1
  13. package/lib/admin-ui/browser/index.html +1 -1
  14. package/lib/admin-ui/browser/main-JQQTQYED.js +2 -0
  15. package/package.json +5 -5
  16. package/lib/admin-ui/browser/main-EC6KNUVG.js +0 -2
  17. /package/lib/admin-ui/browser/{chunk-BAGW7S7U.js.map → chunk-62WZVAGZ.js.map} +0 -0
  18. /package/lib/admin-ui/browser/{chunk-6DITECGZ.js.map → chunk-HGTDPVVP.js.map} +0 -0
  19. /package/lib/admin-ui/browser/{chunk-I75DGLYX.js.map → chunk-INUQUGDP.js.map} +0 -0
  20. /package/lib/admin-ui/browser/{chunk-6VDSQ5PN.js.map → chunk-KLMIW47T.js.map} +0 -0
  21. /package/lib/admin-ui/browser/{chunk-NJP3ONOL.js.map → chunk-LLPI2K5W.js.map} +0 -0
  22. /package/lib/admin-ui/browser/{chunk-LMDJIU5E.js.map → chunk-MGKCV6RL.js.map} +0 -0
  23. /package/lib/admin-ui/browser/{chunk-NBSVYMMZ.js.map → chunk-QNKDMGPR.js.map} +0 -0
  24. /package/lib/admin-ui/browser/{chunk-PPIIOCTA.js.map → chunk-SMJBA7YN.js.map} +0 -0
  25. /package/lib/admin-ui/browser/{main-EC6KNUVG.js.map → main-JQQTQYED.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../common/src/generated-types.ts", "src/lib/catalog/src/catalog.module.ts", "src/lib/catalog/src/providers/product-detail/product-detail.service.ts", "src/lib/catalog/src/providers/product-detail/replace-last.ts", "src/lib/catalog/src/components/product-options-editor/product-options-editor.component.ts", "src/lib/catalog/src/components/product-options-editor/product-options-editor.component.html", "src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.ts", "src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.html", "src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.ts", "src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.html", "src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.ts", "src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.html", "src/lib/catalog/src/components/option-value-input/option-value-input.component.ts", "src/lib/catalog/src/components/option-value-input/option-value-input.component.html", "src/lib/catalog/src/providers/routing/product-variants-resolver.ts", "src/lib/catalog/src/catalog.routes.ts", "src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.ts", "src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.html", "src/lib/catalog/src/components/asset-detail/asset-detail.component.ts", "src/lib/catalog/src/components/asset-detail/asset-detail.component.html", "src/lib/catalog/src/components/asset-list/asset-list.component.ts", "src/lib/catalog/src/components/asset-list/asset-list.component.html", "src/lib/catalog/src/components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component.ts", "src/lib/catalog/src/components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component.html", "src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.ts", "src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.html", "src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql.ts", "src/lib/catalog/src/components/collection-contents/collection-contents.component.ts", "src/lib/catalog/src/components/collection-contents/collection-contents.component.html", "src/lib/catalog/src/components/collection-data-table/collection-data-table.component.ts", "src/lib/catalog/src/components/collection-data-table/collection-data-table.component.html", "src/lib/catalog/src/components/collection-detail/collection-detail.component.ts", "src/lib/catalog/src/components/collection-detail/collection-detail.component.html", "src/lib/catalog/src/components/collection-list/collection-breadcrumb.pipe.ts", "src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.ts", "src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.html", "src/lib/catalog/src/components/collection-list/collection-list-bulk-actions.ts", "src/lib/catalog/src/components/collection-list/collection-list.component.ts", "src/lib/catalog/src/components/collection-list/collection-list.component.html", "src/lib/catalog/src/components/collection-tree/collection-tree.service.ts", "src/lib/catalog/src/components/collection-tree/collection-tree-node.component.ts", "src/lib/catalog/src/components/collection-tree/collection-tree-node.component.html", "src/lib/catalog/src/components/collection-tree/array-to-tree.ts", "src/lib/catalog/src/components/collection-tree/collection-tree.component.ts", "src/lib/catalog/src/components/collection-tree/collection-tree.component.html", "src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.ts", "src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.html", "src/lib/catalog/src/components/create-facet-value-dialog/create-facet-value-dialog.component.ts", "src/lib/catalog/src/components/create-facet-value-dialog/create-facet-value-dialog.component.html", "src/lib/catalog/src/components/facet-detail/facet-detail.component.ts", "src/lib/catalog/src/components/facet-detail/facet-detail.component.html", "src/lib/catalog/src/components/facet-list/facet-list-bulk-actions.ts", "src/lib/catalog/src/components/facet-list/facet-list.component.ts", "src/lib/catalog/src/components/facet-list/facet-list.component.html", "src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.ts", "src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.html", "src/lib/catalog/src/components/product-detail/product-detail.component.ts", "src/lib/catalog/src/components/product-detail/product-detail.component.html", "src/lib/catalog/src/components/product-variant-list/product-variant-list.component.ts", "src/lib/catalog/src/components/product-variant-list/product-variant-list.component.html", "src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts", "src/lib/catalog/src/components/product-list/product-list.component.ts", "src/lib/catalog/src/components/product-list/product-list.component.html", "src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.ts", "src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.html", "src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.ts", "src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.html", "src/lib/catalog/src/components/variant-price-strategy-detail/variant-price-strategy-detail.component.ts", "src/lib/catalog/src/components/variant-price-strategy-detail/variant-price-strategy-detail.component.html", "src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.ts", "src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.html", "src/lib/catalog/src/components/product-variant-list/product-variant-list-bulk-actions.ts", "src/lib/catalog/src/components/product-variants-table/product-variants-table.component.ts", "src/lib/catalog/src/components/product-variants-table/product-variants-table.component.html", "src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.ts", "src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.html", "src/lib/catalog/src/components/product-list/product-list.graphql.ts", "src/lib/catalog/src/components/product-variant-detail/product-variant-detail.graphql.ts", "src/lib/catalog/src/components/product-variant-list/product-variant-list.graphql.ts"],
4
- "sourcesContent": ["/* eslint-disable */\nexport type Maybe<T> = T;\nexport type InputMaybe<T> = T;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: { input: string | number; output: string | number; }\n String: { input: string; output: string; }\n Boolean: { input: boolean; output: boolean; }\n Int: { input: number; output: number; }\n Float: { input: number; output: number; }\n DateTime: { input: any; output: any; }\n JSON: { input: any; output: any; }\n Money: { input: number; output: number; }\n Upload: { input: any; output: any; }\n};\n\nexport type AddFulfillmentToOrderResult = CreateFulfillmentError | EmptyOrderLineSelectionError | Fulfillment | FulfillmentStateTransitionError | InsufficientStockOnHandError | InvalidFulfillmentHandlerError | ItemsAlreadyFulfilledError;\n\nexport type AddItemInput = {\n productVariantId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type AddItemToDraftOrderInput = {\n productVariantId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type AddManualPaymentToOrderResult = ManualPaymentStateError | Order;\n\nexport type AddNoteToCustomerInput = {\n id: Scalars['ID']['input'];\n isPublic: Scalars['Boolean']['input'];\n note: Scalars['String']['input'];\n};\n\nexport type AddNoteToOrderInput = {\n id: Scalars['ID']['input'];\n isPublic: Scalars['Boolean']['input'];\n note: Scalars['String']['input'];\n};\n\nexport type Address = Node & {\n __typename?: 'Address';\n city?: Maybe<Scalars['String']['output']>;\n company?: Maybe<Scalars['String']['output']>;\n country: Country;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n defaultBillingAddress?: Maybe<Scalars['Boolean']['output']>;\n defaultShippingAddress?: Maybe<Scalars['Boolean']['output']>;\n fullName?: Maybe<Scalars['String']['output']>;\n id: Scalars['ID']['output'];\n phoneNumber?: Maybe<Scalars['String']['output']>;\n postalCode?: Maybe<Scalars['String']['output']>;\n province?: Maybe<Scalars['String']['output']>;\n streetLine1: Scalars['String']['output'];\n streetLine2?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type AdjustDraftOrderLineInput = {\n orderLineId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type Adjustment = {\n __typename?: 'Adjustment';\n adjustmentSource: Scalars['String']['output'];\n amount: Scalars['Money']['output'];\n data?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n type: AdjustmentType;\n};\n\nexport enum AdjustmentType {\n DISTRIBUTED_ORDER_PROMOTION = 'DISTRIBUTED_ORDER_PROMOTION',\n OTHER = 'OTHER',\n PROMOTION = 'PROMOTION'\n}\n\nexport type Administrator = Node & {\n __typename?: 'Administrator';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n emailAddress: Scalars['String']['output'];\n firstName: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n lastName: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n user: User;\n};\n\nexport type AdministratorFilterParameter = {\n _and?: InputMaybe<Array<AdministratorFilterParameter>>;\n _or?: InputMaybe<Array<AdministratorFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n emailAddress?: InputMaybe<StringOperators>;\n firstName?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n lastName?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type AdministratorList = PaginatedList & {\n __typename?: 'AdministratorList';\n items: Array<Administrator>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type AdministratorListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<AdministratorFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<AdministratorSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type AdministratorPaymentInput = {\n metadata?: InputMaybe<Scalars['JSON']['input']>;\n paymentMethod?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type AdministratorRefundInput = {\n /**\n * The amount to be refunded to this particular Payment. This was introduced in\n * v2.2.0 as the preferred way to specify the refund amount. The `lines`, `shipping` and `adjustment`\n * fields will be removed in a future version.\n */\n amount?: InputMaybe<Scalars['Money']['input']>;\n paymentId: Scalars['ID']['input'];\n reason?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type AdministratorSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n emailAddress?: InputMaybe<SortOrder>;\n firstName?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n lastName?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type Allocation = Node & StockMovement & {\n __typename?: 'Allocation';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n orderLine: OrderLine;\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned if an attempting to refund an OrderItem which has already been refunded */\nexport type AlreadyRefundedError = ErrorResult & {\n __typename?: 'AlreadyRefundedError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n refundId: Scalars['ID']['output'];\n};\n\nexport type ApplyCouponCodeResult = CouponCodeExpiredError | CouponCodeInvalidError | CouponCodeLimitError | Order;\n\nexport type Asset = Node & {\n __typename?: 'Asset';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n fileSize: Scalars['Int']['output'];\n focalPoint?: Maybe<Coordinate>;\n height: Scalars['Int']['output'];\n id: Scalars['ID']['output'];\n mimeType: Scalars['String']['output'];\n name: Scalars['String']['output'];\n preview: Scalars['String']['output'];\n source: Scalars['String']['output'];\n tags: Array<Tag>;\n type: AssetType;\n updatedAt: Scalars['DateTime']['output'];\n width: Scalars['Int']['output'];\n};\n\nexport type AssetFilterParameter = {\n _and?: InputMaybe<Array<AssetFilterParameter>>;\n _or?: InputMaybe<Array<AssetFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n fileSize?: InputMaybe<NumberOperators>;\n height?: InputMaybe<NumberOperators>;\n id?: InputMaybe<IdOperators>;\n mimeType?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n preview?: InputMaybe<StringOperators>;\n source?: InputMaybe<StringOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n width?: InputMaybe<NumberOperators>;\n};\n\nexport type AssetList = PaginatedList & {\n __typename?: 'AssetList';\n items: Array<Asset>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type AssetListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<AssetFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<AssetSortParameter>;\n tags?: InputMaybe<Array<Scalars['String']['input']>>;\n tagsOperator?: InputMaybe<LogicalOperator>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type AssetSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n fileSize?: InputMaybe<SortOrder>;\n height?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n mimeType?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n preview?: InputMaybe<SortOrder>;\n source?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n width?: InputMaybe<SortOrder>;\n};\n\nexport enum AssetType {\n BINARY = 'BINARY',\n IMAGE = 'IMAGE',\n VIDEO = 'VIDEO'\n}\n\nexport type AssignAssetsToChannelInput = {\n assetIds: Array<Scalars['ID']['input']>;\n channelId: Scalars['ID']['input'];\n};\n\nexport type AssignCollectionsToChannelInput = {\n channelId: Scalars['ID']['input'];\n collectionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignFacetsToChannelInput = {\n channelId: Scalars['ID']['input'];\n facetIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignPaymentMethodsToChannelInput = {\n channelId: Scalars['ID']['input'];\n paymentMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignProductVariantsToChannelInput = {\n channelId: Scalars['ID']['input'];\n priceFactor?: InputMaybe<Scalars['Float']['input']>;\n productVariantIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignProductsToChannelInput = {\n channelId: Scalars['ID']['input'];\n priceFactor?: InputMaybe<Scalars['Float']['input']>;\n productIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignPromotionsToChannelInput = {\n channelId: Scalars['ID']['input'];\n promotionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignShippingMethodsToChannelInput = {\n channelId: Scalars['ID']['input'];\n shippingMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignStockLocationsToChannelInput = {\n channelId: Scalars['ID']['input'];\n stockLocationIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AuthenticationInput = {\n native?: InputMaybe<NativeAuthInput>;\n};\n\nexport type AuthenticationMethod = Node & {\n __typename?: 'AuthenticationMethod';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n strategy: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type AuthenticationResult = CurrentUser | InvalidCredentialsError;\n\nexport type BooleanCustomFieldConfig = CustomField & {\n __typename?: 'BooleanCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/** Operators for filtering on a list of Boolean fields */\nexport type BooleanListOperators = {\n inList: Scalars['Boolean']['input'];\n};\n\n/** Operators for filtering on a Boolean field */\nexport type BooleanOperators = {\n eq?: InputMaybe<Scalars['Boolean']['input']>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type BooleanStructFieldConfig = StructField & {\n __typename?: 'BooleanStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/** Returned if an attempting to cancel lines from an Order which is still active */\nexport type CancelActiveOrderError = ErrorResult & {\n __typename?: 'CancelActiveOrderError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n orderState: Scalars['String']['output'];\n};\n\nexport type CancelOrderInput = {\n /** Specify whether the shipping charges should also be cancelled. Defaults to false */\n cancelShipping?: InputMaybe<Scalars['Boolean']['input']>;\n /** Optionally specify which OrderLines to cancel. If not provided, all OrderLines will be cancelled */\n lines?: InputMaybe<Array<OrderLineInput>>;\n /** The id of the order to be cancelled */\n orderId: Scalars['ID']['input'];\n reason?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type CancelOrderResult = CancelActiveOrderError | EmptyOrderLineSelectionError | MultipleOrderError | Order | OrderStateTransitionError | QuantityTooGreatError;\n\n/** Returned if the Payment cancellation fails */\nexport type CancelPaymentError = ErrorResult & {\n __typename?: 'CancelPaymentError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n paymentErrorMessage: Scalars['String']['output'];\n};\n\nexport type CancelPaymentResult = CancelPaymentError | Payment | PaymentStateTransitionError;\n\nexport type Cancellation = Node & StockMovement & {\n __typename?: 'Cancellation';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n orderLine: OrderLine;\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type Channel = Node & {\n __typename?: 'Channel';\n availableCurrencyCodes: Array<CurrencyCode>;\n availableLanguageCodes?: Maybe<Array<LanguageCode>>;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n /** @deprecated Use defaultCurrencyCode instead */\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n defaultCurrencyCode: CurrencyCode;\n defaultLanguageCode: LanguageCode;\n defaultShippingZone?: Maybe<Zone>;\n defaultTaxZone?: Maybe<Zone>;\n id: Scalars['ID']['output'];\n /** Not yet used - will be implemented in a future release. */\n outOfStockThreshold?: Maybe<Scalars['Int']['output']>;\n pricesIncludeTax: Scalars['Boolean']['output'];\n seller?: Maybe<Seller>;\n token: Scalars['String']['output'];\n /** Not yet used - will be implemented in a future release. */\n trackInventory?: Maybe<Scalars['Boolean']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/**\n * Returned when the default LanguageCode of a Channel is no longer found in the `availableLanguages`\n * of the GlobalSettings\n */\nexport type ChannelDefaultLanguageError = ErrorResult & {\n __typename?: 'ChannelDefaultLanguageError';\n channelCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n language: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type ChannelFilterParameter = {\n _and?: InputMaybe<Array<ChannelFilterParameter>>;\n _or?: InputMaybe<Array<ChannelFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n currencyCode?: InputMaybe<StringOperators>;\n defaultCurrencyCode?: InputMaybe<StringOperators>;\n defaultLanguageCode?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n outOfStockThreshold?: InputMaybe<NumberOperators>;\n pricesIncludeTax?: InputMaybe<BooleanOperators>;\n token?: InputMaybe<StringOperators>;\n trackInventory?: InputMaybe<BooleanOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ChannelList = PaginatedList & {\n __typename?: 'ChannelList';\n items: Array<Channel>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ChannelListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ChannelFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ChannelSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ChannelSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n outOfStockThreshold?: InputMaybe<SortOrder>;\n token?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type Collection = Node & {\n __typename?: 'Collection';\n assets: Array<Asset>;\n breadcrumbs: Array<CollectionBreadcrumb>;\n children?: Maybe<Array<Collection>>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n featuredAsset?: Maybe<Asset>;\n filters: Array<ConfigurableOperation>;\n id: Scalars['ID']['output'];\n inheritFilters: Scalars['Boolean']['output'];\n isPrivate: Scalars['Boolean']['output'];\n languageCode?: Maybe<LanguageCode>;\n name: Scalars['String']['output'];\n parent?: Maybe<Collection>;\n parentId: Scalars['ID']['output'];\n position: Scalars['Int']['output'];\n productVariants: ProductVariantList;\n slug: Scalars['String']['output'];\n translations: Array<CollectionTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n\nexport type CollectionProductVariantsArgs = {\n options?: InputMaybe<ProductVariantListOptions>;\n};\n\nexport type CollectionBreadcrumb = {\n __typename?: 'CollectionBreadcrumb';\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n};\n\nexport type CollectionFilterParameter = {\n _and?: InputMaybe<Array<CollectionFilterParameter>>;\n _or?: InputMaybe<Array<CollectionFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n inheritFilters?: InputMaybe<BooleanOperators>;\n isPrivate?: InputMaybe<BooleanOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n parentId?: InputMaybe<IdOperators>;\n position?: InputMaybe<NumberOperators>;\n slug?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CollectionList = PaginatedList & {\n __typename?: 'CollectionList';\n items: Array<Collection>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CollectionListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CollectionFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CollectionSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n topLevelOnly?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\n/**\n * Which Collections are present in the products returned\n * by the search, and in what quantity.\n */\nexport type CollectionResult = {\n __typename?: 'CollectionResult';\n collection: Collection;\n count: Scalars['Int']['output'];\n};\n\nexport type CollectionSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n parentId?: InputMaybe<SortOrder>;\n position?: InputMaybe<SortOrder>;\n slug?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type CollectionTranslation = {\n __typename?: 'CollectionTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ConfigArg = {\n __typename?: 'ConfigArg';\n name: Scalars['String']['output'];\n value: Scalars['String']['output'];\n};\n\nexport type ConfigArgDefinition = {\n __typename?: 'ConfigArgDefinition';\n defaultValue?: Maybe<Scalars['JSON']['output']>;\n description?: Maybe<Scalars['String']['output']>;\n label?: Maybe<Scalars['String']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n required: Scalars['Boolean']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type ConfigArgInput = {\n name: Scalars['String']['input'];\n /** A JSON stringified representation of the actual value */\n value: Scalars['String']['input'];\n};\n\nexport type ConfigurableOperation = {\n __typename?: 'ConfigurableOperation';\n args: Array<ConfigArg>;\n code: Scalars['String']['output'];\n};\n\nexport type ConfigurableOperationDefinition = {\n __typename?: 'ConfigurableOperationDefinition';\n args: Array<ConfigArgDefinition>;\n code: Scalars['String']['output'];\n description: Scalars['String']['output'];\n};\n\nexport type ConfigurableOperationInput = {\n arguments: Array<ConfigArgInput>;\n code: Scalars['String']['input'];\n};\n\nexport type Coordinate = {\n __typename?: 'Coordinate';\n x: Scalars['Float']['output'];\n y: Scalars['Float']['output'];\n};\n\nexport type CoordinateInput = {\n x: Scalars['Float']['input'];\n y: Scalars['Float']['input'];\n};\n\n/**\n * A Country of the world which your shop operates in.\n *\n * The `code` field is typically a 2-character ISO code such as \"GB\", \"US\", \"DE\" etc. This code is used in certain inputs such as\n * `UpdateAddressInput` and `CreateAddressInput` to specify the country.\n */\nexport type Country = Node & Region & {\n __typename?: 'Country';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n parent?: Maybe<Region>;\n parentId?: Maybe<Scalars['ID']['output']>;\n translations: Array<RegionTranslation>;\n type: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type CountryFilterParameter = {\n _and?: InputMaybe<Array<CountryFilterParameter>>;\n _or?: InputMaybe<Array<CountryFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n parentId?: InputMaybe<IdOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CountryList = PaginatedList & {\n __typename?: 'CountryList';\n items: Array<Country>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CountryListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CountryFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CountrySortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CountrySortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n parentId?: InputMaybe<SortOrder>;\n type?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type CountryTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** Returned if the provided coupon code is invalid */\nexport type CouponCodeExpiredError = ErrorResult & {\n __typename?: 'CouponCodeExpiredError';\n couponCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the provided coupon code is invalid */\nexport type CouponCodeInvalidError = ErrorResult & {\n __typename?: 'CouponCodeInvalidError';\n couponCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the provided coupon code is invalid */\nexport type CouponCodeLimitError = ErrorResult & {\n __typename?: 'CouponCodeLimitError';\n couponCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n limit: Scalars['Int']['output'];\n message: Scalars['String']['output'];\n};\n\n/**\n * Input used to create an Address.\n *\n * The countryCode must correspond to a `code` property of a Country that has been defined in the\n * Vendure server. The `code` property is typically a 2-character ISO code such as \"GB\", \"US\", \"DE\" etc.\n * If an invalid code is passed, the mutation will fail.\n */\nexport type CreateAddressInput = {\n city?: InputMaybe<Scalars['String']['input']>;\n company?: InputMaybe<Scalars['String']['input']>;\n countryCode: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultBillingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n defaultShippingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n fullName?: InputMaybe<Scalars['String']['input']>;\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n postalCode?: InputMaybe<Scalars['String']['input']>;\n province?: InputMaybe<Scalars['String']['input']>;\n streetLine1: Scalars['String']['input'];\n streetLine2?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type CreateAdministratorInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress: Scalars['String']['input'];\n firstName: Scalars['String']['input'];\n lastName: Scalars['String']['input'];\n password: Scalars['String']['input'];\n roleIds: Array<Scalars['ID']['input']>;\n};\n\nexport type CreateAssetInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n file: Scalars['Upload']['input'];\n tags?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type CreateAssetResult = Asset | MimeTypeError;\n\nexport type CreateChannelInput = {\n availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;\n availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;\n code: Scalars['String']['input'];\n /** @deprecated Use defaultCurrencyCode instead */\n currencyCode?: InputMaybe<CurrencyCode>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultCurrencyCode?: InputMaybe<CurrencyCode>;\n defaultLanguageCode: LanguageCode;\n defaultShippingZoneId: Scalars['ID']['input'];\n defaultTaxZoneId: Scalars['ID']['input'];\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n pricesIncludeTax: Scalars['Boolean']['input'];\n sellerId?: InputMaybe<Scalars['ID']['input']>;\n token: Scalars['String']['input'];\n trackInventory?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type CreateChannelResult = Channel | LanguageNotAvailableError;\n\nexport type CreateCollectionInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n filters: Array<ConfigurableOperationInput>;\n inheritFilters?: InputMaybe<Scalars['Boolean']['input']>;\n isPrivate?: InputMaybe<Scalars['Boolean']['input']>;\n parentId?: InputMaybe<Scalars['ID']['input']>;\n translations: Array<CreateCollectionTranslationInput>;\n};\n\nexport type CreateCollectionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description: Scalars['String']['input'];\n languageCode: LanguageCode;\n name: Scalars['String']['input'];\n slug: Scalars['String']['input'];\n};\n\nexport type CreateCountryInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n translations: Array<CountryTranslationInput>;\n};\n\nexport type CreateCustomerGroupInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n customerIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateCustomerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress: Scalars['String']['input'];\n firstName: Scalars['String']['input'];\n lastName: Scalars['String']['input'];\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n title?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type CreateCustomerResult = Customer | EmailAddressConflictError;\n\nexport type CreateFacetInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n isPrivate: Scalars['Boolean']['input'];\n translations: Array<FacetTranslationInput>;\n values?: InputMaybe<Array<CreateFacetValueWithFacetInput>>;\n};\n\nexport type CreateFacetValueInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n facetId: Scalars['ID']['input'];\n translations: Array<FacetValueTranslationInput>;\n};\n\nexport type CreateFacetValueWithFacetInput = {\n code: Scalars['String']['input'];\n translations: Array<FacetValueTranslationInput>;\n};\n\n/** Returned if an error is thrown in a FulfillmentHandler's createFulfillment method */\nexport type CreateFulfillmentError = ErrorResult & {\n __typename?: 'CreateFulfillmentError';\n errorCode: ErrorCode;\n fulfillmentHandlerError: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type CreateGroupOptionInput = {\n code: Scalars['String']['input'];\n translations: Array<ProductOptionGroupTranslationInput>;\n};\n\nexport type CreatePaymentMethodInput = {\n checker?: InputMaybe<ConfigurableOperationInput>;\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n handler: ConfigurableOperationInput;\n translations: Array<PaymentMethodTranslationInput>;\n};\n\nexport type CreateProductInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n translations: Array<ProductTranslationInput>;\n};\n\nexport type CreateProductOptionGroupInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n options: Array<CreateGroupOptionInput>;\n translations: Array<ProductOptionGroupTranslationInput>;\n};\n\nexport type CreateProductOptionInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n productOptionGroupId: Scalars['ID']['input'];\n translations: Array<ProductOptionGroupTranslationInput>;\n};\n\nexport type CreateProductVariantInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n optionIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n price?: InputMaybe<Scalars['Money']['input']>;\n prices?: InputMaybe<Array<InputMaybe<CreateProductVariantPriceInput>>>;\n productId: Scalars['ID']['input'];\n sku: Scalars['String']['input'];\n stockLevels?: InputMaybe<Array<StockLevelInput>>;\n stockOnHand?: InputMaybe<Scalars['Int']['input']>;\n taxCategoryId?: InputMaybe<Scalars['ID']['input']>;\n trackInventory?: InputMaybe<GlobalFlag>;\n translations: Array<ProductVariantTranslationInput>;\n useGlobalOutOfStockThreshold?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type CreateProductVariantOptionInput = {\n code: Scalars['String']['input'];\n optionGroupId: Scalars['ID']['input'];\n translations: Array<ProductOptionTranslationInput>;\n};\n\nexport type CreateProductVariantPriceInput = {\n currencyCode: CurrencyCode;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n price: Scalars['Money']['input'];\n};\n\nexport type CreatePromotionInput = {\n actions: Array<ConfigurableOperationInput>;\n conditions: Array<ConfigurableOperationInput>;\n couponCode?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n endsAt?: InputMaybe<Scalars['DateTime']['input']>;\n perCustomerUsageLimit?: InputMaybe<Scalars['Int']['input']>;\n startsAt?: InputMaybe<Scalars['DateTime']['input']>;\n translations: Array<PromotionTranslationInput>;\n usageLimit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CreatePromotionResult = MissingConditionsError | Promotion;\n\nexport type CreateProvinceInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n translations: Array<ProvinceTranslationInput>;\n};\n\nexport type CreateRoleInput = {\n channelIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n code: Scalars['String']['input'];\n description: Scalars['String']['input'];\n permissions: Array<Permission>;\n};\n\nexport type CreateSellerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateShippingMethodInput = {\n calculator: ConfigurableOperationInput;\n checker: ConfigurableOperationInput;\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n fulfillmentHandler: Scalars['String']['input'];\n translations: Array<ShippingMethodTranslationInput>;\n};\n\nexport type CreateStockLocationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateTagInput = {\n value: Scalars['String']['input'];\n};\n\nexport type CreateTaxCategoryInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n isDefault?: InputMaybe<Scalars['Boolean']['input']>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateTaxRateInput = {\n categoryId: Scalars['ID']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n customerGroupId?: InputMaybe<Scalars['ID']['input']>;\n enabled: Scalars['Boolean']['input'];\n name: Scalars['String']['input'];\n value: Scalars['Float']['input'];\n zoneId: Scalars['ID']['input'];\n};\n\nexport type CreateZoneInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n memberIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n name: Scalars['String']['input'];\n};\n\n/**\n * @description\n * ISO 4217 currency code\n *\n * @docsCategory common\n */\nexport enum CurrencyCode {\n /** United Arab Emirates dirham */\n AED = 'AED',\n /** Afghan afghani */\n AFN = 'AFN',\n /** Albanian lek */\n ALL = 'ALL',\n /** Armenian dram */\n AMD = 'AMD',\n /** Netherlands Antillean guilder */\n ANG = 'ANG',\n /** Angolan kwanza */\n AOA = 'AOA',\n /** Argentine peso */\n ARS = 'ARS',\n /** Australian dollar */\n AUD = 'AUD',\n /** Aruban florin */\n AWG = 'AWG',\n /** Azerbaijani manat */\n AZN = 'AZN',\n /** Bosnia and Herzegovina convertible mark */\n BAM = 'BAM',\n /** Barbados dollar */\n BBD = 'BBD',\n /** Bangladeshi taka */\n BDT = 'BDT',\n /** Bulgarian lev */\n BGN = 'BGN',\n /** Bahraini dinar */\n BHD = 'BHD',\n /** Burundian franc */\n BIF = 'BIF',\n /** Bermudian dollar */\n BMD = 'BMD',\n /** Brunei dollar */\n BND = 'BND',\n /** Boliviano */\n BOB = 'BOB',\n /** Brazilian real */\n BRL = 'BRL',\n /** Bahamian dollar */\n BSD = 'BSD',\n /** Bhutanese ngultrum */\n BTN = 'BTN',\n /** Botswana pula */\n BWP = 'BWP',\n /** Belarusian ruble */\n BYN = 'BYN',\n /** Belize dollar */\n BZD = 'BZD',\n /** Canadian dollar */\n CAD = 'CAD',\n /** Congolese franc */\n CDF = 'CDF',\n /** Swiss franc */\n CHF = 'CHF',\n /** Chilean peso */\n CLP = 'CLP',\n /** Renminbi (Chinese) yuan */\n CNY = 'CNY',\n /** Colombian peso */\n COP = 'COP',\n /** Costa Rican colon */\n CRC = 'CRC',\n /** Cuban convertible peso */\n CUC = 'CUC',\n /** Cuban peso */\n CUP = 'CUP',\n /** Cape Verde escudo */\n CVE = 'CVE',\n /** Czech koruna */\n CZK = 'CZK',\n /** Djiboutian franc */\n DJF = 'DJF',\n /** Danish krone */\n DKK = 'DKK',\n /** Dominican peso */\n DOP = 'DOP',\n /** Algerian dinar */\n DZD = 'DZD',\n /** Egyptian pound */\n EGP = 'EGP',\n /** Eritrean nakfa */\n ERN = 'ERN',\n /** Ethiopian birr */\n ETB = 'ETB',\n /** Euro */\n EUR = 'EUR',\n /** Fiji dollar */\n FJD = 'FJD',\n /** Falkland Islands pound */\n FKP = 'FKP',\n /** Pound sterling */\n GBP = 'GBP',\n /** Georgian lari */\n GEL = 'GEL',\n /** Ghanaian cedi */\n GHS = 'GHS',\n /** Gibraltar pound */\n GIP = 'GIP',\n /** Gambian dalasi */\n GMD = 'GMD',\n /** Guinean franc */\n GNF = 'GNF',\n /** Guatemalan quetzal */\n GTQ = 'GTQ',\n /** Guyanese dollar */\n GYD = 'GYD',\n /** Hong Kong dollar */\n HKD = 'HKD',\n /** Honduran lempira */\n HNL = 'HNL',\n /** Croatian kuna */\n HRK = 'HRK',\n /** Haitian gourde */\n HTG = 'HTG',\n /** Hungarian forint */\n HUF = 'HUF',\n /** Indonesian rupiah */\n IDR = 'IDR',\n /** Israeli new shekel */\n ILS = 'ILS',\n /** Indian rupee */\n INR = 'INR',\n /** Iraqi dinar */\n IQD = 'IQD',\n /** Iranian rial */\n IRR = 'IRR',\n /** Icelandic kr\u00F3na */\n ISK = 'ISK',\n /** Jamaican dollar */\n JMD = 'JMD',\n /** Jordanian dinar */\n JOD = 'JOD',\n /** Japanese yen */\n JPY = 'JPY',\n /** Kenyan shilling */\n KES = 'KES',\n /** Kyrgyzstani som */\n KGS = 'KGS',\n /** Cambodian riel */\n KHR = 'KHR',\n /** Comoro franc */\n KMF = 'KMF',\n /** North Korean won */\n KPW = 'KPW',\n /** South Korean won */\n KRW = 'KRW',\n /** Kuwaiti dinar */\n KWD = 'KWD',\n /** Cayman Islands dollar */\n KYD = 'KYD',\n /** Kazakhstani tenge */\n KZT = 'KZT',\n /** Lao kip */\n LAK = 'LAK',\n /** Lebanese pound */\n LBP = 'LBP',\n /** Sri Lankan rupee */\n LKR = 'LKR',\n /** Liberian dollar */\n LRD = 'LRD',\n /** Lesotho loti */\n LSL = 'LSL',\n /** Libyan dinar */\n LYD = 'LYD',\n /** Moroccan dirham */\n MAD = 'MAD',\n /** Moldovan leu */\n MDL = 'MDL',\n /** Malagasy ariary */\n MGA = 'MGA',\n /** Macedonian denar */\n MKD = 'MKD',\n /** Myanmar kyat */\n MMK = 'MMK',\n /** Mongolian t\u00F6gr\u00F6g */\n MNT = 'MNT',\n /** Macanese pataca */\n MOP = 'MOP',\n /** Mauritanian ouguiya */\n MRU = 'MRU',\n /** Mauritian rupee */\n MUR = 'MUR',\n /** Maldivian rufiyaa */\n MVR = 'MVR',\n /** Malawian kwacha */\n MWK = 'MWK',\n /** Mexican peso */\n MXN = 'MXN',\n /** Malaysian ringgit */\n MYR = 'MYR',\n /** Mozambican metical */\n MZN = 'MZN',\n /** Namibian dollar */\n NAD = 'NAD',\n /** Nigerian naira */\n NGN = 'NGN',\n /** Nicaraguan c\u00F3rdoba */\n NIO = 'NIO',\n /** Norwegian krone */\n NOK = 'NOK',\n /** Nepalese rupee */\n NPR = 'NPR',\n /** New Zealand dollar */\n NZD = 'NZD',\n /** Omani rial */\n OMR = 'OMR',\n /** Panamanian balboa */\n PAB = 'PAB',\n /** Peruvian sol */\n PEN = 'PEN',\n /** Papua New Guinean kina */\n PGK = 'PGK',\n /** Philippine peso */\n PHP = 'PHP',\n /** Pakistani rupee */\n PKR = 'PKR',\n /** Polish z\u0142oty */\n PLN = 'PLN',\n /** Paraguayan guaran\u00ED */\n PYG = 'PYG',\n /** Qatari riyal */\n QAR = 'QAR',\n /** Romanian leu */\n RON = 'RON',\n /** Serbian dinar */\n RSD = 'RSD',\n /** Russian ruble */\n RUB = 'RUB',\n /** Rwandan franc */\n RWF = 'RWF',\n /** Saudi riyal */\n SAR = 'SAR',\n /** Solomon Islands dollar */\n SBD = 'SBD',\n /** Seychelles rupee */\n SCR = 'SCR',\n /** Sudanese pound */\n SDG = 'SDG',\n /** Swedish krona/kronor */\n SEK = 'SEK',\n /** Singapore dollar */\n SGD = 'SGD',\n /** Saint Helena pound */\n SHP = 'SHP',\n /** Sierra Leonean leone */\n SLL = 'SLL',\n /** Somali shilling */\n SOS = 'SOS',\n /** Surinamese dollar */\n SRD = 'SRD',\n /** South Sudanese pound */\n SSP = 'SSP',\n /** S\u00E3o Tom\u00E9 and Pr\u00EDncipe dobra */\n STN = 'STN',\n /** Salvadoran col\u00F3n */\n SVC = 'SVC',\n /** Syrian pound */\n SYP = 'SYP',\n /** Swazi lilangeni */\n SZL = 'SZL',\n /** Thai baht */\n THB = 'THB',\n /** Tajikistani somoni */\n TJS = 'TJS',\n /** Turkmenistan manat */\n TMT = 'TMT',\n /** Tunisian dinar */\n TND = 'TND',\n /** Tongan pa\u02BBanga */\n TOP = 'TOP',\n /** Turkish lira */\n TRY = 'TRY',\n /** Trinidad and Tobago dollar */\n TTD = 'TTD',\n /** New Taiwan dollar */\n TWD = 'TWD',\n /** Tanzanian shilling */\n TZS = 'TZS',\n /** Ukrainian hryvnia */\n UAH = 'UAH',\n /** Ugandan shilling */\n UGX = 'UGX',\n /** United States dollar */\n USD = 'USD',\n /** Uruguayan peso */\n UYU = 'UYU',\n /** Uzbekistan som */\n UZS = 'UZS',\n /** Venezuelan bol\u00EDvar soberano */\n VES = 'VES',\n /** Vietnamese \u0111\u1ED3ng */\n VND = 'VND',\n /** Vanuatu vatu */\n VUV = 'VUV',\n /** Samoan tala */\n WST = 'WST',\n /** CFA franc BEAC */\n XAF = 'XAF',\n /** East Caribbean dollar */\n XCD = 'XCD',\n /** CFA franc BCEAO */\n XOF = 'XOF',\n /** CFP franc (franc Pacifique) */\n XPF = 'XPF',\n /** Yemeni rial */\n YER = 'YER',\n /** South African rand */\n ZAR = 'ZAR',\n /** Zambian kwacha */\n ZMW = 'ZMW',\n /** Zimbabwean dollar */\n ZWL = 'ZWL'\n}\n\nexport type CurrentUser = {\n __typename?: 'CurrentUser';\n channels: Array<CurrentUserChannel>;\n id: Scalars['ID']['output'];\n identifier: Scalars['String']['output'];\n};\n\nexport type CurrentUserChannel = {\n __typename?: 'CurrentUserChannel';\n code: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n permissions: Array<Permission>;\n token: Scalars['String']['output'];\n};\n\nexport type CustomField = {\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type CustomFieldConfig = BooleanCustomFieldConfig | DateTimeCustomFieldConfig | FloatCustomFieldConfig | IntCustomFieldConfig | LocaleStringCustomFieldConfig | LocaleTextCustomFieldConfig | RelationCustomFieldConfig | StringCustomFieldConfig | StructCustomFieldConfig | TextCustomFieldConfig;\n\n/**\n * This type is deprecated in v2.2 in favor of the EntityCustomFields type,\n * which allows custom fields to be defined on user-supplied entities.\n */\nexport type CustomFields = {\n __typename?: 'CustomFields';\n Address: Array<CustomFieldConfig>;\n Administrator: Array<CustomFieldConfig>;\n Asset: Array<CustomFieldConfig>;\n Channel: Array<CustomFieldConfig>;\n Collection: Array<CustomFieldConfig>;\n Customer: Array<CustomFieldConfig>;\n CustomerGroup: Array<CustomFieldConfig>;\n Facet: Array<CustomFieldConfig>;\n FacetValue: Array<CustomFieldConfig>;\n Fulfillment: Array<CustomFieldConfig>;\n GlobalSettings: Array<CustomFieldConfig>;\n HistoryEntry: Array<CustomFieldConfig>;\n Order: Array<CustomFieldConfig>;\n OrderLine: Array<CustomFieldConfig>;\n Payment: Array<CustomFieldConfig>;\n PaymentMethod: Array<CustomFieldConfig>;\n Product: Array<CustomFieldConfig>;\n ProductOption: Array<CustomFieldConfig>;\n ProductOptionGroup: Array<CustomFieldConfig>;\n ProductVariant: Array<CustomFieldConfig>;\n ProductVariantPrice: Array<CustomFieldConfig>;\n Promotion: Array<CustomFieldConfig>;\n Refund: Array<CustomFieldConfig>;\n Region: Array<CustomFieldConfig>;\n Seller: Array<CustomFieldConfig>;\n Session: Array<CustomFieldConfig>;\n ShippingLine: Array<CustomFieldConfig>;\n ShippingMethod: Array<CustomFieldConfig>;\n StockLevel: Array<CustomFieldConfig>;\n StockLocation: Array<CustomFieldConfig>;\n StockMovement: Array<CustomFieldConfig>;\n TaxCategory: Array<CustomFieldConfig>;\n TaxRate: Array<CustomFieldConfig>;\n User: Array<CustomFieldConfig>;\n Zone: Array<CustomFieldConfig>;\n};\n\nexport type Customer = Node & {\n __typename?: 'Customer';\n addresses?: Maybe<Array<Address>>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n emailAddress: Scalars['String']['output'];\n firstName: Scalars['String']['output'];\n groups: Array<CustomerGroup>;\n history: HistoryEntryList;\n id: Scalars['ID']['output'];\n lastName: Scalars['String']['output'];\n orders: OrderList;\n phoneNumber?: Maybe<Scalars['String']['output']>;\n title?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n user?: Maybe<User>;\n};\n\n\nexport type CustomerHistoryArgs = {\n options?: InputMaybe<HistoryEntryListOptions>;\n};\n\n\nexport type CustomerOrdersArgs = {\n options?: InputMaybe<OrderListOptions>;\n};\n\nexport type CustomerFilterParameter = {\n _and?: InputMaybe<Array<CustomerFilterParameter>>;\n _or?: InputMaybe<Array<CustomerFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n emailAddress?: InputMaybe<StringOperators>;\n firstName?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n lastName?: InputMaybe<StringOperators>;\n phoneNumber?: InputMaybe<StringOperators>;\n postalCode?: InputMaybe<StringOperators>;\n title?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CustomerGroup = Node & {\n __typename?: 'CustomerGroup';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n customers: CustomerList;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\n\nexport type CustomerGroupCustomersArgs = {\n options?: InputMaybe<CustomerListOptions>;\n};\n\nexport type CustomerGroupFilterParameter = {\n _and?: InputMaybe<Array<CustomerGroupFilterParameter>>;\n _or?: InputMaybe<Array<CustomerGroupFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CustomerGroupList = PaginatedList & {\n __typename?: 'CustomerGroupList';\n items: Array<CustomerGroup>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CustomerGroupListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CustomerGroupFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CustomerGroupSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CustomerGroupSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type CustomerList = PaginatedList & {\n __typename?: 'CustomerList';\n items: Array<Customer>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CustomerListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CustomerFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CustomerSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CustomerSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n emailAddress?: InputMaybe<SortOrder>;\n firstName?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n lastName?: InputMaybe<SortOrder>;\n phoneNumber?: InputMaybe<SortOrder>;\n title?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\n/** Operators for filtering on a list of Date fields */\nexport type DateListOperators = {\n inList: Scalars['DateTime']['input'];\n};\n\n/** Operators for filtering on a DateTime field */\nexport type DateOperators = {\n after?: InputMaybe<Scalars['DateTime']['input']>;\n before?: InputMaybe<Scalars['DateTime']['input']>;\n between?: InputMaybe<DateRange>;\n eq?: InputMaybe<Scalars['DateTime']['input']>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type DateRange = {\n end: Scalars['DateTime']['input'];\n start: Scalars['DateTime']['input'];\n};\n\n/**\n * Expects the same validation formats as the `<input type=\"datetime-local\">` HTML element.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes\n */\nexport type DateTimeCustomFieldConfig = CustomField & {\n __typename?: 'DateTimeCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['String']['output']>;\n min?: Maybe<Scalars['String']['output']>;\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/**\n * Expects the same validation formats as the `<input type=\"datetime-local\">` HTML element.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes\n */\nexport type DateTimeStructFieldConfig = StructField & {\n __typename?: 'DateTimeStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['String']['output']>;\n min?: Maybe<Scalars['String']['output']>;\n name: Scalars['String']['output'];\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type DeleteAssetInput = {\n assetId: Scalars['ID']['input'];\n deleteFromAllChannels?: InputMaybe<Scalars['Boolean']['input']>;\n force?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type DeleteAssetsInput = {\n assetIds: Array<Scalars['ID']['input']>;\n deleteFromAllChannels?: InputMaybe<Scalars['Boolean']['input']>;\n force?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type DeleteStockLocationInput = {\n id: Scalars['ID']['input'];\n transferToLocationId?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type DeletionResponse = {\n __typename?: 'DeletionResponse';\n message?: Maybe<Scalars['String']['output']>;\n result: DeletionResult;\n};\n\nexport enum DeletionResult {\n /** The entity was successfully deleted */\n DELETED = 'DELETED',\n /** Deletion did not take place, reason given in message */\n NOT_DELETED = 'NOT_DELETED'\n}\n\nexport type Discount = {\n __typename?: 'Discount';\n adjustmentSource: Scalars['String']['output'];\n amount: Scalars['Money']['output'];\n amountWithTax: Scalars['Money']['output'];\n description: Scalars['String']['output'];\n type: AdjustmentType;\n};\n\nexport type DuplicateEntityError = ErrorResult & {\n __typename?: 'DuplicateEntityError';\n duplicationError: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type DuplicateEntityInput = {\n duplicatorInput: ConfigurableOperationInput;\n entityId: Scalars['ID']['input'];\n entityName: Scalars['String']['input'];\n};\n\nexport type DuplicateEntityResult = DuplicateEntityError | DuplicateEntitySuccess;\n\nexport type DuplicateEntitySuccess = {\n __typename?: 'DuplicateEntitySuccess';\n newEntityId: Scalars['ID']['output'];\n};\n\n/** Returned when attempting to create a Customer with an email address already registered to an existing User. */\nexport type EmailAddressConflictError = ErrorResult & {\n __typename?: 'EmailAddressConflictError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if no OrderLines have been specified for the operation */\nexport type EmptyOrderLineSelectionError = ErrorResult & {\n __typename?: 'EmptyOrderLineSelectionError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type EntityCustomFields = {\n __typename?: 'EntityCustomFields';\n customFields: Array<CustomFieldConfig>;\n entityName: Scalars['String']['output'];\n};\n\nexport type EntityDuplicatorDefinition = {\n __typename?: 'EntityDuplicatorDefinition';\n args: Array<ConfigArgDefinition>;\n code: Scalars['String']['output'];\n description: Scalars['String']['output'];\n forEntities: Array<Scalars['String']['output']>;\n requiresPermission: Array<Permission>;\n};\n\nexport enum ErrorCode {\n ALREADY_REFUNDED_ERROR = 'ALREADY_REFUNDED_ERROR',\n CANCEL_ACTIVE_ORDER_ERROR = 'CANCEL_ACTIVE_ORDER_ERROR',\n CANCEL_PAYMENT_ERROR = 'CANCEL_PAYMENT_ERROR',\n CHANNEL_DEFAULT_LANGUAGE_ERROR = 'CHANNEL_DEFAULT_LANGUAGE_ERROR',\n COUPON_CODE_EXPIRED_ERROR = 'COUPON_CODE_EXPIRED_ERROR',\n COUPON_CODE_INVALID_ERROR = 'COUPON_CODE_INVALID_ERROR',\n COUPON_CODE_LIMIT_ERROR = 'COUPON_CODE_LIMIT_ERROR',\n CREATE_FULFILLMENT_ERROR = 'CREATE_FULFILLMENT_ERROR',\n DUPLICATE_ENTITY_ERROR = 'DUPLICATE_ENTITY_ERROR',\n EMAIL_ADDRESS_CONFLICT_ERROR = 'EMAIL_ADDRESS_CONFLICT_ERROR',\n EMPTY_ORDER_LINE_SELECTION_ERROR = 'EMPTY_ORDER_LINE_SELECTION_ERROR',\n FACET_IN_USE_ERROR = 'FACET_IN_USE_ERROR',\n FULFILLMENT_STATE_TRANSITION_ERROR = 'FULFILLMENT_STATE_TRANSITION_ERROR',\n GUEST_CHECKOUT_ERROR = 'GUEST_CHECKOUT_ERROR',\n INELIGIBLE_SHIPPING_METHOD_ERROR = 'INELIGIBLE_SHIPPING_METHOD_ERROR',\n INSUFFICIENT_STOCK_ERROR = 'INSUFFICIENT_STOCK_ERROR',\n INSUFFICIENT_STOCK_ON_HAND_ERROR = 'INSUFFICIENT_STOCK_ON_HAND_ERROR',\n INVALID_CREDENTIALS_ERROR = 'INVALID_CREDENTIALS_ERROR',\n INVALID_FULFILLMENT_HANDLER_ERROR = 'INVALID_FULFILLMENT_HANDLER_ERROR',\n ITEMS_ALREADY_FULFILLED_ERROR = 'ITEMS_ALREADY_FULFILLED_ERROR',\n LANGUAGE_NOT_AVAILABLE_ERROR = 'LANGUAGE_NOT_AVAILABLE_ERROR',\n MANUAL_PAYMENT_STATE_ERROR = 'MANUAL_PAYMENT_STATE_ERROR',\n MIME_TYPE_ERROR = 'MIME_TYPE_ERROR',\n MISSING_CONDITIONS_ERROR = 'MISSING_CONDITIONS_ERROR',\n MULTIPLE_ORDER_ERROR = 'MULTIPLE_ORDER_ERROR',\n NATIVE_AUTH_STRATEGY_ERROR = 'NATIVE_AUTH_STRATEGY_ERROR',\n NEGATIVE_QUANTITY_ERROR = 'NEGATIVE_QUANTITY_ERROR',\n NOTHING_TO_REFUND_ERROR = 'NOTHING_TO_REFUND_ERROR',\n NO_ACTIVE_ORDER_ERROR = 'NO_ACTIVE_ORDER_ERROR',\n NO_CHANGES_SPECIFIED_ERROR = 'NO_CHANGES_SPECIFIED_ERROR',\n ORDER_INTERCEPTOR_ERROR = 'ORDER_INTERCEPTOR_ERROR',\n ORDER_LIMIT_ERROR = 'ORDER_LIMIT_ERROR',\n ORDER_MODIFICATION_ERROR = 'ORDER_MODIFICATION_ERROR',\n ORDER_MODIFICATION_STATE_ERROR = 'ORDER_MODIFICATION_STATE_ERROR',\n ORDER_STATE_TRANSITION_ERROR = 'ORDER_STATE_TRANSITION_ERROR',\n PAYMENT_METHOD_MISSING_ERROR = 'PAYMENT_METHOD_MISSING_ERROR',\n PAYMENT_ORDER_MISMATCH_ERROR = 'PAYMENT_ORDER_MISMATCH_ERROR',\n PAYMENT_STATE_TRANSITION_ERROR = 'PAYMENT_STATE_TRANSITION_ERROR',\n PRODUCT_OPTION_IN_USE_ERROR = 'PRODUCT_OPTION_IN_USE_ERROR',\n QUANTITY_TOO_GREAT_ERROR = 'QUANTITY_TOO_GREAT_ERROR',\n REFUND_AMOUNT_ERROR = 'REFUND_AMOUNT_ERROR',\n REFUND_ORDER_STATE_ERROR = 'REFUND_ORDER_STATE_ERROR',\n REFUND_PAYMENT_ID_MISSING_ERROR = 'REFUND_PAYMENT_ID_MISSING_ERROR',\n REFUND_STATE_TRANSITION_ERROR = 'REFUND_STATE_TRANSITION_ERROR',\n SETTLE_PAYMENT_ERROR = 'SETTLE_PAYMENT_ERROR',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR'\n}\n\nexport type ErrorResult = {\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Facet = Node & {\n __typename?: 'Facet';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n isPrivate: Scalars['Boolean']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<FacetTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n /** Returns a paginated, sortable, filterable list of the Facet's values. Added in v2.1.0. */\n valueList: FacetValueList;\n values: Array<FacetValue>;\n};\n\n\nexport type FacetValueListArgs = {\n options?: InputMaybe<FacetValueListOptions>;\n};\n\nexport type FacetFilterParameter = {\n _and?: InputMaybe<Array<FacetFilterParameter>>;\n _or?: InputMaybe<Array<FacetFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n isPrivate?: InputMaybe<BooleanOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type FacetInUseError = ErrorResult & {\n __typename?: 'FacetInUseError';\n errorCode: ErrorCode;\n facetCode: Scalars['String']['output'];\n message: Scalars['String']['output'];\n productCount: Scalars['Int']['output'];\n variantCount: Scalars['Int']['output'];\n};\n\nexport type FacetList = PaginatedList & {\n __typename?: 'FacetList';\n items: Array<Facet>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type FacetListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<FacetFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<FacetSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type FacetSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type FacetTranslation = {\n __typename?: 'FacetTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type FacetTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type FacetValue = Node & {\n __typename?: 'FacetValue';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n facet: Facet;\n facetId: Scalars['ID']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<FacetValueTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/**\n * Used to construct boolean expressions for filtering search results\n * by FacetValue ID. Examples:\n *\n * * ID=1 OR ID=2: `{ facetValueFilters: [{ or: [1,2] }] }`\n * * ID=1 AND ID=2: `{ facetValueFilters: [{ and: 1 }, { and: 2 }] }`\n * * ID=1 AND (ID=2 OR ID=3): `{ facetValueFilters: [{ and: 1 }, { or: [2,3] }] }`\n */\nexport type FacetValueFilterInput = {\n and?: InputMaybe<Scalars['ID']['input']>;\n or?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type FacetValueFilterParameter = {\n _and?: InputMaybe<Array<FacetValueFilterParameter>>;\n _or?: InputMaybe<Array<FacetValueFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n facetId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type FacetValueList = PaginatedList & {\n __typename?: 'FacetValueList';\n items: Array<FacetValue>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type FacetValueListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<FacetValueFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<FacetValueSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * Which FacetValues are present in the products returned\n * by the search, and in what quantity.\n */\nexport type FacetValueResult = {\n __typename?: 'FacetValueResult';\n count: Scalars['Int']['output'];\n facetValue: FacetValue;\n};\n\nexport type FacetValueSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n facetId?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type FacetValueTranslation = {\n __typename?: 'FacetValueTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type FacetValueTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type FloatCustomFieldConfig = CustomField & {\n __typename?: 'FloatCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Float']['output']>;\n min?: Maybe<Scalars['Float']['output']>;\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n step?: Maybe<Scalars['Float']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type FloatStructFieldConfig = StructField & {\n __typename?: 'FloatStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Float']['output']>;\n min?: Maybe<Scalars['Float']['output']>;\n name: Scalars['String']['output'];\n step?: Maybe<Scalars['Float']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type FulfillOrderInput = {\n handler: ConfigurableOperationInput;\n lines: Array<OrderLineInput>;\n};\n\nexport type Fulfillment = Node & {\n __typename?: 'Fulfillment';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n lines: Array<FulfillmentLine>;\n method: Scalars['String']['output'];\n nextStates: Array<Scalars['String']['output']>;\n state: Scalars['String']['output'];\n /** @deprecated Use the `lines` field instead */\n summary: Array<FulfillmentLine>;\n trackingCode?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type FulfillmentLine = {\n __typename?: 'FulfillmentLine';\n fulfillment: Fulfillment;\n fulfillmentId: Scalars['ID']['output'];\n orderLine: OrderLine;\n orderLineId: Scalars['ID']['output'];\n quantity: Scalars['Int']['output'];\n};\n\n/** Returned when there is an error in transitioning the Fulfillment state */\nexport type FulfillmentStateTransitionError = ErrorResult & {\n __typename?: 'FulfillmentStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\nexport enum GlobalFlag {\n FALSE = 'FALSE',\n INHERIT = 'INHERIT',\n TRUE = 'TRUE'\n}\n\nexport type GlobalSettings = {\n __typename?: 'GlobalSettings';\n availableLanguages: Array<LanguageCode>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n outOfStockThreshold: Scalars['Int']['output'];\n serverConfig: ServerConfig;\n trackInventory: Scalars['Boolean']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned when attempting to set the Customer on a guest checkout when the configured GuestCheckoutStrategy does not allow it. */\nexport type GuestCheckoutError = ErrorResult & {\n __typename?: 'GuestCheckoutError';\n errorCode: ErrorCode;\n errorDetail: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type HistoryEntry = Node & {\n __typename?: 'HistoryEntry';\n administrator?: Maybe<Administrator>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n data: Scalars['JSON']['output'];\n id: Scalars['ID']['output'];\n isPublic: Scalars['Boolean']['output'];\n type: HistoryEntryType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type HistoryEntryFilterParameter = {\n _and?: InputMaybe<Array<HistoryEntryFilterParameter>>;\n _or?: InputMaybe<Array<HistoryEntryFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n isPublic?: InputMaybe<BooleanOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type HistoryEntryList = PaginatedList & {\n __typename?: 'HistoryEntryList';\n items: Array<HistoryEntry>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type HistoryEntryListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<HistoryEntryFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<HistoryEntrySortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type HistoryEntrySortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport enum HistoryEntryType {\n CUSTOMER_ADDED_TO_GROUP = 'CUSTOMER_ADDED_TO_GROUP',\n CUSTOMER_ADDRESS_CREATED = 'CUSTOMER_ADDRESS_CREATED',\n CUSTOMER_ADDRESS_DELETED = 'CUSTOMER_ADDRESS_DELETED',\n CUSTOMER_ADDRESS_UPDATED = 'CUSTOMER_ADDRESS_UPDATED',\n CUSTOMER_DETAIL_UPDATED = 'CUSTOMER_DETAIL_UPDATED',\n CUSTOMER_EMAIL_UPDATE_REQUESTED = 'CUSTOMER_EMAIL_UPDATE_REQUESTED',\n CUSTOMER_EMAIL_UPDATE_VERIFIED = 'CUSTOMER_EMAIL_UPDATE_VERIFIED',\n CUSTOMER_NOTE = 'CUSTOMER_NOTE',\n CUSTOMER_PASSWORD_RESET_REQUESTED = 'CUSTOMER_PASSWORD_RESET_REQUESTED',\n CUSTOMER_PASSWORD_RESET_VERIFIED = 'CUSTOMER_PASSWORD_RESET_VERIFIED',\n CUSTOMER_PASSWORD_UPDATED = 'CUSTOMER_PASSWORD_UPDATED',\n CUSTOMER_REGISTERED = 'CUSTOMER_REGISTERED',\n CUSTOMER_REMOVED_FROM_GROUP = 'CUSTOMER_REMOVED_FROM_GROUP',\n CUSTOMER_VERIFIED = 'CUSTOMER_VERIFIED',\n ORDER_CANCELLATION = 'ORDER_CANCELLATION',\n ORDER_COUPON_APPLIED = 'ORDER_COUPON_APPLIED',\n ORDER_COUPON_REMOVED = 'ORDER_COUPON_REMOVED',\n ORDER_CUSTOMER_UPDATED = 'ORDER_CUSTOMER_UPDATED',\n ORDER_FULFILLMENT = 'ORDER_FULFILLMENT',\n ORDER_FULFILLMENT_TRANSITION = 'ORDER_FULFILLMENT_TRANSITION',\n ORDER_MODIFIED = 'ORDER_MODIFIED',\n ORDER_NOTE = 'ORDER_NOTE',\n ORDER_PAYMENT_TRANSITION = 'ORDER_PAYMENT_TRANSITION',\n ORDER_REFUND_TRANSITION = 'ORDER_REFUND_TRANSITION',\n ORDER_STATE_TRANSITION = 'ORDER_STATE_TRANSITION'\n}\n\n/** Operators for filtering on a list of ID fields */\nexport type IdListOperators = {\n inList: Scalars['ID']['input'];\n};\n\n/** Operators for filtering on an ID field */\nexport type IdOperators = {\n eq?: InputMaybe<Scalars['String']['input']>;\n in?: InputMaybe<Array<Scalars['String']['input']>>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n notEq?: InputMaybe<Scalars['String']['input']>;\n notIn?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type ImportInfo = {\n __typename?: 'ImportInfo';\n errors?: Maybe<Array<Scalars['String']['output']>>;\n imported: Scalars['Int']['output'];\n processed: Scalars['Int']['output'];\n};\n\n/** Returned when attempting to set a ShippingMethod for which the Order is not eligible */\nexport type IneligibleShippingMethodError = ErrorResult & {\n __typename?: 'IneligibleShippingMethodError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when attempting to add more items to the Order than are available */\nexport type InsufficientStockError = ErrorResult & {\n __typename?: 'InsufficientStockError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n order: Order;\n quantityAvailable: Scalars['Int']['output'];\n};\n\n/**\n * Returned if attempting to create a Fulfillment when there is insufficient\n * stockOnHand of a ProductVariant to satisfy the requested quantity.\n */\nexport type InsufficientStockOnHandError = ErrorResult & {\n __typename?: 'InsufficientStockOnHandError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n productVariantId: Scalars['ID']['output'];\n productVariantName: Scalars['String']['output'];\n stockOnHand: Scalars['Int']['output'];\n};\n\nexport type IntCustomFieldConfig = CustomField & {\n __typename?: 'IntCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Int']['output']>;\n min?: Maybe<Scalars['Int']['output']>;\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type IntStructFieldConfig = StructField & {\n __typename?: 'IntStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Int']['output']>;\n min?: Maybe<Scalars['Int']['output']>;\n name: Scalars['String']['output'];\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/** Returned if the user authentication credentials are not valid */\nexport type InvalidCredentialsError = ErrorResult & {\n __typename?: 'InvalidCredentialsError';\n authenticationError: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the specified FulfillmentHandler code is not valid */\nexport type InvalidFulfillmentHandlerError = ErrorResult & {\n __typename?: 'InvalidFulfillmentHandlerError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the specified items are already part of a Fulfillment */\nexport type ItemsAlreadyFulfilledError = ErrorResult & {\n __typename?: 'ItemsAlreadyFulfilledError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Job = Node & {\n __typename?: 'Job';\n attempts: Scalars['Int']['output'];\n createdAt: Scalars['DateTime']['output'];\n data?: Maybe<Scalars['JSON']['output']>;\n duration: Scalars['Int']['output'];\n error?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n isSettled: Scalars['Boolean']['output'];\n progress: Scalars['Float']['output'];\n queueName: Scalars['String']['output'];\n result?: Maybe<Scalars['JSON']['output']>;\n retries: Scalars['Int']['output'];\n settledAt?: Maybe<Scalars['DateTime']['output']>;\n startedAt?: Maybe<Scalars['DateTime']['output']>;\n state: JobState;\n};\n\nexport type JobBufferSize = {\n __typename?: 'JobBufferSize';\n bufferId: Scalars['String']['output'];\n size: Scalars['Int']['output'];\n};\n\nexport type JobFilterParameter = {\n _and?: InputMaybe<Array<JobFilterParameter>>;\n _or?: InputMaybe<Array<JobFilterParameter>>;\n attempts?: InputMaybe<NumberOperators>;\n createdAt?: InputMaybe<DateOperators>;\n duration?: InputMaybe<NumberOperators>;\n id?: InputMaybe<IdOperators>;\n isSettled?: InputMaybe<BooleanOperators>;\n progress?: InputMaybe<NumberOperators>;\n queueName?: InputMaybe<StringOperators>;\n retries?: InputMaybe<NumberOperators>;\n settledAt?: InputMaybe<DateOperators>;\n startedAt?: InputMaybe<DateOperators>;\n state?: InputMaybe<StringOperators>;\n};\n\nexport type JobList = PaginatedList & {\n __typename?: 'JobList';\n items: Array<Job>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type JobListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<JobFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<JobSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type JobQueue = {\n __typename?: 'JobQueue';\n name: Scalars['String']['output'];\n running: Scalars['Boolean']['output'];\n};\n\nexport type JobSortParameter = {\n attempts?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n duration?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n progress?: InputMaybe<SortOrder>;\n queueName?: InputMaybe<SortOrder>;\n retries?: InputMaybe<SortOrder>;\n settledAt?: InputMaybe<SortOrder>;\n startedAt?: InputMaybe<SortOrder>;\n};\n\n/**\n * @description\n * The state of a Job in the JobQueue\n *\n * @docsCategory common\n */\nexport enum JobState {\n CANCELLED = 'CANCELLED',\n COMPLETED = 'COMPLETED',\n FAILED = 'FAILED',\n PENDING = 'PENDING',\n RETRYING = 'RETRYING',\n RUNNING = 'RUNNING'\n}\n\n/**\n * @description\n * Languages in the form of a ISO 639-1 language code with optional\n * region or script modifier (e.g. de_AT). The selection available is based\n * on the [Unicode CLDR summary list](https://unicode-org.github.io/cldr-staging/charts/37/summary/root.html)\n * and includes the major spoken languages of the world and any widely-used variants.\n *\n * @docsCategory common\n */\nexport enum LanguageCode {\n /** Afrikaans */\n af = 'af',\n /** Akan */\n ak = 'ak',\n /** Amharic */\n am = 'am',\n /** Arabic */\n ar = 'ar',\n /** Assamese */\n as = 'as',\n /** Azerbaijani */\n az = 'az',\n /** Belarusian */\n be = 'be',\n /** Bulgarian */\n bg = 'bg',\n /** Bambara */\n bm = 'bm',\n /** Bangla */\n bn = 'bn',\n /** Tibetan */\n bo = 'bo',\n /** Breton */\n br = 'br',\n /** Bosnian */\n bs = 'bs',\n /** Catalan */\n ca = 'ca',\n /** Chechen */\n ce = 'ce',\n /** Corsican */\n co = 'co',\n /** Czech */\n cs = 'cs',\n /** Church Slavic */\n cu = 'cu',\n /** Welsh */\n cy = 'cy',\n /** Danish */\n da = 'da',\n /** German */\n de = 'de',\n /** Austrian German */\n de_AT = 'de_AT',\n /** Swiss High German */\n de_CH = 'de_CH',\n /** Dzongkha */\n dz = 'dz',\n /** Ewe */\n ee = 'ee',\n /** Greek */\n el = 'el',\n /** English */\n en = 'en',\n /** Australian English */\n en_AU = 'en_AU',\n /** Canadian English */\n en_CA = 'en_CA',\n /** British English */\n en_GB = 'en_GB',\n /** American English */\n en_US = 'en_US',\n /** Esperanto */\n eo = 'eo',\n /** Spanish */\n es = 'es',\n /** European Spanish */\n es_ES = 'es_ES',\n /** Mexican Spanish */\n es_MX = 'es_MX',\n /** Estonian */\n et = 'et',\n /** Basque */\n eu = 'eu',\n /** Persian */\n fa = 'fa',\n /** Dari */\n fa_AF = 'fa_AF',\n /** Fulah */\n ff = 'ff',\n /** Finnish */\n fi = 'fi',\n /** Faroese */\n fo = 'fo',\n /** French */\n fr = 'fr',\n /** Canadian French */\n fr_CA = 'fr_CA',\n /** Swiss French */\n fr_CH = 'fr_CH',\n /** Western Frisian */\n fy = 'fy',\n /** Irish */\n ga = 'ga',\n /** Scottish Gaelic */\n gd = 'gd',\n /** Galician */\n gl = 'gl',\n /** Gujarati */\n gu = 'gu',\n /** Manx */\n gv = 'gv',\n /** Hausa */\n ha = 'ha',\n /** Hebrew */\n he = 'he',\n /** Hindi */\n hi = 'hi',\n /** Croatian */\n hr = 'hr',\n /** Haitian Creole */\n ht = 'ht',\n /** Hungarian */\n hu = 'hu',\n /** Armenian */\n hy = 'hy',\n /** Interlingua */\n ia = 'ia',\n /** Indonesian */\n id = 'id',\n /** Igbo */\n ig = 'ig',\n /** Sichuan Yi */\n ii = 'ii',\n /** Icelandic */\n is = 'is',\n /** Italian */\n it = 'it',\n /** Japanese */\n ja = 'ja',\n /** Javanese */\n jv = 'jv',\n /** Georgian */\n ka = 'ka',\n /** Kikuyu */\n ki = 'ki',\n /** Kazakh */\n kk = 'kk',\n /** Kalaallisut */\n kl = 'kl',\n /** Khmer */\n km = 'km',\n /** Kannada */\n kn = 'kn',\n /** Korean */\n ko = 'ko',\n /** Kashmiri */\n ks = 'ks',\n /** Kurdish */\n ku = 'ku',\n /** Cornish */\n kw = 'kw',\n /** Kyrgyz */\n ky = 'ky',\n /** Latin */\n la = 'la',\n /** Luxembourgish */\n lb = 'lb',\n /** Ganda */\n lg = 'lg',\n /** Lingala */\n ln = 'ln',\n /** Lao */\n lo = 'lo',\n /** Lithuanian */\n lt = 'lt',\n /** Luba-Katanga */\n lu = 'lu',\n /** Latvian */\n lv = 'lv',\n /** Malagasy */\n mg = 'mg',\n /** Maori */\n mi = 'mi',\n /** Macedonian */\n mk = 'mk',\n /** Malayalam */\n ml = 'ml',\n /** Mongolian */\n mn = 'mn',\n /** Marathi */\n mr = 'mr',\n /** Malay */\n ms = 'ms',\n /** Maltese */\n mt = 'mt',\n /** Burmese */\n my = 'my',\n /** Norwegian Bokm\u00E5l */\n nb = 'nb',\n /** North Ndebele */\n nd = 'nd',\n /** Nepali */\n ne = 'ne',\n /** Dutch */\n nl = 'nl',\n /** Flemish */\n nl_BE = 'nl_BE',\n /** Norwegian Nynorsk */\n nn = 'nn',\n /** Nyanja */\n ny = 'ny',\n /** Oromo */\n om = 'om',\n /** Odia */\n or = 'or',\n /** Ossetic */\n os = 'os',\n /** Punjabi */\n pa = 'pa',\n /** Polish */\n pl = 'pl',\n /** Pashto */\n ps = 'ps',\n /** Portuguese */\n pt = 'pt',\n /** Brazilian Portuguese */\n pt_BR = 'pt_BR',\n /** European Portuguese */\n pt_PT = 'pt_PT',\n /** Quechua */\n qu = 'qu',\n /** Romansh */\n rm = 'rm',\n /** Rundi */\n rn = 'rn',\n /** Romanian */\n ro = 'ro',\n /** Moldavian */\n ro_MD = 'ro_MD',\n /** Russian */\n ru = 'ru',\n /** Kinyarwanda */\n rw = 'rw',\n /** Sanskrit */\n sa = 'sa',\n /** Sindhi */\n sd = 'sd',\n /** Northern Sami */\n se = 'se',\n /** Sango */\n sg = 'sg',\n /** Sinhala */\n si = 'si',\n /** Slovak */\n sk = 'sk',\n /** Slovenian */\n sl = 'sl',\n /** Samoan */\n sm = 'sm',\n /** Shona */\n sn = 'sn',\n /** Somali */\n so = 'so',\n /** Albanian */\n sq = 'sq',\n /** Serbian */\n sr = 'sr',\n /** Southern Sotho */\n st = 'st',\n /** Sundanese */\n su = 'su',\n /** Swedish */\n sv = 'sv',\n /** Swahili */\n sw = 'sw',\n /** Congo Swahili */\n sw_CD = 'sw_CD',\n /** Tamil */\n ta = 'ta',\n /** Telugu */\n te = 'te',\n /** Tajik */\n tg = 'tg',\n /** Thai */\n th = 'th',\n /** Tigrinya */\n ti = 'ti',\n /** Turkmen */\n tk = 'tk',\n /** Tongan */\n to = 'to',\n /** Turkish */\n tr = 'tr',\n /** Tatar */\n tt = 'tt',\n /** Uyghur */\n ug = 'ug',\n /** Ukrainian */\n uk = 'uk',\n /** Urdu */\n ur = 'ur',\n /** Uzbek */\n uz = 'uz',\n /** Vietnamese */\n vi = 'vi',\n /** Volap\u00FCk */\n vo = 'vo',\n /** Wolof */\n wo = 'wo',\n /** Xhosa */\n xh = 'xh',\n /** Yiddish */\n yi = 'yi',\n /** Yoruba */\n yo = 'yo',\n /** Chinese */\n zh = 'zh',\n /** Simplified Chinese */\n zh_Hans = 'zh_Hans',\n /** Traditional Chinese */\n zh_Hant = 'zh_Hant',\n /** Zulu */\n zu = 'zu'\n}\n\n/** Returned if attempting to set a Channel's defaultLanguageCode to a language which is not enabled in GlobalSettings */\nexport type LanguageNotAvailableError = ErrorResult & {\n __typename?: 'LanguageNotAvailableError';\n errorCode: ErrorCode;\n languageCode: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type LocaleStringCustomFieldConfig = CustomField & {\n __typename?: 'LocaleStringCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n length?: Maybe<Scalars['Int']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n pattern?: Maybe<Scalars['String']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type LocaleTextCustomFieldConfig = CustomField & {\n __typename?: 'LocaleTextCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type LocalizedString = {\n __typename?: 'LocalizedString';\n languageCode: LanguageCode;\n value: Scalars['String']['output'];\n};\n\nexport enum LogicalOperator {\n AND = 'AND',\n OR = 'OR'\n}\n\nexport type ManualPaymentInput = {\n metadata?: InputMaybe<Scalars['JSON']['input']>;\n method: Scalars['String']['input'];\n orderId: Scalars['ID']['input'];\n transactionId?: InputMaybe<Scalars['String']['input']>;\n};\n\n/**\n * Returned when a call to addManualPaymentToOrder is made but the Order\n * is not in the required state.\n */\nexport type ManualPaymentStateError = ErrorResult & {\n __typename?: 'ManualPaymentStateError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport enum MetricInterval {\n Daily = 'Daily'\n}\n\nexport type MetricSummary = {\n __typename?: 'MetricSummary';\n entries: Array<MetricSummaryEntry>;\n interval: MetricInterval;\n title: Scalars['String']['output'];\n type: MetricType;\n};\n\nexport type MetricSummaryEntry = {\n __typename?: 'MetricSummaryEntry';\n label: Scalars['String']['output'];\n value: Scalars['Float']['output'];\n};\n\nexport type MetricSummaryInput = {\n interval: MetricInterval;\n refresh?: InputMaybe<Scalars['Boolean']['input']>;\n types: Array<MetricType>;\n};\n\nexport enum MetricType {\n AverageOrderValue = 'AverageOrderValue',\n OrderCount = 'OrderCount',\n OrderTotal = 'OrderTotal'\n}\n\nexport type MimeTypeError = ErrorResult & {\n __typename?: 'MimeTypeError';\n errorCode: ErrorCode;\n fileName: Scalars['String']['output'];\n message: Scalars['String']['output'];\n mimeType: Scalars['String']['output'];\n};\n\n/** Returned if a PromotionCondition has neither a couponCode nor any conditions set */\nexport type MissingConditionsError = ErrorResult & {\n __typename?: 'MissingConditionsError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type ModifyOrderInput = {\n addItems?: InputMaybe<Array<AddItemInput>>;\n adjustOrderLines?: InputMaybe<Array<OrderLineInput>>;\n couponCodes?: InputMaybe<Array<Scalars['String']['input']>>;\n dryRun: Scalars['Boolean']['input'];\n note?: InputMaybe<Scalars['String']['input']>;\n options?: InputMaybe<ModifyOrderOptions>;\n orderId: Scalars['ID']['input'];\n /**\n * Deprecated in v2.2.0. Use `refunds` instead to allow multiple refunds to be\n * applied in the case that multiple payment methods have been used on the order.\n */\n refund?: InputMaybe<AdministratorRefundInput>;\n refunds?: InputMaybe<Array<AdministratorRefundInput>>;\n /** Added in v2.2 */\n shippingMethodIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n surcharges?: InputMaybe<Array<SurchargeInput>>;\n updateBillingAddress?: InputMaybe<UpdateOrderAddressInput>;\n updateShippingAddress?: InputMaybe<UpdateOrderAddressInput>;\n};\n\nexport type ModifyOrderOptions = {\n freezePromotions?: InputMaybe<Scalars['Boolean']['input']>;\n recalculateShipping?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type ModifyOrderResult = CouponCodeExpiredError | CouponCodeInvalidError | CouponCodeLimitError | IneligibleShippingMethodError | InsufficientStockError | NegativeQuantityError | NoChangesSpecifiedError | Order | OrderLimitError | OrderModificationStateError | PaymentMethodMissingError | RefundPaymentIdMissingError;\n\nexport type MoveCollectionInput = {\n collectionId: Scalars['ID']['input'];\n index: Scalars['Int']['input'];\n parentId: Scalars['ID']['input'];\n};\n\n/** Returned if an operation has specified OrderLines from multiple Orders */\nexport type MultipleOrderError = ErrorResult & {\n __typename?: 'MultipleOrderError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Mutation = {\n __typename?: 'Mutation';\n /** Add Customers to a CustomerGroup */\n addCustomersToGroup: CustomerGroup;\n addFulfillmentToOrder: AddFulfillmentToOrderResult;\n /** Adds an item to the draft Order. */\n addItemToDraftOrder: UpdateOrderItemsResult;\n /**\n * Used to manually create a new Payment against an Order.\n * This can be used by an Administrator when an Order is in the ArrangingPayment state.\n *\n * It is also used when a completed Order\n * has been modified (using `modifyOrder`) and the price has increased. The extra payment\n * can then be manually arranged by the administrator, and the details used to create a new\n * Payment.\n */\n addManualPaymentToOrder: AddManualPaymentToOrderResult;\n /** Add members to a Zone */\n addMembersToZone: Zone;\n addNoteToCustomer: Customer;\n addNoteToOrder: Order;\n /** Add an OptionGroup to a Product */\n addOptionGroupToProduct: Product;\n /** Adjusts a draft OrderLine. If custom fields are defined on the OrderLine entity, a third argument 'customFields' of type `OrderLineCustomFieldsInput` will be available. */\n adjustDraftOrderLine: UpdateOrderItemsResult;\n /** Applies the given coupon code to the draft Order */\n applyCouponCodeToDraftOrder: ApplyCouponCodeResult;\n /** Assign assets to channel */\n assignAssetsToChannel: Array<Asset>;\n /** Assigns Collections to the specified Channel */\n assignCollectionsToChannel: Array<Collection>;\n /** Assigns Facets to the specified Channel */\n assignFacetsToChannel: Array<Facet>;\n /** Assigns PaymentMethods to the specified Channel */\n assignPaymentMethodsToChannel: Array<PaymentMethod>;\n /** Assigns ProductVariants to the specified Channel */\n assignProductVariantsToChannel: Array<ProductVariant>;\n /** Assigns all ProductVariants of Product to the specified Channel */\n assignProductsToChannel: Array<Product>;\n /** Assigns Promotions to the specified Channel */\n assignPromotionsToChannel: Array<Promotion>;\n /** Assign a Role to an Administrator */\n assignRoleToAdministrator: Administrator;\n /** Assigns ShippingMethods to the specified Channel */\n assignShippingMethodsToChannel: Array<ShippingMethod>;\n /** Assigns StockLocations to the specified Channel */\n assignStockLocationsToChannel: Array<StockLocation>;\n /** Authenticates the user using a named authentication strategy */\n authenticate: AuthenticationResult;\n cancelJob: Job;\n cancelOrder: CancelOrderResult;\n cancelPayment: CancelPaymentResult;\n /** Create a new Administrator */\n createAdministrator: Administrator;\n /** Create a new Asset */\n createAssets: Array<CreateAssetResult>;\n /** Create a new Channel */\n createChannel: CreateChannelResult;\n /** Create a new Collection */\n createCollection: Collection;\n /** Create a new Country */\n createCountry: Country;\n /** Create a new Customer. If a password is provided, a new User will also be created an linked to the Customer. */\n createCustomer: CreateCustomerResult;\n /** Create a new Address and associate it with the Customer specified by customerId */\n createCustomerAddress: Address;\n /** Create a new CustomerGroup */\n createCustomerGroup: CustomerGroup;\n /** Creates a draft Order */\n createDraftOrder: Order;\n /** Create a new Facet */\n createFacet: Facet;\n /** Create a single FacetValue */\n createFacetValue: FacetValue;\n /** Create one or more FacetValues */\n createFacetValues: Array<FacetValue>;\n /** Create existing PaymentMethod */\n createPaymentMethod: PaymentMethod;\n /** Create a new Product */\n createProduct: Product;\n /** Create a new ProductOption within a ProductOptionGroup */\n createProductOption: ProductOption;\n /** Create a new ProductOptionGroup */\n createProductOptionGroup: ProductOptionGroup;\n /** Create a set of ProductVariants based on the OptionGroups assigned to the given Product */\n createProductVariants: Array<Maybe<ProductVariant>>;\n createPromotion: CreatePromotionResult;\n /** Create a new Province */\n createProvince: Province;\n /** Create a new Role */\n createRole: Role;\n /** Create a new Seller */\n createSeller: Seller;\n /** Create a new ShippingMethod */\n createShippingMethod: ShippingMethod;\n createStockLocation: StockLocation;\n /** Create a new Tag */\n createTag: Tag;\n /** Create a new TaxCategory */\n createTaxCategory: TaxCategory;\n /** Create a new TaxRate */\n createTaxRate: TaxRate;\n /** Create a new Zone */\n createZone: Zone;\n /** Delete an Administrator */\n deleteAdministrator: DeletionResponse;\n /** Delete multiple Administrators */\n deleteAdministrators: Array<DeletionResponse>;\n /** Delete an Asset */\n deleteAsset: DeletionResponse;\n /** Delete multiple Assets */\n deleteAssets: DeletionResponse;\n /** Delete a Channel */\n deleteChannel: DeletionResponse;\n /** Delete multiple Channels */\n deleteChannels: Array<DeletionResponse>;\n /** Delete a Collection and all of its descendants */\n deleteCollection: DeletionResponse;\n /** Delete multiple Collections and all of their descendants */\n deleteCollections: Array<DeletionResponse>;\n /** Delete multiple Countries */\n deleteCountries: Array<DeletionResponse>;\n /** Delete a Country */\n deleteCountry: DeletionResponse;\n /** Delete a Customer */\n deleteCustomer: DeletionResponse;\n /** Update an existing Address */\n deleteCustomerAddress: Success;\n /** Delete a CustomerGroup */\n deleteCustomerGroup: DeletionResponse;\n /** Delete multiple CustomerGroups */\n deleteCustomerGroups: Array<DeletionResponse>;\n deleteCustomerNote: DeletionResponse;\n /** Deletes Customers */\n deleteCustomers: Array<DeletionResponse>;\n /** Deletes a draft Order */\n deleteDraftOrder: DeletionResponse;\n /** Delete an existing Facet */\n deleteFacet: DeletionResponse;\n /** Delete one or more FacetValues */\n deleteFacetValues: Array<DeletionResponse>;\n /** Delete multiple existing Facets */\n deleteFacets: Array<DeletionResponse>;\n deleteOrderNote: DeletionResponse;\n /** Delete a PaymentMethod */\n deletePaymentMethod: DeletionResponse;\n /** Delete multiple PaymentMethods */\n deletePaymentMethods: Array<DeletionResponse>;\n /** Delete a Product */\n deleteProduct: DeletionResponse;\n /** Delete a ProductOption */\n deleteProductOption: DeletionResponse;\n /** Delete a ProductVariant */\n deleteProductVariant: DeletionResponse;\n /** Delete multiple ProductVariants */\n deleteProductVariants: Array<DeletionResponse>;\n /** Delete multiple Products */\n deleteProducts: Array<DeletionResponse>;\n deletePromotion: DeletionResponse;\n deletePromotions: Array<DeletionResponse>;\n /** Delete a Province */\n deleteProvince: DeletionResponse;\n /** Delete an existing Role */\n deleteRole: DeletionResponse;\n /** Delete multiple Roles */\n deleteRoles: Array<DeletionResponse>;\n /** Delete a Seller */\n deleteSeller: DeletionResponse;\n /** Delete multiple Sellers */\n deleteSellers: Array<DeletionResponse>;\n /** Delete a ShippingMethod */\n deleteShippingMethod: DeletionResponse;\n /** Delete multiple ShippingMethods */\n deleteShippingMethods: Array<DeletionResponse>;\n deleteStockLocation: DeletionResponse;\n deleteStockLocations: Array<DeletionResponse>;\n /** Delete an existing Tag */\n deleteTag: DeletionResponse;\n /** Deletes multiple TaxCategories */\n deleteTaxCategories: Array<DeletionResponse>;\n /** Deletes a TaxCategory */\n deleteTaxCategory: DeletionResponse;\n /** Delete a TaxRate */\n deleteTaxRate: DeletionResponse;\n /** Delete multiple TaxRates */\n deleteTaxRates: Array<DeletionResponse>;\n /** Delete a Zone */\n deleteZone: DeletionResponse;\n /** Delete a Zone */\n deleteZones: Array<DeletionResponse>;\n /**\n * Duplicate an existing entity using a specific EntityDuplicator.\n * Since v2.2.0.\n */\n duplicateEntity: DuplicateEntityResult;\n flushBufferedJobs: Success;\n importProducts?: Maybe<ImportInfo>;\n /**\n * Authenticates the user using the native authentication strategy. This mutation is an alias for authenticate({ native: { ... }})\n *\n * The `rememberMe` option applies when using cookie-based sessions, and if `true` it will set the maxAge of the session cookie\n * to 1 year.\n */\n login: NativeAuthenticationResult;\n logout: Success;\n /**\n * Allows an Order to be modified after it has been completed by the Customer. The Order must first\n * be in the `Modifying` state.\n */\n modifyOrder: ModifyOrderResult;\n /** Move a Collection to a different parent or index */\n moveCollection: Collection;\n refundOrder: RefundOrderResult;\n reindex: Job;\n /** Removes Collections from the specified Channel */\n removeCollectionsFromChannel: Array<Collection>;\n /** Removes the given coupon code from the draft Order */\n removeCouponCodeFromDraftOrder?: Maybe<Order>;\n /** Remove Customers from a CustomerGroup */\n removeCustomersFromGroup: CustomerGroup;\n /** Remove an OrderLine from the draft Order */\n removeDraftOrderLine: RemoveOrderItemsResult;\n /** Removes Facets from the specified Channel */\n removeFacetsFromChannel: Array<RemoveFacetFromChannelResult>;\n /** Remove members from a Zone */\n removeMembersFromZone: Zone;\n /**\n * Remove an OptionGroup from a Product. If the OptionGroup is in use by any ProductVariants\n * the mutation will return a ProductOptionInUseError, and the OptionGroup will not be removed.\n * Setting the `force` argument to `true` will override this and remove the OptionGroup anyway,\n * as well as removing any of the group's options from the Product's ProductVariants.\n */\n removeOptionGroupFromProduct: RemoveOptionGroupFromProductResult;\n /** Removes PaymentMethods from the specified Channel */\n removePaymentMethodsFromChannel: Array<PaymentMethod>;\n /** Removes ProductVariants from the specified Channel */\n removeProductVariantsFromChannel: Array<ProductVariant>;\n /** Removes all ProductVariants of Product from the specified Channel */\n removeProductsFromChannel: Array<Product>;\n /** Removes Promotions from the specified Channel */\n removePromotionsFromChannel: Array<Promotion>;\n /** Remove all settled jobs in the given queues older than the given date. Returns the number of jobs deleted. */\n removeSettledJobs: Scalars['Int']['output'];\n /** Removes ShippingMethods from the specified Channel */\n removeShippingMethodsFromChannel: Array<ShippingMethod>;\n /** Removes StockLocations from the specified Channel */\n removeStockLocationsFromChannel: Array<StockLocation>;\n runPendingSearchIndexUpdates: Success;\n runScheduledTask: Success;\n setCustomerForDraftOrder: SetCustomerForDraftOrderResult;\n /** Sets the billing address for a draft Order */\n setDraftOrderBillingAddress: Order;\n /** Allows any custom fields to be set for the active order */\n setDraftOrderCustomFields: Order;\n /** Sets the shipping address for a draft Order */\n setDraftOrderShippingAddress: Order;\n /** Sets the shipping method by id, which can be obtained with the `eligibleShippingMethodsForDraftOrder` query */\n setDraftOrderShippingMethod: SetOrderShippingMethodResult;\n setOrderCustomFields?: Maybe<Order>;\n /** Allows a different Customer to be assigned to an Order. Added in v2.2.0. */\n setOrderCustomer?: Maybe<Order>;\n /** Set a single key-value pair (automatically scoped based on field configuration) */\n setSettingsStoreValue: SetSettingsStoreValueResult;\n /** Set multiple key-value pairs in a transaction (each automatically scoped) */\n setSettingsStoreValues: Array<SetSettingsStoreValueResult>;\n settlePayment: SettlePaymentResult;\n settleRefund: SettleRefundResult;\n transitionFulfillmentToState: TransitionFulfillmentToStateResult;\n transitionOrderToState?: Maybe<TransitionOrderToStateResult>;\n transitionPaymentToState: TransitionPaymentToStateResult;\n /** Unsets the billing address for a draft Order */\n unsetDraftOrderBillingAddress: Order;\n /** Unsets the shipping address for a draft Order */\n unsetDraftOrderShippingAddress: Order;\n /** Update the active (currently logged-in) Administrator */\n updateActiveAdministrator: Administrator;\n /** Update an existing Administrator */\n updateAdministrator: Administrator;\n /** Update an existing Asset */\n updateAsset: Asset;\n /** Update an existing Channel */\n updateChannel: UpdateChannelResult;\n /** Update an existing Collection */\n updateCollection: Collection;\n /** Update an existing Country */\n updateCountry: Country;\n /** Update an existing Customer */\n updateCustomer: UpdateCustomerResult;\n /** Update an existing Address */\n updateCustomerAddress: Address;\n /** Update an existing CustomerGroup */\n updateCustomerGroup: CustomerGroup;\n updateCustomerNote: HistoryEntry;\n /** Update an existing Facet */\n updateFacet: Facet;\n /** Update a single FacetValue */\n updateFacetValue: FacetValue;\n /** Update one or more FacetValues */\n updateFacetValues: Array<FacetValue>;\n updateGlobalSettings: UpdateGlobalSettingsResult;\n updateOrderNote: HistoryEntry;\n /** Update an existing PaymentMethod */\n updatePaymentMethod: PaymentMethod;\n /** Update an existing Product */\n updateProduct: Product;\n /** Create a new ProductOption within a ProductOptionGroup */\n updateProductOption: ProductOption;\n /** Update an existing ProductOptionGroup */\n updateProductOptionGroup: ProductOptionGroup;\n /** Update an existing ProductVariant */\n updateProductVariant: ProductVariant;\n /** Update existing ProductVariants */\n updateProductVariants: Array<Maybe<ProductVariant>>;\n /** Update multiple existing Products */\n updateProducts: Array<Product>;\n updatePromotion: UpdatePromotionResult;\n /** Update an existing Province */\n updateProvince: Province;\n /** Update an existing Role */\n updateRole: Role;\n updateScheduledTask: ScheduledTask;\n /** Update an existing Seller */\n updateSeller: Seller;\n /** Update an existing ShippingMethod */\n updateShippingMethod: ShippingMethod;\n updateStockLocation: StockLocation;\n /** Update an existing Tag */\n updateTag: Tag;\n /** Update an existing TaxCategory */\n updateTaxCategory: TaxCategory;\n /** Update an existing TaxRate */\n updateTaxRate: TaxRate;\n /** Update an existing Zone */\n updateZone: Zone;\n};\n\n\nexport type MutationAddCustomersToGroupArgs = {\n customerGroupId: Scalars['ID']['input'];\n customerIds: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationAddFulfillmentToOrderArgs = {\n input: FulfillOrderInput;\n};\n\n\nexport type MutationAddItemToDraftOrderArgs = {\n input: AddItemToDraftOrderInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAddManualPaymentToOrderArgs = {\n input: ManualPaymentInput;\n};\n\n\nexport type MutationAddMembersToZoneArgs = {\n memberIds: Array<Scalars['ID']['input']>;\n zoneId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAddNoteToCustomerArgs = {\n input: AddNoteToCustomerInput;\n};\n\n\nexport type MutationAddNoteToOrderArgs = {\n input: AddNoteToOrderInput;\n};\n\n\nexport type MutationAddOptionGroupToProductArgs = {\n optionGroupId: Scalars['ID']['input'];\n productId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAdjustDraftOrderLineArgs = {\n input: AdjustDraftOrderLineInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationApplyCouponCodeToDraftOrderArgs = {\n couponCode: Scalars['String']['input'];\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAssignAssetsToChannelArgs = {\n input: AssignAssetsToChannelInput;\n};\n\n\nexport type MutationAssignCollectionsToChannelArgs = {\n input: AssignCollectionsToChannelInput;\n};\n\n\nexport type MutationAssignFacetsToChannelArgs = {\n input: AssignFacetsToChannelInput;\n};\n\n\nexport type MutationAssignPaymentMethodsToChannelArgs = {\n input: AssignPaymentMethodsToChannelInput;\n};\n\n\nexport type MutationAssignProductVariantsToChannelArgs = {\n input: AssignProductVariantsToChannelInput;\n};\n\n\nexport type MutationAssignProductsToChannelArgs = {\n input: AssignProductsToChannelInput;\n};\n\n\nexport type MutationAssignPromotionsToChannelArgs = {\n input: AssignPromotionsToChannelInput;\n};\n\n\nexport type MutationAssignRoleToAdministratorArgs = {\n administratorId: Scalars['ID']['input'];\n roleId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAssignShippingMethodsToChannelArgs = {\n input: AssignShippingMethodsToChannelInput;\n};\n\n\nexport type MutationAssignStockLocationsToChannelArgs = {\n input: AssignStockLocationsToChannelInput;\n};\n\n\nexport type MutationAuthenticateArgs = {\n input: AuthenticationInput;\n rememberMe?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\n\nexport type MutationCancelJobArgs = {\n jobId: Scalars['ID']['input'];\n};\n\n\nexport type MutationCancelOrderArgs = {\n input: CancelOrderInput;\n};\n\n\nexport type MutationCancelPaymentArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationCreateAdministratorArgs = {\n input: CreateAdministratorInput;\n};\n\n\nexport type MutationCreateAssetsArgs = {\n input: Array<CreateAssetInput>;\n};\n\n\nexport type MutationCreateChannelArgs = {\n input: CreateChannelInput;\n};\n\n\nexport type MutationCreateCollectionArgs = {\n input: CreateCollectionInput;\n};\n\n\nexport type MutationCreateCountryArgs = {\n input: CreateCountryInput;\n};\n\n\nexport type MutationCreateCustomerArgs = {\n input: CreateCustomerInput;\n password?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationCreateCustomerAddressArgs = {\n customerId: Scalars['ID']['input'];\n input: CreateAddressInput;\n};\n\n\nexport type MutationCreateCustomerGroupArgs = {\n input: CreateCustomerGroupInput;\n};\n\n\nexport type MutationCreateFacetArgs = {\n input: CreateFacetInput;\n};\n\n\nexport type MutationCreateFacetValueArgs = {\n input: CreateFacetValueInput;\n};\n\n\nexport type MutationCreateFacetValuesArgs = {\n input: Array<CreateFacetValueInput>;\n};\n\n\nexport type MutationCreatePaymentMethodArgs = {\n input: CreatePaymentMethodInput;\n};\n\n\nexport type MutationCreateProductArgs = {\n input: CreateProductInput;\n};\n\n\nexport type MutationCreateProductOptionArgs = {\n input: CreateProductOptionInput;\n};\n\n\nexport type MutationCreateProductOptionGroupArgs = {\n input: CreateProductOptionGroupInput;\n};\n\n\nexport type MutationCreateProductVariantsArgs = {\n input: Array<CreateProductVariantInput>;\n};\n\n\nexport type MutationCreatePromotionArgs = {\n input: CreatePromotionInput;\n};\n\n\nexport type MutationCreateProvinceArgs = {\n input: CreateProvinceInput;\n};\n\n\nexport type MutationCreateRoleArgs = {\n input: CreateRoleInput;\n};\n\n\nexport type MutationCreateSellerArgs = {\n input: CreateSellerInput;\n};\n\n\nexport type MutationCreateShippingMethodArgs = {\n input: CreateShippingMethodInput;\n};\n\n\nexport type MutationCreateStockLocationArgs = {\n input: CreateStockLocationInput;\n};\n\n\nexport type MutationCreateTagArgs = {\n input: CreateTagInput;\n};\n\n\nexport type MutationCreateTaxCategoryArgs = {\n input: CreateTaxCategoryInput;\n};\n\n\nexport type MutationCreateTaxRateArgs = {\n input: CreateTaxRateInput;\n};\n\n\nexport type MutationCreateZoneArgs = {\n input: CreateZoneInput;\n};\n\n\nexport type MutationDeleteAdministratorArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteAdministratorsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteAssetArgs = {\n input: DeleteAssetInput;\n};\n\n\nexport type MutationDeleteAssetsArgs = {\n input: DeleteAssetsInput;\n};\n\n\nexport type MutationDeleteChannelArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteChannelsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCollectionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCollectionsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCountriesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCountryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerAddressArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerGroupArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerGroupsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCustomerNoteArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomersArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteDraftOrderArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteFacetArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteFacetValuesArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteFacetsArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteOrderNoteArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeletePaymentMethodArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeletePaymentMethodsArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteProductArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteProductOptionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteProductVariantArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteProductVariantsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteProductsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeletePromotionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeletePromotionsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteProvinceArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteRoleArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteRolesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteSellerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteSellersArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteShippingMethodArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteShippingMethodsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteStockLocationArgs = {\n input: DeleteStockLocationInput;\n};\n\n\nexport type MutationDeleteStockLocationsArgs = {\n input: Array<DeleteStockLocationInput>;\n};\n\n\nexport type MutationDeleteTagArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteTaxCategoriesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteTaxCategoryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteTaxRateArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteTaxRatesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteZoneArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteZonesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDuplicateEntityArgs = {\n input: DuplicateEntityInput;\n};\n\n\nexport type MutationFlushBufferedJobsArgs = {\n bufferIds?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n\nexport type MutationImportProductsArgs = {\n csvFile: Scalars['Upload']['input'];\n};\n\n\nexport type MutationLoginArgs = {\n password: Scalars['String']['input'];\n rememberMe?: InputMaybe<Scalars['Boolean']['input']>;\n username: Scalars['String']['input'];\n};\n\n\nexport type MutationModifyOrderArgs = {\n input: ModifyOrderInput;\n};\n\n\nexport type MutationMoveCollectionArgs = {\n input: MoveCollectionInput;\n};\n\n\nexport type MutationRefundOrderArgs = {\n input: RefundOrderInput;\n};\n\n\nexport type MutationRemoveCollectionsFromChannelArgs = {\n input: RemoveCollectionsFromChannelInput;\n};\n\n\nexport type MutationRemoveCouponCodeFromDraftOrderArgs = {\n couponCode: Scalars['String']['input'];\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemoveCustomersFromGroupArgs = {\n customerGroupId: Scalars['ID']['input'];\n customerIds: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationRemoveDraftOrderLineArgs = {\n orderId: Scalars['ID']['input'];\n orderLineId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemoveFacetsFromChannelArgs = {\n input: RemoveFacetsFromChannelInput;\n};\n\n\nexport type MutationRemoveMembersFromZoneArgs = {\n memberIds: Array<Scalars['ID']['input']>;\n zoneId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemoveOptionGroupFromProductArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n optionGroupId: Scalars['ID']['input'];\n productId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemovePaymentMethodsFromChannelArgs = {\n input: RemovePaymentMethodsFromChannelInput;\n};\n\n\nexport type MutationRemoveProductVariantsFromChannelArgs = {\n input: RemoveProductVariantsFromChannelInput;\n};\n\n\nexport type MutationRemoveProductsFromChannelArgs = {\n input: RemoveProductsFromChannelInput;\n};\n\n\nexport type MutationRemovePromotionsFromChannelArgs = {\n input: RemovePromotionsFromChannelInput;\n};\n\n\nexport type MutationRemoveSettledJobsArgs = {\n olderThan?: InputMaybe<Scalars['DateTime']['input']>;\n queueNames?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n\nexport type MutationRemoveShippingMethodsFromChannelArgs = {\n input: RemoveShippingMethodsFromChannelInput;\n};\n\n\nexport type MutationRemoveStockLocationsFromChannelArgs = {\n input: RemoveStockLocationsFromChannelInput;\n};\n\n\nexport type MutationRunScheduledTaskArgs = {\n id: Scalars['String']['input'];\n};\n\n\nexport type MutationSetCustomerForDraftOrderArgs = {\n customerId?: InputMaybe<Scalars['ID']['input']>;\n input?: InputMaybe<CreateCustomerInput>;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderBillingAddressArgs = {\n input: CreateAddressInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderCustomFieldsArgs = {\n input: UpdateOrderInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderShippingAddressArgs = {\n input: CreateAddressInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderShippingMethodArgs = {\n orderId: Scalars['ID']['input'];\n shippingMethodId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetOrderCustomFieldsArgs = {\n input: UpdateOrderInput;\n};\n\n\nexport type MutationSetOrderCustomerArgs = {\n input: SetOrderCustomerInput;\n};\n\n\nexport type MutationSetSettingsStoreValueArgs = {\n input: SettingsStoreInput;\n};\n\n\nexport type MutationSetSettingsStoreValuesArgs = {\n inputs: Array<SettingsStoreInput>;\n};\n\n\nexport type MutationSettlePaymentArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationSettleRefundArgs = {\n input: SettleRefundInput;\n};\n\n\nexport type MutationTransitionFulfillmentToStateArgs = {\n id: Scalars['ID']['input'];\n state: Scalars['String']['input'];\n};\n\n\nexport type MutationTransitionOrderToStateArgs = {\n id: Scalars['ID']['input'];\n state: Scalars['String']['input'];\n};\n\n\nexport type MutationTransitionPaymentToStateArgs = {\n id: Scalars['ID']['input'];\n state: Scalars['String']['input'];\n};\n\n\nexport type MutationUnsetDraftOrderBillingAddressArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationUnsetDraftOrderShippingAddressArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationUpdateActiveAdministratorArgs = {\n input: UpdateActiveAdministratorInput;\n};\n\n\nexport type MutationUpdateAdministratorArgs = {\n input: UpdateAdministratorInput;\n};\n\n\nexport type MutationUpdateAssetArgs = {\n input: UpdateAssetInput;\n};\n\n\nexport type MutationUpdateChannelArgs = {\n input: UpdateChannelInput;\n};\n\n\nexport type MutationUpdateCollectionArgs = {\n input: UpdateCollectionInput;\n};\n\n\nexport type MutationUpdateCountryArgs = {\n input: UpdateCountryInput;\n};\n\n\nexport type MutationUpdateCustomerArgs = {\n input: UpdateCustomerInput;\n};\n\n\nexport type MutationUpdateCustomerAddressArgs = {\n input: UpdateAddressInput;\n};\n\n\nexport type MutationUpdateCustomerGroupArgs = {\n input: UpdateCustomerGroupInput;\n};\n\n\nexport type MutationUpdateCustomerNoteArgs = {\n input: UpdateCustomerNoteInput;\n};\n\n\nexport type MutationUpdateFacetArgs = {\n input: UpdateFacetInput;\n};\n\n\nexport type MutationUpdateFacetValueArgs = {\n input: UpdateFacetValueInput;\n};\n\n\nexport type MutationUpdateFacetValuesArgs = {\n input: Array<UpdateFacetValueInput>;\n};\n\n\nexport type MutationUpdateGlobalSettingsArgs = {\n input: UpdateGlobalSettingsInput;\n};\n\n\nexport type MutationUpdateOrderNoteArgs = {\n input: UpdateOrderNoteInput;\n};\n\n\nexport type MutationUpdatePaymentMethodArgs = {\n input: UpdatePaymentMethodInput;\n};\n\n\nexport type MutationUpdateProductArgs = {\n input: UpdateProductInput;\n};\n\n\nexport type MutationUpdateProductOptionArgs = {\n input: UpdateProductOptionInput;\n};\n\n\nexport type MutationUpdateProductOptionGroupArgs = {\n input: UpdateProductOptionGroupInput;\n};\n\n\nexport type MutationUpdateProductVariantArgs = {\n input: UpdateProductVariantInput;\n};\n\n\nexport type MutationUpdateProductVariantsArgs = {\n input: Array<UpdateProductVariantInput>;\n};\n\n\nexport type MutationUpdateProductsArgs = {\n input: Array<UpdateProductInput>;\n};\n\n\nexport type MutationUpdatePromotionArgs = {\n input: UpdatePromotionInput;\n};\n\n\nexport type MutationUpdateProvinceArgs = {\n input: UpdateProvinceInput;\n};\n\n\nexport type MutationUpdateRoleArgs = {\n input: UpdateRoleInput;\n};\n\n\nexport type MutationUpdateScheduledTaskArgs = {\n input: UpdateScheduledTaskInput;\n};\n\n\nexport type MutationUpdateSellerArgs = {\n input: UpdateSellerInput;\n};\n\n\nexport type MutationUpdateShippingMethodArgs = {\n input: UpdateShippingMethodInput;\n};\n\n\nexport type MutationUpdateStockLocationArgs = {\n input: UpdateStockLocationInput;\n};\n\n\nexport type MutationUpdateTagArgs = {\n input: UpdateTagInput;\n};\n\n\nexport type MutationUpdateTaxCategoryArgs = {\n input: UpdateTaxCategoryInput;\n};\n\n\nexport type MutationUpdateTaxRateArgs = {\n input: UpdateTaxRateInput;\n};\n\n\nexport type MutationUpdateZoneArgs = {\n input: UpdateZoneInput;\n};\n\nexport type NativeAuthInput = {\n password: Scalars['String']['input'];\n username: Scalars['String']['input'];\n};\n\n/** Returned when attempting an operation that relies on the NativeAuthStrategy, if that strategy is not configured. */\nexport type NativeAuthStrategyError = ErrorResult & {\n __typename?: 'NativeAuthStrategyError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type NativeAuthenticationResult = CurrentUser | InvalidCredentialsError | NativeAuthStrategyError;\n\n/** Returned when attempting to set a negative OrderLine quantity. */\nexport type NegativeQuantityError = ErrorResult & {\n __typename?: 'NegativeQuantityError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/**\n * Returned when invoking a mutation which depends on there being an active Order on the\n * current session.\n */\nexport type NoActiveOrderError = ErrorResult & {\n __typename?: 'NoActiveOrderError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when a call to modifyOrder fails to specify any changes */\nexport type NoChangesSpecifiedError = ErrorResult & {\n __typename?: 'NoChangesSpecifiedError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Node = {\n id: Scalars['ID']['output'];\n};\n\n/** Returned if an attempting to refund an Order but neither items nor shipping refund was specified */\nexport type NothingToRefundError = ErrorResult & {\n __typename?: 'NothingToRefundError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Operators for filtering on a list of Number fields */\nexport type NumberListOperators = {\n inList: Scalars['Float']['input'];\n};\n\n/** Operators for filtering on a Int or Float field */\nexport type NumberOperators = {\n between?: InputMaybe<NumberRange>;\n eq?: InputMaybe<Scalars['Float']['input']>;\n gt?: InputMaybe<Scalars['Float']['input']>;\n gte?: InputMaybe<Scalars['Float']['input']>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n lt?: InputMaybe<Scalars['Float']['input']>;\n lte?: InputMaybe<Scalars['Float']['input']>;\n};\n\nexport type NumberRange = {\n end: Scalars['Float']['input'];\n start: Scalars['Float']['input'];\n};\n\nexport type Order = Node & {\n __typename?: 'Order';\n /** An order is active as long as the payment process has not been completed */\n active: Scalars['Boolean']['output'];\n aggregateOrder?: Maybe<Order>;\n aggregateOrderId?: Maybe<Scalars['ID']['output']>;\n billingAddress?: Maybe<OrderAddress>;\n channels: Array<Channel>;\n /** A unique code for the Order */\n code: Scalars['String']['output'];\n /** An array of all coupon codes applied to the Order */\n couponCodes: Array<Scalars['String']['output']>;\n createdAt: Scalars['DateTime']['output'];\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n customer?: Maybe<Customer>;\n discounts: Array<Discount>;\n fulfillments?: Maybe<Array<Fulfillment>>;\n history: HistoryEntryList;\n id: Scalars['ID']['output'];\n lines: Array<OrderLine>;\n modifications: Array<OrderModification>;\n nextStates: Array<Scalars['String']['output']>;\n /**\n * The date & time that the Order was placed, i.e. the Customer\n * completed the checkout and the Order is no longer \"active\"\n */\n orderPlacedAt?: Maybe<Scalars['DateTime']['output']>;\n payments?: Maybe<Array<Payment>>;\n /** Promotions applied to the order. Only gets populated after the payment process has completed. */\n promotions: Array<Promotion>;\n sellerOrders?: Maybe<Array<Order>>;\n shipping: Scalars['Money']['output'];\n shippingAddress?: Maybe<OrderAddress>;\n shippingLines: Array<ShippingLine>;\n shippingWithTax: Scalars['Money']['output'];\n state: Scalars['String']['output'];\n /**\n * The subTotal is the total of all OrderLines in the Order. This figure also includes any Order-level\n * discounts which have been prorated (proportionally distributed) amongst the items of each OrderLine.\n * To get a total of all OrderLines which does not account for prorated discounts, use the\n * sum of `OrderLine.discountedLinePrice` values.\n */\n subTotal: Scalars['Money']['output'];\n /** Same as subTotal, but inclusive of tax */\n subTotalWithTax: Scalars['Money']['output'];\n /**\n * Surcharges are arbitrary modifications to the Order total which are neither\n * ProductVariants nor discounts resulting from applied Promotions. For example,\n * one-off discounts based on customer interaction, or surcharges based on payment\n * methods.\n */\n surcharges: Array<Surcharge>;\n /** A summary of the taxes being applied to this Order */\n taxSummary: Array<OrderTaxSummary>;\n /** Equal to subTotal plus shipping */\n total: Scalars['Money']['output'];\n totalQuantity: Scalars['Int']['output'];\n /** The final payable amount. Equal to subTotalWithTax plus shippingWithTax */\n totalWithTax: Scalars['Money']['output'];\n type: OrderType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n\nexport type OrderHistoryArgs = {\n options?: InputMaybe<HistoryEntryListOptions>;\n};\n\nexport type OrderAddress = {\n __typename?: 'OrderAddress';\n city?: Maybe<Scalars['String']['output']>;\n company?: Maybe<Scalars['String']['output']>;\n country?: Maybe<Scalars['String']['output']>;\n countryCode?: Maybe<Scalars['String']['output']>;\n customFields?: Maybe<Scalars['JSON']['output']>;\n fullName?: Maybe<Scalars['String']['output']>;\n phoneNumber?: Maybe<Scalars['String']['output']>;\n postalCode?: Maybe<Scalars['String']['output']>;\n province?: Maybe<Scalars['String']['output']>;\n streetLine1?: Maybe<Scalars['String']['output']>;\n streetLine2?: Maybe<Scalars['String']['output']>;\n};\n\nexport type OrderFilterParameter = {\n _and?: InputMaybe<Array<OrderFilterParameter>>;\n _or?: InputMaybe<Array<OrderFilterParameter>>;\n active?: InputMaybe<BooleanOperators>;\n aggregateOrderId?: InputMaybe<IdOperators>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n currencyCode?: InputMaybe<StringOperators>;\n customerLastName?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n orderPlacedAt?: InputMaybe<DateOperators>;\n shipping?: InputMaybe<NumberOperators>;\n shippingWithTax?: InputMaybe<NumberOperators>;\n state?: InputMaybe<StringOperators>;\n subTotal?: InputMaybe<NumberOperators>;\n subTotalWithTax?: InputMaybe<NumberOperators>;\n total?: InputMaybe<NumberOperators>;\n totalQuantity?: InputMaybe<NumberOperators>;\n totalWithTax?: InputMaybe<NumberOperators>;\n transactionId?: InputMaybe<StringOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\n/** Returned when an order operation is rejected by an OrderInterceptor method. */\nexport type OrderInterceptorError = ErrorResult & {\n __typename?: 'OrderInterceptorError';\n errorCode: ErrorCode;\n interceptorError: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\n/** Returned when the maximum order size limit has been reached. */\nexport type OrderLimitError = ErrorResult & {\n __typename?: 'OrderLimitError';\n errorCode: ErrorCode;\n maxItems: Scalars['Int']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type OrderLine = Node & {\n __typename?: 'OrderLine';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n /** The price of the line including discounts, excluding tax */\n discountedLinePrice: Scalars['Money']['output'];\n /** The price of the line including discounts and tax */\n discountedLinePriceWithTax: Scalars['Money']['output'];\n /**\n * The price of a single unit including discounts, excluding tax.\n *\n * If Order-level discounts have been applied, this will not be the\n * actual taxable unit price (see `proratedUnitPrice`), but is generally the\n * correct price to display to customers to avoid confusion\n * about the internal handling of distributed Order-level discounts.\n */\n discountedUnitPrice: Scalars['Money']['output'];\n /** The price of a single unit including discounts and tax */\n discountedUnitPriceWithTax: Scalars['Money']['output'];\n discounts: Array<Discount>;\n featuredAsset?: Maybe<Asset>;\n fulfillmentLines?: Maybe<Array<FulfillmentLine>>;\n id: Scalars['ID']['output'];\n /** The total price of the line excluding tax and discounts. */\n linePrice: Scalars['Money']['output'];\n /** The total price of the line including tax but excluding discounts. */\n linePriceWithTax: Scalars['Money']['output'];\n /** The total tax on this line */\n lineTax: Scalars['Money']['output'];\n order: Order;\n /** The quantity at the time the Order was placed */\n orderPlacedQuantity: Scalars['Int']['output'];\n productVariant: ProductVariant;\n /**\n * The actual line price, taking into account both item discounts _and_ prorated (proportionally-distributed)\n * Order-level discounts. This value is the true economic value of the OrderLine, and is used in tax\n * and refund calculations.\n */\n proratedLinePrice: Scalars['Money']['output'];\n /** The proratedLinePrice including tax */\n proratedLinePriceWithTax: Scalars['Money']['output'];\n /**\n * The actual unit price, taking into account both item discounts _and_ prorated (proportionally-distributed)\n * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax\n * and refund calculations.\n */\n proratedUnitPrice: Scalars['Money']['output'];\n /** The proratedUnitPrice including tax */\n proratedUnitPriceWithTax: Scalars['Money']['output'];\n /** The quantity of items purchased */\n quantity: Scalars['Int']['output'];\n taxLines: Array<TaxLine>;\n taxRate: Scalars['Float']['output'];\n /** The price of a single unit, excluding tax and discounts */\n unitPrice: Scalars['Money']['output'];\n /** Non-zero if the unitPrice has changed since it was initially added to Order */\n unitPriceChangeSinceAdded: Scalars['Money']['output'];\n /** The price of a single unit, including tax but excluding discounts */\n unitPriceWithTax: Scalars['Money']['output'];\n /** Non-zero if the unitPriceWithTax has changed since it was initially added to Order */\n unitPriceWithTaxChangeSinceAdded: Scalars['Money']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type OrderLineInput = {\n orderLineId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type OrderList = PaginatedList & {\n __typename?: 'OrderList';\n items: Array<Order>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type OrderListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<OrderFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<OrderSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type OrderModification = Node & {\n __typename?: 'OrderModification';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n isSettled: Scalars['Boolean']['output'];\n lines: Array<OrderModificationLine>;\n note: Scalars['String']['output'];\n payment?: Maybe<Payment>;\n priceChange: Scalars['Money']['output'];\n refund?: Maybe<Refund>;\n surcharges?: Maybe<Array<Surcharge>>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned when attempting to modify the contents of an Order that is not in the `AddingItems` state. */\nexport type OrderModificationError = ErrorResult & {\n __typename?: 'OrderModificationError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type OrderModificationLine = {\n __typename?: 'OrderModificationLine';\n modification: OrderModification;\n modificationId: Scalars['ID']['output'];\n orderLine: OrderLine;\n orderLineId: Scalars['ID']['output'];\n quantity: Scalars['Int']['output'];\n};\n\n/** Returned when attempting to modify the contents of an Order that is not in the `Modifying` state. */\nexport type OrderModificationStateError = ErrorResult & {\n __typename?: 'OrderModificationStateError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type OrderProcessState = {\n __typename?: 'OrderProcessState';\n name: Scalars['String']['output'];\n to: Array<Scalars['String']['output']>;\n};\n\nexport type OrderSortParameter = {\n aggregateOrderId?: InputMaybe<SortOrder>;\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n customerLastName?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n orderPlacedAt?: InputMaybe<SortOrder>;\n shipping?: InputMaybe<SortOrder>;\n shippingWithTax?: InputMaybe<SortOrder>;\n state?: InputMaybe<SortOrder>;\n subTotal?: InputMaybe<SortOrder>;\n subTotalWithTax?: InputMaybe<SortOrder>;\n total?: InputMaybe<SortOrder>;\n totalQuantity?: InputMaybe<SortOrder>;\n totalWithTax?: InputMaybe<SortOrder>;\n transactionId?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\n/** Returned if there is an error in transitioning the Order state */\nexport type OrderStateTransitionError = ErrorResult & {\n __typename?: 'OrderStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\n/**\n * A summary of the taxes being applied to this order, grouped\n * by taxRate.\n */\nexport type OrderTaxSummary = {\n __typename?: 'OrderTaxSummary';\n /** A description of this tax */\n description: Scalars['String']['output'];\n /** The total net price of OrderLines to which this taxRate applies */\n taxBase: Scalars['Money']['output'];\n /** The taxRate as a percentage */\n taxRate: Scalars['Float']['output'];\n /** The total tax being applied to the Order at this taxRate */\n taxTotal: Scalars['Money']['output'];\n};\n\nexport enum OrderType {\n Aggregate = 'Aggregate',\n Regular = 'Regular',\n Seller = 'Seller'\n}\n\nexport type PaginatedList = {\n items: Array<Node>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type Payment = Node & {\n __typename?: 'Payment';\n amount: Scalars['Money']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n errorMessage?: Maybe<Scalars['String']['output']>;\n id: Scalars['ID']['output'];\n metadata?: Maybe<Scalars['JSON']['output']>;\n method: Scalars['String']['output'];\n nextStates: Array<Scalars['String']['output']>;\n refunds: Array<Refund>;\n state: Scalars['String']['output'];\n transactionId?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PaymentMethod = Node & {\n __typename?: 'PaymentMethod';\n checker?: Maybe<ConfigurableOperation>;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n handler: ConfigurableOperation;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n translations: Array<PaymentMethodTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PaymentMethodFilterParameter = {\n _and?: InputMaybe<Array<PaymentMethodFilterParameter>>;\n _or?: InputMaybe<Array<PaymentMethodFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type PaymentMethodList = PaginatedList & {\n __typename?: 'PaymentMethodList';\n items: Array<PaymentMethod>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type PaymentMethodListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<PaymentMethodFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<PaymentMethodSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * Returned when a call to modifyOrder fails to include a paymentMethod even\n * though the price has increased as a result of the changes.\n */\nexport type PaymentMethodMissingError = ErrorResult & {\n __typename?: 'PaymentMethodMissingError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type PaymentMethodQuote = {\n __typename?: 'PaymentMethodQuote';\n code: Scalars['String']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n eligibilityMessage?: Maybe<Scalars['String']['output']>;\n id: Scalars['ID']['output'];\n isEligible: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n};\n\nexport type PaymentMethodSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type PaymentMethodTranslation = {\n __typename?: 'PaymentMethodTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PaymentMethodTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** Returned if an attempting to refund a Payment against OrderLines from a different Order */\nexport type PaymentOrderMismatchError = ErrorResult & {\n __typename?: 'PaymentOrderMismatchError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when there is an error in transitioning the Payment state */\nexport type PaymentStateTransitionError = ErrorResult & {\n __typename?: 'PaymentStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\n/**\n * @description\n * Permissions for administrators and customers. Used to control access to\n * GraphQL resolvers via the {@link Allow} decorator.\n *\n * ## Understanding Permission.Owner\n *\n * `Permission.Owner` is a special permission which is used in some Vendure resolvers to indicate that that resolver should only\n * be accessible to the \"owner\" of that resource.\n *\n * For example, the Shop API `activeCustomer` query resolver should only return the Customer object for the \"owner\" of that Customer, i.e.\n * based on the activeUserId of the current session. As a result, the resolver code looks like this:\n *\n * @example\n * ```TypeScript\n * \\@Query()\n * \\@Allow(Permission.Owner)\n * async activeCustomer(\\@Ctx() ctx: RequestContext): Promise<Customer | undefined> {\n * const userId = ctx.activeUserId;\n * if (userId) {\n * return this.customerService.findOneByUserId(ctx, userId);\n * }\n * }\n * ```\n *\n * Here we can see that the \"ownership\" must be enforced by custom logic inside the resolver. Since \"ownership\" cannot be defined generally\n * nor statically encoded at build-time, any resolvers using `Permission.Owner` **must** include logic to enforce that only the owner\n * of the resource has access. If not, then it is the equivalent of using `Permission.Public`.\n *\n *\n * @docsCategory common\n */\nexport enum Permission {\n /** Authenticated means simply that the user is logged in */\n Authenticated = 'Authenticated',\n /** Grants permission to create Administrator */\n CreateAdministrator = 'CreateAdministrator',\n /** Grants permission to create Asset */\n CreateAsset = 'CreateAsset',\n /** Grants permission to create Products, Facets, Assets, Collections */\n CreateCatalog = 'CreateCatalog',\n /** Grants permission to create Channel */\n CreateChannel = 'CreateChannel',\n /** Grants permission to create Collection */\n CreateCollection = 'CreateCollection',\n /** Grants permission to create Country */\n CreateCountry = 'CreateCountry',\n /** Grants permission to create Customer */\n CreateCustomer = 'CreateCustomer',\n /** Grants permission to create CustomerGroup */\n CreateCustomerGroup = 'CreateCustomerGroup',\n /** Grants permission to create Facet */\n CreateFacet = 'CreateFacet',\n /** Grants permission to create Order */\n CreateOrder = 'CreateOrder',\n /** Grants permission to create PaymentMethod */\n CreatePaymentMethod = 'CreatePaymentMethod',\n /** Grants permission to create Product */\n CreateProduct = 'CreateProduct',\n /** Grants permission to create Promotion */\n CreatePromotion = 'CreatePromotion',\n /** Grants permission to create Seller */\n CreateSeller = 'CreateSeller',\n /** Grants permission to create PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n CreateSettings = 'CreateSettings',\n /** Grants permission to create ShippingMethod */\n CreateShippingMethod = 'CreateShippingMethod',\n /** Grants permission to create StockLocation */\n CreateStockLocation = 'CreateStockLocation',\n /** Grants permission to create System */\n CreateSystem = 'CreateSystem',\n /** Grants permission to create Tag */\n CreateTag = 'CreateTag',\n /** Grants permission to create TaxCategory */\n CreateTaxCategory = 'CreateTaxCategory',\n /** Grants permission to create TaxRate */\n CreateTaxRate = 'CreateTaxRate',\n /** Grants permission to create Zone */\n CreateZone = 'CreateZone',\n /** Grants permission to delete Administrator */\n DeleteAdministrator = 'DeleteAdministrator',\n /** Grants permission to delete Asset */\n DeleteAsset = 'DeleteAsset',\n /** Grants permission to delete Products, Facets, Assets, Collections */\n DeleteCatalog = 'DeleteCatalog',\n /** Grants permission to delete Channel */\n DeleteChannel = 'DeleteChannel',\n /** Grants permission to delete Collection */\n DeleteCollection = 'DeleteCollection',\n /** Grants permission to delete Country */\n DeleteCountry = 'DeleteCountry',\n /** Grants permission to delete Customer */\n DeleteCustomer = 'DeleteCustomer',\n /** Grants permission to delete CustomerGroup */\n DeleteCustomerGroup = 'DeleteCustomerGroup',\n /** Grants permission to delete Facet */\n DeleteFacet = 'DeleteFacet',\n /** Grants permission to delete Order */\n DeleteOrder = 'DeleteOrder',\n /** Grants permission to delete PaymentMethod */\n DeletePaymentMethod = 'DeletePaymentMethod',\n /** Grants permission to delete Product */\n DeleteProduct = 'DeleteProduct',\n /** Grants permission to delete Promotion */\n DeletePromotion = 'DeletePromotion',\n /** Grants permission to delete Seller */\n DeleteSeller = 'DeleteSeller',\n /** Grants permission to delete PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n DeleteSettings = 'DeleteSettings',\n /** Grants permission to delete ShippingMethod */\n DeleteShippingMethod = 'DeleteShippingMethod',\n /** Grants permission to delete StockLocation */\n DeleteStockLocation = 'DeleteStockLocation',\n /** Grants permission to delete System */\n DeleteSystem = 'DeleteSystem',\n /** Grants permission to delete Tag */\n DeleteTag = 'DeleteTag',\n /** Grants permission to delete TaxCategory */\n DeleteTaxCategory = 'DeleteTaxCategory',\n /** Grants permission to delete TaxRate */\n DeleteTaxRate = 'DeleteTaxRate',\n /** Grants permission to delete Zone */\n DeleteZone = 'DeleteZone',\n /** Owner means the user owns this entity, e.g. a Customer's own Order */\n Owner = 'Owner',\n /** Public means any unauthenticated user may perform the operation */\n Public = 'Public',\n /** Grants permission to read Administrator */\n ReadAdministrator = 'ReadAdministrator',\n /** Grants permission to read Asset */\n ReadAsset = 'ReadAsset',\n /** Grants permission to read Products, Facets, Assets, Collections */\n ReadCatalog = 'ReadCatalog',\n /** Grants permission to read Channel */\n ReadChannel = 'ReadChannel',\n /** Grants permission to read Collection */\n ReadCollection = 'ReadCollection',\n /** Grants permission to read Country */\n ReadCountry = 'ReadCountry',\n /** Grants permission to read Customer */\n ReadCustomer = 'ReadCustomer',\n /** Grants permission to read CustomerGroup */\n ReadCustomerGroup = 'ReadCustomerGroup',\n /** Grants permission to read Facet */\n ReadFacet = 'ReadFacet',\n /** Grants permission to read Order */\n ReadOrder = 'ReadOrder',\n /** Grants permission to read PaymentMethod */\n ReadPaymentMethod = 'ReadPaymentMethod',\n /** Grants permission to read Product */\n ReadProduct = 'ReadProduct',\n /** Grants permission to read Promotion */\n ReadPromotion = 'ReadPromotion',\n /** Grants permission to read Seller */\n ReadSeller = 'ReadSeller',\n /** Grants permission to read PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n ReadSettings = 'ReadSettings',\n /** Grants permission to read ShippingMethod */\n ReadShippingMethod = 'ReadShippingMethod',\n /** Grants permission to read StockLocation */\n ReadStockLocation = 'ReadStockLocation',\n /** Grants permission to read System */\n ReadSystem = 'ReadSystem',\n /** Grants permission to read Tag */\n ReadTag = 'ReadTag',\n /** Grants permission to read TaxCategory */\n ReadTaxCategory = 'ReadTaxCategory',\n /** Grants permission to read TaxRate */\n ReadTaxRate = 'ReadTaxRate',\n /** Grants permission to read Zone */\n ReadZone = 'ReadZone',\n /** SuperAdmin has unrestricted access to all operations */\n SuperAdmin = 'SuperAdmin',\n /** Grants permission to update Administrator */\n UpdateAdministrator = 'UpdateAdministrator',\n /** Grants permission to update Asset */\n UpdateAsset = 'UpdateAsset',\n /** Grants permission to update Products, Facets, Assets, Collections */\n UpdateCatalog = 'UpdateCatalog',\n /** Grants permission to update Channel */\n UpdateChannel = 'UpdateChannel',\n /** Grants permission to update Collection */\n UpdateCollection = 'UpdateCollection',\n /** Grants permission to update Country */\n UpdateCountry = 'UpdateCountry',\n /** Grants permission to update Customer */\n UpdateCustomer = 'UpdateCustomer',\n /** Grants permission to update CustomerGroup */\n UpdateCustomerGroup = 'UpdateCustomerGroup',\n /** Grants permission to update Facet */\n UpdateFacet = 'UpdateFacet',\n /** Grants permission to update GlobalSettings */\n UpdateGlobalSettings = 'UpdateGlobalSettings',\n /** Grants permission to update Order */\n UpdateOrder = 'UpdateOrder',\n /** Grants permission to update PaymentMethod */\n UpdatePaymentMethod = 'UpdatePaymentMethod',\n /** Grants permission to update Product */\n UpdateProduct = 'UpdateProduct',\n /** Grants permission to update Promotion */\n UpdatePromotion = 'UpdatePromotion',\n /** Grants permission to update Seller */\n UpdateSeller = 'UpdateSeller',\n /** Grants permission to update PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n UpdateSettings = 'UpdateSettings',\n /** Grants permission to update ShippingMethod */\n UpdateShippingMethod = 'UpdateShippingMethod',\n /** Grants permission to update StockLocation */\n UpdateStockLocation = 'UpdateStockLocation',\n /** Grants permission to update System */\n UpdateSystem = 'UpdateSystem',\n /** Grants permission to update Tag */\n UpdateTag = 'UpdateTag',\n /** Grants permission to update TaxCategory */\n UpdateTaxCategory = 'UpdateTaxCategory',\n /** Grants permission to update TaxRate */\n UpdateTaxRate = 'UpdateTaxRate',\n /** Grants permission to update Zone */\n UpdateZone = 'UpdateZone'\n}\n\nexport type PermissionDefinition = {\n __typename?: 'PermissionDefinition';\n assignable: Scalars['Boolean']['output'];\n description: Scalars['String']['output'];\n name: Scalars['String']['output'];\n};\n\nexport type PreviewCollectionVariantsInput = {\n filters: Array<ConfigurableOperationInput>;\n inheritFilters: Scalars['Boolean']['input'];\n parentId?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** The price range where the result has more than one price */\nexport type PriceRange = {\n __typename?: 'PriceRange';\n max: Scalars['Money']['output'];\n min: Scalars['Money']['output'];\n};\n\nexport type Product = Node & {\n __typename?: 'Product';\n assets: Array<Asset>;\n channels: Array<Channel>;\n collections: Array<Collection>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n facetValues: Array<FacetValue>;\n featuredAsset?: Maybe<Asset>;\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n optionGroups: Array<ProductOptionGroup>;\n slug: Scalars['String']['output'];\n translations: Array<ProductTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n /** Returns a paginated, sortable, filterable list of ProductVariants */\n variantList: ProductVariantList;\n /** Returns all ProductVariants */\n variants: Array<ProductVariant>;\n};\n\n\nexport type ProductVariantListArgs = {\n options?: InputMaybe<ProductVariantListOptions>;\n};\n\nexport type ProductFilterParameter = {\n _and?: InputMaybe<Array<ProductFilterParameter>>;\n _or?: InputMaybe<Array<ProductFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n facetValueId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n sku?: InputMaybe<StringOperators>;\n slug?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ProductList = PaginatedList & {\n __typename?: 'ProductList';\n items: Array<Product>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProductListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProductFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProductSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProductOption = Node & {\n __typename?: 'ProductOption';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n group: ProductOptionGroup;\n groupId: Scalars['ID']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<ProductOptionTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionFilterParameter = {\n _and?: InputMaybe<Array<ProductOptionFilterParameter>>;\n _or?: InputMaybe<Array<ProductOptionFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n groupId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ProductOptionGroup = Node & {\n __typename?: 'ProductOptionGroup';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n options: Array<ProductOption>;\n translations: Array<ProductOptionGroupTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionGroupTranslation = {\n __typename?: 'ProductOptionGroupTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionGroupTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ProductOptionInUseError = ErrorResult & {\n __typename?: 'ProductOptionInUseError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n optionGroupCode: Scalars['String']['output'];\n productVariantCount: Scalars['Int']['output'];\n};\n\nexport type ProductOptionList = PaginatedList & {\n __typename?: 'ProductOptionList';\n items: Array<ProductOption>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProductOptionListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProductOptionFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProductOptionSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProductOptionSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n groupId?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProductOptionTranslation = {\n __typename?: 'ProductOptionTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ProductSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n slug?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProductTranslation = {\n __typename?: 'ProductTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ProductVariant = Node & {\n __typename?: 'ProductVariant';\n assets: Array<Asset>;\n channels: Array<Channel>;\n createdAt: Scalars['DateTime']['output'];\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n enabled: Scalars['Boolean']['output'];\n facetValues: Array<FacetValue>;\n featuredAsset?: Maybe<Asset>;\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n options: Array<ProductOption>;\n outOfStockThreshold: Scalars['Int']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n prices: Array<ProductVariantPrice>;\n product: Product;\n productId: Scalars['ID']['output'];\n sku: Scalars['String']['output'];\n /** @deprecated use stockLevels */\n stockAllocated: Scalars['Int']['output'];\n stockLevel: Scalars['String']['output'];\n stockLevels: Array<StockLevel>;\n stockMovements: StockMovementList;\n /** @deprecated use stockLevels */\n stockOnHand: Scalars['Int']['output'];\n taxCategory: TaxCategory;\n taxRateApplied: TaxRate;\n trackInventory: GlobalFlag;\n translations: Array<ProductVariantTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n useGlobalOutOfStockThreshold: Scalars['Boolean']['output'];\n};\n\n\nexport type ProductVariantStockMovementsArgs = {\n options?: InputMaybe<StockMovementListOptions>;\n};\n\nexport type ProductVariantFilterParameter = {\n _and?: InputMaybe<Array<ProductVariantFilterParameter>>;\n _or?: InputMaybe<Array<ProductVariantFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n currencyCode?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n facetValueId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n outOfStockThreshold?: InputMaybe<NumberOperators>;\n price?: InputMaybe<NumberOperators>;\n priceWithTax?: InputMaybe<NumberOperators>;\n productId?: InputMaybe<IdOperators>;\n sku?: InputMaybe<StringOperators>;\n stockAllocated?: InputMaybe<NumberOperators>;\n stockLevel?: InputMaybe<StringOperators>;\n stockOnHand?: InputMaybe<NumberOperators>;\n trackInventory?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n useGlobalOutOfStockThreshold?: InputMaybe<BooleanOperators>;\n};\n\nexport type ProductVariantList = PaginatedList & {\n __typename?: 'ProductVariantList';\n items: Array<ProductVariant>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProductVariantListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProductVariantFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProductVariantSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProductVariantPrice = {\n __typename?: 'ProductVariantPrice';\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n price: Scalars['Money']['output'];\n};\n\nexport type ProductVariantSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n outOfStockThreshold?: InputMaybe<SortOrder>;\n price?: InputMaybe<SortOrder>;\n priceWithTax?: InputMaybe<SortOrder>;\n productId?: InputMaybe<SortOrder>;\n sku?: InputMaybe<SortOrder>;\n stockAllocated?: InputMaybe<SortOrder>;\n stockLevel?: InputMaybe<SortOrder>;\n stockOnHand?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProductVariantTranslation = {\n __typename?: 'ProductVariantTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductVariantTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type Promotion = Node & {\n __typename?: 'Promotion';\n actions: Array<ConfigurableOperation>;\n conditions: Array<ConfigurableOperation>;\n couponCode?: Maybe<Scalars['String']['output']>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n endsAt?: Maybe<Scalars['DateTime']['output']>;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n perCustomerUsageLimit?: Maybe<Scalars['Int']['output']>;\n startsAt?: Maybe<Scalars['DateTime']['output']>;\n translations: Array<PromotionTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n usageLimit?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type PromotionFilterParameter = {\n _and?: InputMaybe<Array<PromotionFilterParameter>>;\n _or?: InputMaybe<Array<PromotionFilterParameter>>;\n couponCode?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n endsAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n perCustomerUsageLimit?: InputMaybe<NumberOperators>;\n startsAt?: InputMaybe<DateOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n usageLimit?: InputMaybe<NumberOperators>;\n};\n\nexport type PromotionList = PaginatedList & {\n __typename?: 'PromotionList';\n items: Array<Promotion>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type PromotionListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<PromotionFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<PromotionSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type PromotionSortParameter = {\n couponCode?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n endsAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n perCustomerUsageLimit?: InputMaybe<SortOrder>;\n startsAt?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n usageLimit?: InputMaybe<SortOrder>;\n};\n\nexport type PromotionTranslation = {\n __typename?: 'PromotionTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PromotionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type Province = Node & Region & {\n __typename?: 'Province';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n parent?: Maybe<Region>;\n parentId?: Maybe<Scalars['ID']['output']>;\n translations: Array<RegionTranslation>;\n type: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProvinceFilterParameter = {\n _and?: InputMaybe<Array<ProvinceFilterParameter>>;\n _or?: InputMaybe<Array<ProvinceFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n parentId?: InputMaybe<IdOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ProvinceList = PaginatedList & {\n __typename?: 'ProvinceList';\n items: Array<Province>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProvinceListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProvinceFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProvinceSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProvinceSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n parentId?: InputMaybe<SortOrder>;\n type?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProvinceTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** Returned if the specified quantity of an OrderLine is greater than the number of items in that line */\nexport type QuantityTooGreatError = ErrorResult & {\n __typename?: 'QuantityTooGreatError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Query = {\n __typename?: 'Query';\n activeAdministrator?: Maybe<Administrator>;\n activeChannel: Channel;\n administrator?: Maybe<Administrator>;\n administrators: AdministratorList;\n /** Get a single Asset by id */\n asset?: Maybe<Asset>;\n /** Get a list of Assets */\n assets: AssetList;\n channel?: Maybe<Channel>;\n channels: ChannelList;\n /** Get a Collection either by id or slug. If neither id nor slug is specified, an error will result. */\n collection?: Maybe<Collection>;\n collectionFilters: Array<ConfigurableOperationDefinition>;\n collections: CollectionList;\n countries: CountryList;\n country?: Maybe<Country>;\n customer?: Maybe<Customer>;\n customerGroup?: Maybe<CustomerGroup>;\n customerGroups: CustomerGroupList;\n customers: CustomerList;\n /** Returns a list of eligible shipping methods for the draft Order */\n eligibleShippingMethodsForDraftOrder: Array<ShippingMethodQuote>;\n /** Returns all configured EntityDuplicators. */\n entityDuplicators: Array<EntityDuplicatorDefinition>;\n facet?: Maybe<Facet>;\n facetValue?: Maybe<FacetValue>;\n facetValues: FacetValueList;\n facets: FacetList;\n fulfillmentHandlers: Array<ConfigurableOperationDefinition>;\n /** Get value for a specific key (automatically scoped based on field configuration) */\n getSettingsStoreValue?: Maybe<Scalars['JSON']['output']>;\n /** Get multiple key-value pairs (each automatically scoped) */\n getSettingsStoreValues?: Maybe<Scalars['JSON']['output']>;\n globalSettings: GlobalSettings;\n job?: Maybe<Job>;\n jobBufferSize: Array<JobBufferSize>;\n jobQueues: Array<JobQueue>;\n jobs: JobList;\n jobsById: Array<Job>;\n me?: Maybe<CurrentUser>;\n /** Get metrics for the given interval and metric types. */\n metricSummary: Array<MetricSummary>;\n order?: Maybe<Order>;\n orders: OrderList;\n paymentMethod?: Maybe<PaymentMethod>;\n paymentMethodEligibilityCheckers: Array<ConfigurableOperationDefinition>;\n paymentMethodHandlers: Array<ConfigurableOperationDefinition>;\n paymentMethods: PaymentMethodList;\n pendingSearchIndexUpdates: Scalars['Int']['output'];\n /** Used for real-time previews of the contents of a Collection */\n previewCollectionVariants: ProductVariantList;\n /** Get a Product either by id or slug. If neither id nor slug is specified, an error will result. */\n product?: Maybe<Product>;\n productOption?: Maybe<ProductOption>;\n productOptionGroup?: Maybe<ProductOptionGroup>;\n productOptionGroups: Array<ProductOptionGroup>;\n productOptions: ProductOptionList;\n /** Get a ProductVariant by id */\n productVariant?: Maybe<ProductVariant>;\n /** List ProductVariants either all or for the specific product. */\n productVariants: ProductVariantList;\n /** List Products */\n products: ProductList;\n promotion?: Maybe<Promotion>;\n promotionActions: Array<ConfigurableOperationDefinition>;\n promotionConditions: Array<ConfigurableOperationDefinition>;\n promotions: PromotionList;\n province?: Maybe<Province>;\n provinces: ProvinceList;\n role?: Maybe<Role>;\n roles: RoleList;\n scheduledTasks: Array<ScheduledTask>;\n search: SearchResponse;\n seller?: Maybe<Seller>;\n sellers: SellerList;\n shippingCalculators: Array<ConfigurableOperationDefinition>;\n shippingEligibilityCheckers: Array<ConfigurableOperationDefinition>;\n shippingMethod?: Maybe<ShippingMethod>;\n shippingMethods: ShippingMethodList;\n /** Generate slug for entity */\n slugForEntity: Scalars['String']['output'];\n stockLocation?: Maybe<StockLocation>;\n stockLocations: StockLocationList;\n tag: Tag;\n tags: TagList;\n taxCategories: TaxCategoryList;\n taxCategory?: Maybe<TaxCategory>;\n taxRate?: Maybe<TaxRate>;\n taxRates: TaxRateList;\n testEligibleShippingMethods: Array<ShippingMethodQuote>;\n testShippingMethod: TestShippingMethodResult;\n zone?: Maybe<Zone>;\n zones: ZoneList;\n};\n\n\nexport type QueryAdministratorArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryAdministratorsArgs = {\n options?: InputMaybe<AdministratorListOptions>;\n};\n\n\nexport type QueryAssetArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryAssetsArgs = {\n options?: InputMaybe<AssetListOptions>;\n};\n\n\nexport type QueryChannelArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryChannelsArgs = {\n options?: InputMaybe<ChannelListOptions>;\n};\n\n\nexport type QueryCollectionArgs = {\n id?: InputMaybe<Scalars['ID']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryCollectionsArgs = {\n options?: InputMaybe<CollectionListOptions>;\n};\n\n\nexport type QueryCountriesArgs = {\n options?: InputMaybe<CountryListOptions>;\n};\n\n\nexport type QueryCountryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryCustomerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryCustomerGroupArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryCustomerGroupsArgs = {\n options?: InputMaybe<CustomerGroupListOptions>;\n};\n\n\nexport type QueryCustomersArgs = {\n options?: InputMaybe<CustomerListOptions>;\n};\n\n\nexport type QueryEligibleShippingMethodsForDraftOrderArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type QueryFacetArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryFacetValueArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryFacetValuesArgs = {\n options?: InputMaybe<FacetValueListOptions>;\n};\n\n\nexport type QueryFacetsArgs = {\n options?: InputMaybe<FacetListOptions>;\n};\n\n\nexport type QueryGetSettingsStoreValueArgs = {\n key: Scalars['String']['input'];\n};\n\n\nexport type QueryGetSettingsStoreValuesArgs = {\n keys: Array<Scalars['String']['input']>;\n};\n\n\nexport type QueryJobArgs = {\n jobId: Scalars['ID']['input'];\n};\n\n\nexport type QueryJobBufferSizeArgs = {\n bufferIds?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n\nexport type QueryJobsArgs = {\n options?: InputMaybe<JobListOptions>;\n};\n\n\nexport type QueryJobsByIdArgs = {\n jobIds: Array<Scalars['ID']['input']>;\n};\n\n\nexport type QueryMetricSummaryArgs = {\n input?: InputMaybe<MetricSummaryInput>;\n};\n\n\nexport type QueryOrderArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryOrdersArgs = {\n options?: InputMaybe<OrderListOptions>;\n};\n\n\nexport type QueryPaymentMethodArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryPaymentMethodsArgs = {\n options?: InputMaybe<PaymentMethodListOptions>;\n};\n\n\nexport type QueryPreviewCollectionVariantsArgs = {\n input: PreviewCollectionVariantsInput;\n options?: InputMaybe<ProductVariantListOptions>;\n};\n\n\nexport type QueryProductArgs = {\n id?: InputMaybe<Scalars['ID']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryProductOptionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProductOptionGroupArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProductOptionGroupsArgs = {\n filterTerm?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryProductOptionsArgs = {\n groupId?: InputMaybe<Scalars['ID']['input']>;\n options?: InputMaybe<ProductOptionListOptions>;\n};\n\n\nexport type QueryProductVariantArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProductVariantsArgs = {\n options?: InputMaybe<ProductVariantListOptions>;\n productId?: InputMaybe<Scalars['ID']['input']>;\n};\n\n\nexport type QueryProductsArgs = {\n options?: InputMaybe<ProductListOptions>;\n};\n\n\nexport type QueryPromotionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryPromotionsArgs = {\n options?: InputMaybe<PromotionListOptions>;\n};\n\n\nexport type QueryProvinceArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProvincesArgs = {\n options?: InputMaybe<ProvinceListOptions>;\n};\n\n\nexport type QueryRoleArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryRolesArgs = {\n options?: InputMaybe<RoleListOptions>;\n};\n\n\nexport type QuerySearchArgs = {\n input: SearchInput;\n};\n\n\nexport type QuerySellerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QuerySellersArgs = {\n options?: InputMaybe<SellerListOptions>;\n};\n\n\nexport type QueryShippingMethodArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryShippingMethodsArgs = {\n options?: InputMaybe<ShippingMethodListOptions>;\n};\n\n\nexport type QuerySlugForEntityArgs = {\n input: SlugForEntityInput;\n};\n\n\nexport type QueryStockLocationArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryStockLocationsArgs = {\n options?: InputMaybe<StockLocationListOptions>;\n};\n\n\nexport type QueryTagArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTagsArgs = {\n options?: InputMaybe<TagListOptions>;\n};\n\n\nexport type QueryTaxCategoriesArgs = {\n options?: InputMaybe<TaxCategoryListOptions>;\n};\n\n\nexport type QueryTaxCategoryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTaxRateArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTaxRatesArgs = {\n options?: InputMaybe<TaxRateListOptions>;\n};\n\n\nexport type QueryTestEligibleShippingMethodsArgs = {\n input: TestEligibleShippingMethodsInput;\n};\n\n\nexport type QueryTestShippingMethodArgs = {\n input: TestShippingMethodInput;\n};\n\n\nexport type QueryZoneArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryZonesArgs = {\n options?: InputMaybe<ZoneListOptions>;\n};\n\nexport type Refund = Node & {\n __typename?: 'Refund';\n adjustment: Scalars['Money']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n items: Scalars['Money']['output'];\n lines: Array<RefundLine>;\n metadata?: Maybe<Scalars['JSON']['output']>;\n method?: Maybe<Scalars['String']['output']>;\n paymentId: Scalars['ID']['output'];\n reason?: Maybe<Scalars['String']['output']>;\n shipping: Scalars['Money']['output'];\n state: Scalars['String']['output'];\n total: Scalars['Money']['output'];\n transactionId?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned if `amount` is greater than the maximum un-refunded amount of the Payment */\nexport type RefundAmountError = ErrorResult & {\n __typename?: 'RefundAmountError';\n errorCode: ErrorCode;\n maximumRefundable: Scalars['Int']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type RefundLine = {\n __typename?: 'RefundLine';\n orderLine: OrderLine;\n orderLineId: Scalars['ID']['output'];\n quantity: Scalars['Int']['output'];\n refund: Refund;\n refundId: Scalars['ID']['output'];\n};\n\nexport type RefundOrderInput = {\n /** @deprecated Use the `amount` field instead */\n adjustment?: InputMaybe<Scalars['Money']['input']>;\n /**\n * The amount to be refunded to this particular payment. This was introduced in v2.2.0 as the preferred way to specify the refund amount.\n * Can be as much as the total amount of the payment minus the sum of all previous refunds.\n */\n amount?: InputMaybe<Scalars['Money']['input']>;\n /** @deprecated Use the `amount` field instead */\n lines?: InputMaybe<Array<OrderLineInput>>;\n paymentId: Scalars['ID']['input'];\n reason?: InputMaybe<Scalars['String']['input']>;\n /** @deprecated Use the `amount` field instead */\n shipping?: InputMaybe<Scalars['Money']['input']>;\n};\n\nexport type RefundOrderResult = AlreadyRefundedError | MultipleOrderError | NothingToRefundError | OrderStateTransitionError | PaymentOrderMismatchError | QuantityTooGreatError | Refund | RefundAmountError | RefundOrderStateError | RefundStateTransitionError;\n\n/** Returned if an attempting to refund an Order which is not in the expected state */\nexport type RefundOrderStateError = ErrorResult & {\n __typename?: 'RefundOrderStateError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n orderState: Scalars['String']['output'];\n};\n\n/**\n * Returned when a call to modifyOrder fails to include a refundPaymentId even\n * though the price has decreased as a result of the changes.\n */\nexport type RefundPaymentIdMissingError = ErrorResult & {\n __typename?: 'RefundPaymentIdMissingError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when there is an error in transitioning the Refund state */\nexport type RefundStateTransitionError = ErrorResult & {\n __typename?: 'RefundStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\nexport type Region = {\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n parent?: Maybe<Region>;\n parentId?: Maybe<Scalars['ID']['output']>;\n translations: Array<RegionTranslation>;\n type: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RegionTranslation = {\n __typename?: 'RegionTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RelationCustomFieldConfig = CustomField & {\n __typename?: 'RelationCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n entity: Scalars['String']['output'];\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n scalarFields: Array<Scalars['String']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type Release = Node & StockMovement & {\n __typename?: 'Release';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RemoveCollectionsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n collectionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveFacetFromChannelResult = Facet | FacetInUseError;\n\nexport type RemoveFacetsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n facetIds: Array<Scalars['ID']['input']>;\n force?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type RemoveOptionGroupFromProductResult = Product | ProductOptionInUseError;\n\nexport type RemoveOrderItemsResult = Order | OrderInterceptorError | OrderModificationError;\n\nexport type RemovePaymentMethodsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n paymentMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveProductVariantsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n productVariantIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveProductsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n productIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemovePromotionsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n promotionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveShippingMethodsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n shippingMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveStockLocationsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n stockLocationIds: Array<Scalars['ID']['input']>;\n};\n\nexport type Return = Node & StockMovement & {\n __typename?: 'Return';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type Role = Node & {\n __typename?: 'Role';\n channels: Array<Channel>;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n permissions: Array<Permission>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RoleFilterParameter = {\n _and?: InputMaybe<Array<RoleFilterParameter>>;\n _or?: InputMaybe<Array<RoleFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type RoleList = PaginatedList & {\n __typename?: 'RoleList';\n items: Array<Role>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type RoleListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<RoleFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<RoleSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RoleSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type Sale = Node & StockMovement & {\n __typename?: 'Sale';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ScheduledTask = {\n __typename?: 'ScheduledTask';\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n id: Scalars['String']['output'];\n isRunning: Scalars['Boolean']['output'];\n lastExecutedAt?: Maybe<Scalars['DateTime']['output']>;\n lastResult?: Maybe<Scalars['JSON']['output']>;\n nextExecutionAt?: Maybe<Scalars['DateTime']['output']>;\n schedule: Scalars['String']['output'];\n scheduleDescription: Scalars['String']['output'];\n};\n\nexport type SearchInput = {\n collectionId?: InputMaybe<Scalars['ID']['input']>;\n collectionSlug?: InputMaybe<Scalars['String']['input']>;\n facetValueFilters?: InputMaybe<Array<FacetValueFilterInput>>;\n /** @deprecated Use `facetValueFilters` instead */\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n /** @deprecated Use `facetValueFilters` instead */\n facetValueOperator?: InputMaybe<LogicalOperator>;\n groupByProduct?: InputMaybe<Scalars['Boolean']['input']>;\n skip?: InputMaybe<Scalars['Int']['input']>;\n sort?: InputMaybe<SearchResultSortParameter>;\n take?: InputMaybe<Scalars['Int']['input']>;\n term?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type SearchReindexResponse = {\n __typename?: 'SearchReindexResponse';\n success: Scalars['Boolean']['output'];\n};\n\nexport type SearchResponse = {\n __typename?: 'SearchResponse';\n collections: Array<CollectionResult>;\n facetValues: Array<FacetValueResult>;\n items: Array<SearchResult>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type SearchResult = {\n __typename?: 'SearchResult';\n /** An array of ids of the Channels in which this result appears */\n channelIds: Array<Scalars['ID']['output']>;\n /** An array of ids of the Collections in which this result appears */\n collectionIds: Array<Scalars['ID']['output']>;\n currencyCode: CurrencyCode;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n facetIds: Array<Scalars['ID']['output']>;\n facetValueIds: Array<Scalars['ID']['output']>;\n price: SearchResultPrice;\n priceWithTax: SearchResultPrice;\n productAsset?: Maybe<SearchResultAsset>;\n productId: Scalars['ID']['output'];\n productName: Scalars['String']['output'];\n productVariantAsset?: Maybe<SearchResultAsset>;\n productVariantId: Scalars['ID']['output'];\n productVariantName: Scalars['String']['output'];\n /** A relevance score for the result. Differs between database implementations */\n score: Scalars['Float']['output'];\n sku: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n};\n\nexport type SearchResultAsset = {\n __typename?: 'SearchResultAsset';\n focalPoint?: Maybe<Coordinate>;\n id: Scalars['ID']['output'];\n preview: Scalars['String']['output'];\n};\n\n/** The price of a search result product, either as a range or as a single price */\nexport type SearchResultPrice = PriceRange | SinglePrice;\n\nexport type SearchResultSortParameter = {\n name?: InputMaybe<SortOrder>;\n price?: InputMaybe<SortOrder>;\n};\n\nexport type Seller = Node & {\n __typename?: 'Seller';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type SellerFilterParameter = {\n _and?: InputMaybe<Array<SellerFilterParameter>>;\n _or?: InputMaybe<Array<SellerFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type SellerList = PaginatedList & {\n __typename?: 'SellerList';\n items: Array<Seller>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type SellerListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<SellerFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<SellerSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type SellerSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ServerConfig = {\n __typename?: 'ServerConfig';\n /**\n * This field is deprecated in v2.2 in favor of the entityCustomFields field,\n * which allows custom fields to be defined on user-supplies entities.\n */\n customFieldConfig: CustomFields;\n entityCustomFields: Array<EntityCustomFields>;\n moneyStrategyPrecision: Scalars['Int']['output'];\n orderProcess: Array<OrderProcessState>;\n permissions: Array<PermissionDefinition>;\n permittedAssetTypes: Array<Scalars['String']['output']>;\n};\n\nexport type SetCustomerForDraftOrderResult = EmailAddressConflictError | Order;\n\nexport type SetOrderCustomerInput = {\n customerId: Scalars['ID']['input'];\n note?: InputMaybe<Scalars['String']['input']>;\n orderId: Scalars['ID']['input'];\n};\n\nexport type SetOrderShippingMethodResult = IneligibleShippingMethodError | NoActiveOrderError | Order | OrderModificationError;\n\nexport type SetSettingsStoreValueResult = {\n __typename?: 'SetSettingsStoreValueResult';\n error?: Maybe<Scalars['String']['output']>;\n key: Scalars['String']['output'];\n result: Scalars['Boolean']['output'];\n};\n\nexport type SettingsStoreInput = {\n key: Scalars['String']['input'];\n value: Scalars['JSON']['input'];\n};\n\n/** Returned if the Payment settlement fails */\nexport type SettlePaymentError = ErrorResult & {\n __typename?: 'SettlePaymentError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n paymentErrorMessage: Scalars['String']['output'];\n};\n\nexport type SettlePaymentResult = OrderStateTransitionError | Payment | PaymentStateTransitionError | SettlePaymentError;\n\nexport type SettleRefundInput = {\n id: Scalars['ID']['input'];\n transactionId: Scalars['String']['input'];\n};\n\nexport type SettleRefundResult = Refund | RefundStateTransitionError;\n\nexport type ShippingLine = {\n __typename?: 'ShippingLine';\n customFields?: Maybe<Scalars['JSON']['output']>;\n discountedPrice: Scalars['Money']['output'];\n discountedPriceWithTax: Scalars['Money']['output'];\n discounts: Array<Discount>;\n id: Scalars['ID']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n shippingMethod: ShippingMethod;\n};\n\nexport type ShippingMethod = Node & {\n __typename?: 'ShippingMethod';\n calculator: ConfigurableOperation;\n checker: ConfigurableOperation;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n fulfillmentHandlerCode: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<ShippingMethodTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ShippingMethodFilterParameter = {\n _and?: InputMaybe<Array<ShippingMethodFilterParameter>>;\n _or?: InputMaybe<Array<ShippingMethodFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n fulfillmentHandlerCode?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ShippingMethodList = PaginatedList & {\n __typename?: 'ShippingMethodList';\n items: Array<ShippingMethod>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ShippingMethodListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ShippingMethodFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ShippingMethodSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ShippingMethodQuote = {\n __typename?: 'ShippingMethodQuote';\n code: Scalars['String']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n /** Any optional metadata returned by the ShippingCalculator in the ShippingCalculationResult */\n metadata?: Maybe<Scalars['JSON']['output']>;\n name: Scalars['String']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n};\n\nexport type ShippingMethodSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n fulfillmentHandlerCode?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ShippingMethodTranslation = {\n __typename?: 'ShippingMethodTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ShippingMethodTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The price value where the result has a single price */\nexport type SinglePrice = {\n __typename?: 'SinglePrice';\n value: Scalars['Money']['output'];\n};\n\nexport type SlugForEntityInput = {\n entityId?: InputMaybe<Scalars['ID']['input']>;\n entityName: Scalars['String']['input'];\n fieldName: Scalars['String']['input'];\n inputValue: Scalars['String']['input'];\n};\n\nexport enum SortOrder {\n ASC = 'ASC',\n DESC = 'DESC'\n}\n\nexport type StockAdjustment = Node & StockMovement & {\n __typename?: 'StockAdjustment';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockLevel = Node & {\n __typename?: 'StockLevel';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n stockAllocated: Scalars['Int']['output'];\n stockLocation: StockLocation;\n stockLocationId: Scalars['ID']['output'];\n stockOnHand: Scalars['Int']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockLevelInput = {\n stockLocationId: Scalars['ID']['input'];\n stockOnHand: Scalars['Int']['input'];\n};\n\nexport type StockLocation = Node & {\n __typename?: 'StockLocation';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockLocationFilterParameter = {\n _and?: InputMaybe<Array<StockLocationFilterParameter>>;\n _or?: InputMaybe<Array<StockLocationFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type StockLocationList = PaginatedList & {\n __typename?: 'StockLocationList';\n items: Array<StockLocation>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type StockLocationListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<StockLocationFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<StockLocationSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type StockLocationSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type StockMovement = {\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockMovementItem = Allocation | Cancellation | Release | Return | Sale | StockAdjustment;\n\nexport type StockMovementList = {\n __typename?: 'StockMovementList';\n items: Array<StockMovementItem>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type StockMovementListOptions = {\n skip?: InputMaybe<Scalars['Int']['input']>;\n take?: InputMaybe<Scalars['Int']['input']>;\n type?: InputMaybe<StockMovementType>;\n};\n\nexport enum StockMovementType {\n ADJUSTMENT = 'ADJUSTMENT',\n ALLOCATION = 'ALLOCATION',\n CANCELLATION = 'CANCELLATION',\n RELEASE = 'RELEASE',\n RETURN = 'RETURN',\n SALE = 'SALE'\n}\n\nexport type StringCustomFieldConfig = CustomField & {\n __typename?: 'StringCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n length?: Maybe<Scalars['Int']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n options?: Maybe<Array<StringFieldOption>>;\n pattern?: Maybe<Scalars['String']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StringFieldOption = {\n __typename?: 'StringFieldOption';\n label?: Maybe<Array<LocalizedString>>;\n value: Scalars['String']['output'];\n};\n\n/** Operators for filtering on a list of String fields */\nexport type StringListOperators = {\n inList: Scalars['String']['input'];\n};\n\n/** Operators for filtering on a String field */\nexport type StringOperators = {\n contains?: InputMaybe<Scalars['String']['input']>;\n eq?: InputMaybe<Scalars['String']['input']>;\n in?: InputMaybe<Array<Scalars['String']['input']>>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n notContains?: InputMaybe<Scalars['String']['input']>;\n notEq?: InputMaybe<Scalars['String']['input']>;\n notIn?: InputMaybe<Array<Scalars['String']['input']>>;\n regex?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type StringStructFieldConfig = StructField & {\n __typename?: 'StringStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n length?: Maybe<Scalars['Int']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n options?: Maybe<Array<StringFieldOption>>;\n pattern?: Maybe<Scalars['String']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StructCustomFieldConfig = CustomField & {\n __typename?: 'StructCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n fields: Array<StructFieldConfig>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StructField = {\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list?: Maybe<Scalars['Boolean']['output']>;\n name: Scalars['String']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StructFieldConfig = BooleanStructFieldConfig | DateTimeStructFieldConfig | FloatStructFieldConfig | IntStructFieldConfig | StringStructFieldConfig | TextStructFieldConfig;\n\n/** Indicates that an operation succeeded, where we do not want to return any more specific information. */\nexport type Success = {\n __typename?: 'Success';\n success: Scalars['Boolean']['output'];\n};\n\nexport type Surcharge = Node & {\n __typename?: 'Surcharge';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n sku?: Maybe<Scalars['String']['output']>;\n taxLines: Array<TaxLine>;\n taxRate: Scalars['Float']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type SurchargeInput = {\n description: Scalars['String']['input'];\n price: Scalars['Money']['input'];\n priceIncludesTax: Scalars['Boolean']['input'];\n sku?: InputMaybe<Scalars['String']['input']>;\n taxDescription?: InputMaybe<Scalars['String']['input']>;\n taxRate?: InputMaybe<Scalars['Float']['input']>;\n};\n\nexport type Tag = Node & {\n __typename?: 'Tag';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n updatedAt: Scalars['DateTime']['output'];\n value: Scalars['String']['output'];\n};\n\nexport type TagFilterParameter = {\n _and?: InputMaybe<Array<TagFilterParameter>>;\n _or?: InputMaybe<Array<TagFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n value?: InputMaybe<StringOperators>;\n};\n\nexport type TagList = PaginatedList & {\n __typename?: 'TagList';\n items: Array<Tag>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type TagListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<TagFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<TagSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type TagSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n value?: InputMaybe<SortOrder>;\n};\n\nexport type TaxCategory = Node & {\n __typename?: 'TaxCategory';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n isDefault: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type TaxCategoryFilterParameter = {\n _and?: InputMaybe<Array<TaxCategoryFilterParameter>>;\n _or?: InputMaybe<Array<TaxCategoryFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n isDefault?: InputMaybe<BooleanOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type TaxCategoryList = PaginatedList & {\n __typename?: 'TaxCategoryList';\n items: Array<TaxCategory>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type TaxCategoryListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<TaxCategoryFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<TaxCategorySortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type TaxCategorySortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type TaxLine = {\n __typename?: 'TaxLine';\n description: Scalars['String']['output'];\n taxRate: Scalars['Float']['output'];\n};\n\nexport type TaxRate = Node & {\n __typename?: 'TaxRate';\n category: TaxCategory;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n customerGroup?: Maybe<CustomerGroup>;\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n value: Scalars['Float']['output'];\n zone: Zone;\n};\n\nexport type TaxRateFilterParameter = {\n _and?: InputMaybe<Array<TaxRateFilterParameter>>;\n _or?: InputMaybe<Array<TaxRateFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n value?: InputMaybe<NumberOperators>;\n};\n\nexport type TaxRateList = PaginatedList & {\n __typename?: 'TaxRateList';\n items: Array<TaxRate>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type TaxRateListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<TaxRateFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<TaxRateSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type TaxRateSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n value?: InputMaybe<SortOrder>;\n};\n\nexport type TestEligibleShippingMethodsInput = {\n lines: Array<TestShippingMethodOrderLineInput>;\n shippingAddress: CreateAddressInput;\n};\n\nexport type TestShippingMethodInput = {\n calculator: ConfigurableOperationInput;\n checker: ConfigurableOperationInput;\n lines: Array<TestShippingMethodOrderLineInput>;\n shippingAddress: CreateAddressInput;\n};\n\nexport type TestShippingMethodOrderLineInput = {\n productVariantId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type TestShippingMethodQuote = {\n __typename?: 'TestShippingMethodQuote';\n metadata?: Maybe<Scalars['JSON']['output']>;\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n};\n\nexport type TestShippingMethodResult = {\n __typename?: 'TestShippingMethodResult';\n eligible: Scalars['Boolean']['output'];\n quote?: Maybe<TestShippingMethodQuote>;\n};\n\nexport type TextCustomFieldConfig = CustomField & {\n __typename?: 'TextCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type TextStructFieldConfig = StructField & {\n __typename?: 'TextStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type TransitionFulfillmentToStateResult = Fulfillment | FulfillmentStateTransitionError;\n\nexport type TransitionOrderToStateResult = Order | OrderStateTransitionError;\n\nexport type TransitionPaymentToStateResult = Payment | PaymentStateTransitionError;\n\nexport type UpdateActiveAdministratorInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress?: InputMaybe<Scalars['String']['input']>;\n firstName?: InputMaybe<Scalars['String']['input']>;\n lastName?: InputMaybe<Scalars['String']['input']>;\n password?: InputMaybe<Scalars['String']['input']>;\n};\n\n/**\n * Input used to update an Address.\n *\n * The countryCode must correspond to a `code` property of a Country that has been defined in the\n * Vendure server. The `code` property is typically a 2-character ISO code such as \"GB\", \"US\", \"DE\" etc.\n * If an invalid code is passed, the mutation will fail.\n */\nexport type UpdateAddressInput = {\n city?: InputMaybe<Scalars['String']['input']>;\n company?: InputMaybe<Scalars['String']['input']>;\n countryCode?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultBillingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n defaultShippingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n fullName?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n postalCode?: InputMaybe<Scalars['String']['input']>;\n province?: InputMaybe<Scalars['String']['input']>;\n streetLine1?: InputMaybe<Scalars['String']['input']>;\n streetLine2?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateAdministratorInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress?: InputMaybe<Scalars['String']['input']>;\n firstName?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n lastName?: InputMaybe<Scalars['String']['input']>;\n password?: InputMaybe<Scalars['String']['input']>;\n roleIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type UpdateAssetInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n focalPoint?: InputMaybe<CoordinateInput>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n tags?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type UpdateChannelInput = {\n availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;\n availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;\n code?: InputMaybe<Scalars['String']['input']>;\n /** @deprecated Use defaultCurrencyCode instead */\n currencyCode?: InputMaybe<CurrencyCode>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultCurrencyCode?: InputMaybe<CurrencyCode>;\n defaultLanguageCode?: InputMaybe<LanguageCode>;\n defaultShippingZoneId?: InputMaybe<Scalars['ID']['input']>;\n defaultTaxZoneId?: InputMaybe<Scalars['ID']['input']>;\n id: Scalars['ID']['input'];\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n pricesIncludeTax?: InputMaybe<Scalars['Boolean']['input']>;\n sellerId?: InputMaybe<Scalars['ID']['input']>;\n token?: InputMaybe<Scalars['String']['input']>;\n trackInventory?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type UpdateChannelResult = Channel | LanguageNotAvailableError;\n\nexport type UpdateCollectionInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n filters?: InputMaybe<Array<ConfigurableOperationInput>>;\n id: Scalars['ID']['input'];\n inheritFilters?: InputMaybe<Scalars['Boolean']['input']>;\n isPrivate?: InputMaybe<Scalars['Boolean']['input']>;\n parentId?: InputMaybe<Scalars['ID']['input']>;\n translations?: InputMaybe<Array<UpdateCollectionTranslationInput>>;\n};\n\nexport type UpdateCollectionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateCountryInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<CountryTranslationInput>>;\n};\n\nexport type UpdateCustomerGroupInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateCustomerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress?: InputMaybe<Scalars['String']['input']>;\n firstName?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n lastName?: InputMaybe<Scalars['String']['input']>;\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n title?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateCustomerNoteInput = {\n note: Scalars['String']['input'];\n noteId: Scalars['ID']['input'];\n};\n\nexport type UpdateCustomerResult = Customer | EmailAddressConflictError;\n\nexport type UpdateFacetInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n isPrivate?: InputMaybe<Scalars['Boolean']['input']>;\n translations?: InputMaybe<Array<FacetTranslationInput>>;\n};\n\nexport type UpdateFacetValueInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<FacetValueTranslationInput>>;\n};\n\nexport type UpdateGlobalSettingsInput = {\n availableLanguages?: InputMaybe<Array<LanguageCode>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n trackInventory?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type UpdateGlobalSettingsResult = ChannelDefaultLanguageError | GlobalSettings;\n\nexport type UpdateOrderAddressInput = {\n city?: InputMaybe<Scalars['String']['input']>;\n company?: InputMaybe<Scalars['String']['input']>;\n countryCode?: InputMaybe<Scalars['String']['input']>;\n fullName?: InputMaybe<Scalars['String']['input']>;\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n postalCode?: InputMaybe<Scalars['String']['input']>;\n province?: InputMaybe<Scalars['String']['input']>;\n streetLine1?: InputMaybe<Scalars['String']['input']>;\n streetLine2?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateOrderInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n};\n\n/** Union type of all possible errors that can occur when adding or removing items from an Order. */\nexport type UpdateOrderItemErrorResult = InsufficientStockError | NegativeQuantityError | OrderInterceptorError | OrderLimitError | OrderModificationError;\n\nexport type UpdateOrderItemsResult = InsufficientStockError | NegativeQuantityError | Order | OrderInterceptorError | OrderLimitError | OrderModificationError;\n\nexport type UpdateOrderNoteInput = {\n isPublic?: InputMaybe<Scalars['Boolean']['input']>;\n note?: InputMaybe<Scalars['String']['input']>;\n noteId: Scalars['ID']['input'];\n};\n\nexport type UpdatePaymentMethodInput = {\n checker?: InputMaybe<ConfigurableOperationInput>;\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n handler?: InputMaybe<ConfigurableOperationInput>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<PaymentMethodTranslationInput>>;\n};\n\nexport type UpdateProductInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProductTranslationInput>>;\n};\n\nexport type UpdateProductOptionGroupInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProductOptionGroupTranslationInput>>;\n};\n\nexport type UpdateProductOptionInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProductOptionGroupTranslationInput>>;\n};\n\nexport type UpdateProductVariantInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n id: Scalars['ID']['input'];\n optionIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n /** Sets the price for the ProductVariant in the Channel's default currency */\n price?: InputMaybe<Scalars['Money']['input']>;\n /** Allows multiple prices to be set for the ProductVariant in different currencies. */\n prices?: InputMaybe<Array<UpdateProductVariantPriceInput>>;\n sku?: InputMaybe<Scalars['String']['input']>;\n stockLevels?: InputMaybe<Array<StockLevelInput>>;\n stockOnHand?: InputMaybe<Scalars['Int']['input']>;\n taxCategoryId?: InputMaybe<Scalars['ID']['input']>;\n trackInventory?: InputMaybe<GlobalFlag>;\n translations?: InputMaybe<Array<ProductVariantTranslationInput>>;\n useGlobalOutOfStockThreshold?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\n/**\n * Used to set up update the price of a ProductVariant in a particular Channel.\n * If the `delete` flag is `true`, the price will be deleted for the given Channel.\n */\nexport type UpdateProductVariantPriceInput = {\n currencyCode: CurrencyCode;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n delete?: InputMaybe<Scalars['Boolean']['input']>;\n price: Scalars['Money']['input'];\n};\n\nexport type UpdatePromotionInput = {\n actions?: InputMaybe<Array<ConfigurableOperationInput>>;\n conditions?: InputMaybe<Array<ConfigurableOperationInput>>;\n couponCode?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n endsAt?: InputMaybe<Scalars['DateTime']['input']>;\n id: Scalars['ID']['input'];\n perCustomerUsageLimit?: InputMaybe<Scalars['Int']['input']>;\n startsAt?: InputMaybe<Scalars['DateTime']['input']>;\n translations?: InputMaybe<Array<PromotionTranslationInput>>;\n usageLimit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type UpdatePromotionResult = MissingConditionsError | Promotion;\n\nexport type UpdateProvinceInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProvinceTranslationInput>>;\n};\n\nexport type UpdateRoleInput = {\n channelIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n code?: InputMaybe<Scalars['String']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n permissions?: InputMaybe<Array<Permission>>;\n};\n\nexport type UpdateScheduledTaskInput = {\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['String']['input'];\n};\n\nexport type UpdateSellerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateShippingMethodInput = {\n calculator?: InputMaybe<ConfigurableOperationInput>;\n checker?: InputMaybe<ConfigurableOperationInput>;\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n fulfillmentHandler?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n translations: Array<ShippingMethodTranslationInput>;\n};\n\nexport type UpdateStockLocationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateTagInput = {\n id: Scalars['ID']['input'];\n value?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateTaxCategoryInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n isDefault?: InputMaybe<Scalars['Boolean']['input']>;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateTaxRateInput = {\n categoryId?: InputMaybe<Scalars['ID']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n customerGroupId?: InputMaybe<Scalars['ID']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n value?: InputMaybe<Scalars['Float']['input']>;\n zoneId?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type UpdateZoneInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type User = Node & {\n __typename?: 'User';\n authenticationMethods: Array<AuthenticationMethod>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n identifier: Scalars['String']['output'];\n lastLogin?: Maybe<Scalars['DateTime']['output']>;\n roles: Array<Role>;\n updatedAt: Scalars['DateTime']['output'];\n verified: Scalars['Boolean']['output'];\n};\n\nexport type Zone = Node & {\n __typename?: 'Zone';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n members: Array<Region>;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ZoneFilterParameter = {\n _and?: InputMaybe<Array<ZoneFilterParameter>>;\n _or?: InputMaybe<Array<ZoneFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ZoneList = PaginatedList & {\n __typename?: 'ZoneList';\n items: Array<Zone>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ZoneListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ZoneFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ZoneSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ZoneSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n", "import { NgModule } from '@angular/core';\nimport { RouterModule, ROUTES } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n AssetDetailQueryDocument,\n BulkActionRegistryService,\n CollectionDetailQueryDocument,\n detailComponentWithResolver,\n GetFacetDetailDocument,\n GetProductDetailDocument,\n GetProductVariantDetailDocument,\n PageService,\n SharedModule,\n} from '@vendure/admin-ui/core';\nimport { SortOrder } from '@vendure/common/lib/generated-types';\n\nimport { createRoutes } from './catalog.routes';\nimport { ApplyFacetDialogComponent } from './components/apply-facet-dialog/apply-facet-dialog.component';\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\nimport { AssignProductsToChannelDialogComponent } from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { BulkAddFacetValuesDialogComponent } from './components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\nimport { CollectionContentsComponent } from './components/collection-contents/collection-contents.component';\nimport { CollectionDataTableComponent } from './components/collection-data-table/collection-data-table.component';\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\nimport { CollectionBreadcrumbPipe } from './components/collection-list/collection-breadcrumb.pipe';\nimport {\n assignCollectionsToChannelBulkAction,\n deleteCollectionsBulkAction,\n duplicateCollectionsBulkAction,\n moveCollectionsBulkAction,\n removeCollectionsFromChannelBulkAction,\n} from './components/collection-list/collection-list-bulk-actions';\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\nimport { CollectionTreeNodeComponent } from './components/collection-tree/collection-tree-node.component';\nimport { CollectionTreeComponent } from './components/collection-tree/collection-tree.component';\nimport { ConfirmVariantDeletionDialogComponent } from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\nimport { CreateFacetValueDialogComponent } from './components/create-facet-value-dialog/create-facet-value-dialog.component';\nimport { CreateProductOptionGroupDialogComponent } from './components/create-product-option-group-dialog/create-product-option-group-dialog.component';\nimport { CreateProductVariantDialogComponent } from './components/create-product-variant-dialog/create-product-variant-dialog.component';\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\nimport {\n assignFacetsToChannelBulkAction,\n deleteFacetsBulkAction,\n duplicateFacetsBulkAction,\n removeFacetsFromChannelBulkAction,\n} from './components/facet-list/facet-list-bulk-actions';\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\nimport { GenerateProductVariantsComponent } from './components/generate-product-variants/generate-product-variants.component';\nimport { MoveCollectionsDialogComponent } from './components/move-collections-dialog/move-collections-dialog.component';\nimport { OptionValueInputComponent } from './components/option-value-input/option-value-input.component';\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\nimport {\n assignFacetValuesToProductsBulkAction,\n assignProductsToChannelBulkAction,\n deleteProductsBulkAction,\n duplicateProductsBulkAction,\n removeProductsFromChannelBulkAction,\n} from './components/product-list/product-list-bulk-actions';\nimport { ProductListComponent } from './components/product-list/product-list.component';\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\nimport { ProductVariantDetailComponent } from './components/product-variant-detail/product-variant-detail.component';\nimport {\n assignFacetValuesToProductVariantsBulkAction,\n assignProductVariantsToChannelBulkAction,\n deleteProductVariantsBulkAction,\n removeProductVariantsFromChannelBulkAction,\n} from './components/product-variant-list/product-variant-list-bulk-actions';\nimport { ProductVariantListComponent } from './components/product-variant-list/product-variant-list.component';\nimport { ProductVariantQuickJumpComponent } from './components/product-variant-quick-jump/product-variant-quick-jump.component';\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\nimport { UpdateProductOptionDialogComponent } from './components/update-product-option-dialog/update-product-option-dialog.component';\nimport { VariantPriceDetailComponent } from './components/variant-price-detail/variant-price-detail.component';\nimport { VariantPriceStrategyDetailComponent } from './components/variant-price-strategy-detail/variant-price-strategy-detail.component';\n\nconst CATALOG_COMPONENTS = [\n ProductListComponent,\n ProductDetailComponent,\n FacetListComponent,\n FacetDetailComponent,\n GenerateProductVariantsComponent,\n ApplyFacetDialogComponent,\n AssetListComponent,\n VariantPriceDetailComponent,\n VariantPriceStrategyDetailComponent,\n CollectionListComponent,\n CollectionDetailComponent,\n CollectionTreeComponent,\n CollectionTreeNodeComponent,\n CollectionContentsComponent,\n ProductVariantsTableComponent,\n OptionValueInputComponent,\n UpdateProductOptionDialogComponent,\n ProductVariantsEditorComponent,\n AssignProductsToChannelDialogComponent,\n AssetDetailComponent,\n ConfirmVariantDeletionDialogComponent,\n ProductOptionsEditorComponent,\n BulkAddFacetValuesDialogComponent,\n CollectionDataTableComponent,\n CollectionBreadcrumbPipe,\n MoveCollectionsDialogComponent,\n ProductVariantListComponent,\n ProductDetailComponent,\n ProductVariantDetailComponent,\n CreateProductVariantDialogComponent,\n CreateProductOptionGroupDialogComponent,\n ProductVariantQuickJumpComponent,\n CreateFacetValueDialogComponent,\n];\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild([])],\n exports: [...CATALOG_COMPONENTS],\n declarations: [...CATALOG_COMPONENTS],\n providers: [\n {\n provide: ROUTES,\n useFactory: (pageService: PageService) => createRoutes(pageService),\n multi: true,\n deps: [PageService],\n },\n ],\n})\nexport class CatalogModule {\n private static hasRegisteredTabsAndBulkActions = false;\n\n constructor(bulkActionRegistryService: BulkActionRegistryService, pageService: PageService) {\n if (CatalogModule.hasRegisteredTabsAndBulkActions) {\n return;\n }\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductsBulkAction);\n bulkActionRegistryService.registerBulkAction(assignProductsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(duplicateProductsBulkAction);\n bulkActionRegistryService.registerBulkAction(removeProductsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteProductsBulkAction);\n\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductVariantsBulkAction);\n bulkActionRegistryService.registerBulkAction(assignProductVariantsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(removeProductVariantsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteProductVariantsBulkAction);\n\n bulkActionRegistryService.registerBulkAction(assignFacetsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(duplicateFacetsBulkAction);\n bulkActionRegistryService.registerBulkAction(removeFacetsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteFacetsBulkAction);\n\n bulkActionRegistryService.registerBulkAction(moveCollectionsBulkAction);\n bulkActionRegistryService.registerBulkAction(assignCollectionsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(duplicateCollectionsBulkAction);\n bulkActionRegistryService.registerBulkAction(removeCollectionsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteCollectionsBulkAction);\n\n pageService.registerPageTab({\n priority: 0,\n location: 'product-list',\n tab: _('catalog.products'),\n route: '',\n component: ProductListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'product-detail',\n tab: _('catalog.product'),\n route: '',\n component: detailComponentWithResolver({\n component: ProductDetailComponent,\n query: GetProductDetailDocument,\n entityKey: 'product',\n getBreadcrumbs: entity => [\n {\n label: entity ? entity.name : _('catalog.create-new-product'),\n link: [entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'product-list',\n tab: _('catalog.product-variants'),\n route: 'variants',\n component: ProductVariantListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'product-variant-detail',\n tab: _('catalog.product-variants'),\n route: '',\n component: detailComponentWithResolver({\n component: ProductVariantDetailComponent,\n query: GetProductVariantDetailDocument,\n entityKey: 'productVariant',\n getBreadcrumbs: entity => [\n {\n label: `${entity?.product.name}`,\n link: ['/catalog', 'products', entity?.product.id],\n },\n {\n label: `${entity?.name} (${entity?.sku})`,\n link: ['variants', entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'facet-list',\n tab: _('catalog.facets'),\n route: '',\n component: FacetListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'facet-detail',\n tab: _('catalog.facet'),\n route: '',\n component: detailComponentWithResolver({\n component: FacetDetailComponent,\n query: GetFacetDetailDocument,\n variables: {\n facetValueListOptions: {\n take: 10,\n skip: 0,\n sort: {\n createdAt: SortOrder.DESC,\n },\n },\n },\n entityKey: 'facet',\n getBreadcrumbs: entity => [\n {\n label: entity ? entity.name : _('catalog.create-new-facet'),\n link: [entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'collection-list',\n tab: _('catalog.collections'),\n route: '',\n component: CollectionListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'collection-detail',\n tab: _('catalog.collection'),\n route: '',\n component: detailComponentWithResolver({\n component: CollectionDetailComponent,\n query: CollectionDetailQueryDocument,\n entityKey: 'collection',\n getBreadcrumbs: entity => [\n {\n label: entity ? entity.name : _('catalog.create-new-collection'),\n link: [entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'asset-list',\n tab: _('catalog.assets'),\n route: '',\n component: AssetListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'asset-detail',\n tab: _('catalog.asset'),\n route: '',\n component: detailComponentWithResolver({\n component: AssetDetailComponent,\n query: AssetDetailQueryDocument,\n entityKey: 'asset',\n getBreadcrumbs: entity => [\n {\n label: `${entity?.name}`,\n link: [entity?.id],\n },\n ],\n }),\n });\n CatalogModule.hasRegisteredTabsAndBulkActions = true;\n }\n}\n", "import { Injectable } from '@angular/core';\nimport {\n CreateProductInput,\n CreateProductVariantInput,\n DataService,\n DeletionResult,\n FacetWithValuesFragment,\n findTranslation,\n GetProductDetailQuery,\n GetProductWithVariantsQuery,\n LanguageCode,\n UpdateProductInput,\n UpdateProductMutation,\n UpdateProductOptionInput,\n UpdateProductVariantInput,\n UpdateProductVariantsMutation,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\nimport { forkJoin, Observable, of, throwError } from 'rxjs';\nimport { map, mergeMap, shareReplay, switchMap } from 'rxjs/operators';\n\nimport { CreateProductVariantsConfig } from '../../components/generate-product-variants/generate-product-variants.component';\n\nimport { replaceLast } from './replace-last';\n\n/**\n * Handles the logic for making the API calls to perform CRUD operations on a Product and its related\n * entities. This logic was extracted out of the component because it became too large and hard to follow.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ProductDetailService {\n constructor(private dataService: DataService) {}\n\n getTaxCategories() {\n return this.dataService.settings\n .getTaxCategories()\n .mapSingle(data => data.taxCategories.items)\n .pipe(shareReplay(1));\n }\n\n createProductWithVariants(\n input: CreateProductInput,\n createVariantsConfig: CreateProductVariantsConfig,\n languageCode: LanguageCode,\n ) {\n const createProduct$ = this.dataService.product.createProduct(input);\n const nonEmptyOptionGroups = createVariantsConfig.groups.filter(g => 0 < g.values.length);\n const createOptionGroups$ = this.createProductOptionGroups(nonEmptyOptionGroups, languageCode);\n\n return forkJoin(createProduct$, createOptionGroups$).pipe(\n mergeMap(([{ createProduct }, optionGroups]) => {\n const addOptionsToProduct$ = optionGroups.length\n ? forkJoin(\n optionGroups.map(optionGroup =>\n this.dataService.product.addOptionGroupToProduct({\n productId: createProduct.id,\n optionGroupId: optionGroup.id,\n }),\n ),\n )\n : of([]);\n return addOptionsToProduct$.pipe(map(() => ({ createProduct, optionGroups })));\n }),\n mergeMap(({ createProduct, optionGroups }) => {\n const variants = createVariantsConfig.variants.map(v => {\n const optionIds = optionGroups.length\n ? v.optionValues.map((optionName, index) => {\n const option = optionGroups[index].options.find(o => o.name === optionName);\n if (!option) {\n throw new Error(\n `Could not find a matching ProductOption \"${optionName}\" when creating variant`,\n );\n }\n return option.id;\n })\n : [];\n return {\n ...v,\n optionIds,\n };\n });\n const options = optionGroups.map(og => og.options).reduce((flat, o) => [...flat, ...o], []);\n return this.createProductVariants(\n createProduct,\n variants,\n options,\n languageCode,\n createVariantsConfig.stockLocationId,\n );\n }),\n );\n }\n\n createProductOptionGroups(groups: Array<{ name: string; values: string[] }>, languageCode: LanguageCode) {\n return groups.length\n ? forkJoin(\n groups.map(c =>\n this.dataService.product\n .createProductOptionGroups({\n code: normalizeString(c.name, '-'),\n translations: [{ languageCode, name: c.name }],\n options: c.values.map(v => ({\n code: normalizeString(v, '-'),\n translations: [{ languageCode, name: v }],\n })),\n })\n .pipe(map(data => data.createProductOptionGroup)),\n ),\n )\n : of([]);\n }\n\n createProductVariants(\n product: { name: string; id: string },\n variantData: Array<{ price: number; sku: string; stock: number; optionIds: string[] }>,\n options: Array<{ id: string; name: string }>,\n languageCode: LanguageCode,\n stockLocationId: string,\n ) {\n const variants: CreateProductVariantInput[] = variantData.map(v => {\n const name = options.length\n ? `${product.name} ${v.optionIds\n .map(id => options.find(o => o.id === id))\n .filter(notNullOrUndefined)\n .map(o => o.name)\n .join(' ')}`\n : product.name;\n return {\n productId: product.id,\n price: v.price,\n sku: v.sku,\n translations: [\n {\n languageCode,\n name,\n },\n ],\n stockLevels: [\n {\n stockLocationId,\n stockOnHand: v.stock,\n },\n ],\n optionIds: v.optionIds,\n };\n });\n return this.dataService.product.createProductVariants(variants).pipe(\n map(({ createProductVariants }) => ({\n createProductVariants,\n productId: product.id,\n })),\n );\n }\n\n updateProduct(updateOptions: {\n product: NonNullable<GetProductDetailQuery['product']>;\n languageCode: LanguageCode;\n autoUpdate: boolean;\n productInput?: UpdateProductInput;\n variantsInput?: UpdateProductVariantInput[];\n }) {\n const { product, languageCode, autoUpdate, productInput, variantsInput } = updateOptions;\n const updateOperations: Array<Observable<UpdateProductMutation | UpdateProductVariantsMutation>> = [];\n const updateVariantsInput = variantsInput || [];\n\n const variants$ = autoUpdate\n ? this.dataService.product\n .getProductVariantsForProduct({}, product.id)\n .mapSingle(({ productVariants }) => productVariants.items)\n : of([]);\n\n return variants$.pipe(\n mergeMap(variants => {\n if (productInput) {\n updateOperations.push(this.dataService.product.updateProduct(productInput));\n const productOldName = findTranslation(product, languageCode)?.name ?? '';\n const productNewName = findTranslation(productInput, languageCode)?.name;\n if (productNewName && productOldName !== productNewName && autoUpdate) {\n for (const variant of variants) {\n const currentVariantName = findTranslation(variant, languageCode)?.name || '';\n let variantInput: UpdateProductVariantInput;\n const existingVariantInput = updateVariantsInput.find(i => i.id === variant.id);\n if (existingVariantInput) {\n variantInput = existingVariantInput;\n } else {\n variantInput = {\n id: variant.id,\n translations: [{ languageCode, name: currentVariantName }],\n };\n updateVariantsInput.push(variantInput);\n }\n const variantTranslation = findTranslation(variantInput, languageCode);\n if (variantTranslation) {\n if (variantTranslation.name) {\n variantTranslation.name = replaceLast(\n variantTranslation.name,\n productOldName,\n productNewName,\n );\n } else {\n // The variant translation was falsy, which occurs\n // when defining the product name for a new translation\n // language that had not yet been defined.\n variantTranslation.name = [\n productNewName,\n ...variant.options.map(o => o.name),\n ].join(' ');\n }\n }\n }\n }\n }\n if (updateVariantsInput.length) {\n updateOperations.push(\n this.dataService.product.updateProductVariants(updateVariantsInput),\n );\n }\n return forkJoin(updateOperations);\n }),\n );\n }\n\n updateProductOptions(\n inputs: UpdateProductOptionInput[],\n autoUpdateProductNames: boolean,\n product: NonNullable<GetProductDetailQuery['product']>,\n languageCode: LanguageCode,\n ) {\n const variants$ = autoUpdateProductNames\n ? this.dataService.product\n .getProductVariantsForProduct({}, product.id)\n .mapSingle(({ productVariants }) => productVariants.items)\n : of([]);\n\n return variants$.pipe(\n mergeMap(variants => {\n let updateProductVariantNames$: Observable<any> = of([]);\n if (autoUpdateProductNames) {\n const replacementMap = new Map<string, string>();\n\n for (const input of inputs) {\n const newOptionName = findTranslation(input, languageCode)?.name;\n let oldOptionName: string | undefined;\n for (const variant of variants) {\n if (oldOptionName) {\n continue;\n }\n if (variant.options.map(o => o.id).includes(input.id)) {\n if (!oldOptionName) {\n oldOptionName = findTranslation(\n variant.options.find(o => o.id === input.id),\n languageCode,\n )?.name;\n }\n }\n }\n if (oldOptionName && newOptionName) {\n replacementMap.set(oldOptionName, newOptionName);\n }\n }\n\n const variantsToUpdate: UpdateProductVariantInput[] = [];\n if (replacementMap.size) {\n const oldOptionNames = Array.from(replacementMap.keys());\n for (const variant of variants) {\n const variantName = findTranslation(variant, languageCode)?.name;\n if (!variantName) {\n continue;\n }\n if (!oldOptionNames.some(oldOptionName => variantName.includes(oldOptionName))) {\n continue;\n }\n const updatedVariantName = oldOptionNames.reduce(\n (name, oldOptionName) =>\n replaceLast(name, oldOptionName, replacementMap.get(oldOptionName)!),\n variantName,\n );\n variantsToUpdate.push({\n id: variant.id,\n translations: [\n {\n languageCode,\n name: updatedVariantName,\n },\n ],\n });\n }\n }\n if (variantsToUpdate.length) {\n updateProductVariantNames$ =\n this.dataService.product.updateProductVariants(variantsToUpdate);\n } else {\n updateProductVariantNames$ = of([]);\n }\n }\n return forkJoin(\n inputs.map(input => this.dataService.product.updateProductOption(input)),\n ).pipe(mergeMap(() => updateProductVariantNames$));\n }),\n );\n }\n\n deleteProductVariant(id: string, productId: string) {\n return this.dataService.product.deleteProductVariant(id).pipe(\n switchMap(result => {\n if (result.deleteProductVariant.result === DeletionResult.DELETED) {\n return this.dataService.product.getProduct(productId).single$;\n } else {\n return throwError(result.deleteProductVariant.message);\n }\n }),\n );\n }\n}\n", "/**\n * @description\n * Like String.prototype.replace(), but replaces the last instance\n * rather than the first.\n */\nexport function replaceLast(target: string | undefined | null, search: string, replace: string): string {\n if (!target) {\n return '';\n }\n const lastIndex = target.lastIndexOf(search);\n if (lastIndex === -1) {\n return target;\n }\n const head = target.substr(0, lastIndex);\n const tail = target.substr(lastIndex).replace(search, replace);\n return head + tail;\n}\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BaseDetailComponent,\n createUpdatedTranslatable,\n CustomFieldConfig,\n DataService,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n NotificationService,\n Permission,\n PermissionsService,\n ProductOptionFragment,\n ProductOptionGroupFragment,\n ServerConfigService,\n TranslationOf,\n UpdateProductOptionGroupInput,\n UpdateProductOptionInput,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\nimport { map, mergeMap, take, tap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\n\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\n\n@Component({\n selector: 'vdr-product-options-editor',\n templateUrl: './product-options-editor.component.html',\n styleUrls: ['./product-options-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\n detailForm: UntypedFormGroup;\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\n languageCode$: Observable<LanguageCode>;\n availableLanguages$: Observable<LanguageCode[]>;\n optionGroupCustomFields: CustomFieldConfig[];\n optionCustomFields: CustomFieldConfig[];\n autoUpdateVariantNames = true;\n paginationSettings: { [groupId: string]: { currentPage: number; itemsPerPage: number } } = {};\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n protected route: ActivatedRoute,\n protected router: Router,\n protected serverConfigService: ServerConfigService,\n protected dataService: DataService,\n protected permissionsService: PermissionsService,\n private productDetailService: ProductDetailService,\n private formBuilder: UntypedFormBuilder,\n private changeDetector: ChangeDetectorRef,\n private notificationService: NotificationService,\n ) {\n super(route, router, serverConfigService, dataService, permissionsService);\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\n }\n\n ngOnInit(): void {\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\n map((product: ProductWithOptions) => product.optionGroups),\n tap((optionGroups: ProductWithOptions['optionGroups']) => {\n for (const group of optionGroups) {\n this.paginationSettings[group.id] = {\n currentPage: 1,\n itemsPerPage: 10,\n };\n }\n }),\n );\n this.detailForm = new UntypedFormGroup({\n optionGroups: new UntypedFormArray([]),\n });\n super.init();\n }\n\n getOptionGroups(): UntypedFormGroup[] {\n const optionGroups = this.detailForm.get('optionGroups');\n return (optionGroups as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n getOptions(optionGroup: UntypedFormGroup): UntypedFormGroup[] {\n const options = optionGroup.get('options');\n return (options as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n save() {\n if (this.detailForm.invalid || this.detailForm.pristine) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\n combineLatest(this.entity$, this.languageCode$, $product)\n .pipe(\n take(1),\n mergeMap(([{ optionGroups }, languageCode, product]) => {\n const updateOperations: Array<Observable<any>> = [];\n const updatedProductOptionInputs: UpdateProductOptionInput[] = [];\n for (const optionGroupForm of this.getOptionGroups()) {\n if (optionGroupForm.dirty) {\n const optionGroupEntity = optionGroups.find(\n og => og.id === optionGroupForm.value.id,\n );\n if (optionGroupEntity) {\n const input = this.getUpdatedOptionGroup(\n optionGroupEntity,\n optionGroupForm,\n languageCode,\n );\n updateOperations.push(\n this.dataService.product.updateProductOptionGroup(input),\n );\n }\n }\n\n for (const optionForm of this.getOptions(optionGroupForm)) {\n if (optionForm.dirty) {\n const optionGroup = optionGroups\n .find(og => og.id === optionGroupForm.value.id)\n ?.options.find(o => o.id === optionForm.value.id);\n if (optionGroup) {\n const input = this.getUpdatedOption(\n optionGroup,\n optionForm,\n languageCode,\n );\n updatedProductOptionInputs.push(input);\n }\n }\n }\n }\n if (updatedProductOptionInputs.length) {\n updateOperations.push(\n this.productDetailService.updateProductOptions(\n updatedProductOptionInputs,\n this.autoUpdateVariantNames,\n product,\n languageCode,\n ),\n );\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductOptionGroup',\n });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductOptionGroup',\n });\n },\n );\n }\n\n private getUpdatedOptionGroup(\n optionGroup: ProductOptionGroupFragment,\n optionGroupFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionGroupInput {\n const input = createUpdatedTranslatable({\n translatable: optionGroup,\n updatedFields: optionGroupFormGroup.value,\n customFieldConfig: this.optionGroupCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: optionGroup.name || '',\n },\n });\n return input;\n }\n\n private getUpdatedOption(\n option: ProductOptionFragment,\n optionFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionInput {\n const input = createUpdatedTranslatable({\n translatable: option,\n updatedFields: optionFormGroup.value,\n customFieldConfig: this.optionCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: option.name || '',\n },\n });\n return input;\n }\n\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\n const groupsForm = this.detailForm.get('optionGroups') as UntypedFormArray;\n for (const optionGroup of entity.optionGroups) {\n const groupTranslation = findTranslation(optionGroup, languageCode);\n\n const groupForm = this.setOptionGroupForm(optionGroup, groupsForm, groupTranslation);\n this.setCustomFieldsForm(this.optionGroupCustomFields, groupForm, optionGroup, groupTranslation);\n\n let optionsForm = groupForm.get('options') as UntypedFormArray;\n if (!optionsForm) {\n optionsForm = this.formBuilder.array([]);\n groupForm.addControl('options', optionsForm);\n }\n for (const option of optionGroup.options) {\n const optionTranslation = findTranslation(option, languageCode);\n const optionForm = this.setOptionForm(option, optionsForm, optionTranslation);\n\n this.setCustomFieldsForm(this.optionCustomFields, optionForm, option, optionTranslation);\n }\n }\n }\n\n protected setCustomFieldsForm<\n T extends ProductWithOptions['optionGroups'][0] | ProductWithOptions['optionGroups'][0]['options'][0],\n >(\n customFields: CustomFieldConfig[],\n formGroup: UntypedFormGroup,\n entity: T,\n currentTranslation?: TranslationOf<T>,\n ) {\n if (customFields.length) {\n let customValueFieldsGroup = formGroup.get(['customFields']);\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = this.formBuilder.group(\n customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\n );\n formGroup.addControl('customFields', customValueFieldsGroup);\n }\n this.setCustomFieldFormValues(customFields, customValueFieldsGroup, entity, currentTranslation);\n }\n }\n\n protected setOptionGroupForm(\n entity: ProductWithOptions['optionGroups'][0],\n groupsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let groupForm = groupsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (groupForm) {\n groupForm.get('id')?.setValue(group.id);\n groupForm.get('code')?.setValue(group.code);\n groupForm.get('name')?.setValue(group.name);\n groupForm.get('createdAt')?.setValue(group.createdAt);\n groupForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n groupForm = this.formBuilder.group(group);\n groupsForm.push(groupForm);\n }\n return groupForm;\n }\n\n protected setOptionForm(\n entity: ProductWithOptions['optionGroups'][0]['options'][0],\n optionsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]['options'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let optionForm = optionsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (optionForm) {\n optionForm.get('id')?.setValue(group.id);\n optionForm.get('code')?.setValue(group.code);\n optionForm.get('name')?.setValue(group.name);\n optionForm.get('createdAt')?.setValue(group.createdAt);\n optionForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n optionForm = this.formBuilder.group(group);\n optionsForm.push(optionForm);\n }\n return optionForm;\n }\n}\n", "<vdr-page-header>\n <vdr-page-title></vdr-page-title>\n <vdr-page-header-description>{{ 'catalog.page-description-options-editor' | translate }}</vdr-page-header-description>\n</vdr-page-header>\n<vdr-page-body>\n <vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <div class=\"flex center\">\n <div class=\"mr-2\">\n <clr-checkbox-wrapper>\n <input\n clrCheckbox\n type=\"checkbox\"\n id=\"auto-update\"\n [(ngModel)]=\"autoUpdateVariantNames\"\n />\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\n </clr-checkbox-wrapper>\n </div>\n <button\n *vdrIfPermissions=\"updatePermission\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"detailForm.pristine || detailForm.invalid\"\n >\n {{ 'common.update' | translate }}\n </button>\n </div>\n </vdr-ab-right>\n </vdr-action-bar>\n </vdr-page-block>\n <vdr-page-block>\n <form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\n <div formGroupName=\"optionGroups\">\n <vdr-card\n *ngFor=\"let optionGroup of getOptionGroups(); index as i\"\n [formArrayName]=\"i\"\n [title]=\"optionGroup.value.code\"\n >\n <vdr-page-entity-info [entity]=\"optionGroup.value\"></vdr-page-entity-info>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n [id]=\"'name-' + i\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\n <input\n [id]=\"'code-' + i\"\n type=\"text\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n </div>\n <ng-container formGroupName=\"customFields\" *ngIf=\"optionGroupCustomFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"ProductOptionGroup\"\n [customFields]=\"optionGroupCustomFields\"\n [customFieldsFormGroup]=\"optionGroup.get('customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </ng-container>\n\n <vdr-data-table-2\n id=\"edit-options-list\"\n *ngIf=\"getOptions(optionGroup) as options\"\n [items]=\"options\"\n [trackByPath]=\"'value.id'\"\n [itemsPerPage]=\"paginationSettings[optionGroup.value.id]?.itemsPerPage\"\n [currentPage]=\"paginationSettings[optionGroup.value.id]?.currentPage\"\n (pageChange)=\"paginationSettings[optionGroup.value.id].currentPage = $event\"\n (itemsPerPageChange)=\"paginationSettings[optionGroup.value.id].itemsPerPage = $event\"\n [totalItems]=\"options.length\"\n >\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-optionControl=\"item\">\n {{ optionControl.value.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\n <ng-template let-optionControl=\"item\">\n {{ optionControl.value.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\n <ng-template let-optionControl=\"item\">\n {{ optionControl.value.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-optionControl=\"item\">\n <input\n type=\"text\"\n [formControl]=\"optionControl.get('name')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\" [optional]=\"false\">\n <ng-template let-optionControl=\"item\">\n <input type=\"text\" [formControl]=\"optionControl.get('code')\" />\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.custom-fields' | translate\" id=\"custom-fields\"\n [hiddenByDefault]=\"optionCustomFields.length === 0\"\n >\n <ng-template let-optionControl=\"item\">\n <vdr-tabbed-custom-fields\n entityName=\"ProductOption\"\n [customFields]=\"optionCustomFields\"\n [compact]=\"true\"\n [customFieldsFormGroup]=\"optionControl.get('customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </ng-template>\n </vdr-dt2-column>\n </vdr-data-table-2>\n </vdr-card>\n </div>\n </form>\n </vdr-page-block>\n</vdr-page-body>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n CurrencyCode,\n DataService,\n DeactivateAware,\n DeletionResult,\n getDefaultUiLanguage,\n GetProductVariantOptionsQuery,\n LanguageCode,\n ModalService,\n NotificationService,\n SelectionManager,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY, Observable, Subject } from 'rxjs';\nimport { map, startWith, switchMap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\nimport { CreateProductOptionGroupDialogComponent } from '../create-product-option-group-dialog/create-product-option-group-dialog.component';\nimport { CreateProductVariantDialogComponent } from '../create-product-variant-dialog/create-product-variant-dialog.component';\n\nexport class GeneratedVariant {\n isDefault: boolean;\n options: Array<{ name: string; id?: string }>;\n productVariantId?: string;\n enabled: boolean;\n existing: boolean;\n sku: string;\n price: number;\n stock: number;\n\n constructor(config: Partial<GeneratedVariant>) {\n for (const key of Object.keys(config)) {\n this[key] = config[key];\n }\n }\n}\n\ninterface OptionGroupUiModel {\n id?: string;\n isNew: boolean;\n name: string;\n locked: boolean;\n values: Array<{\n id: string;\n name: string;\n locked: boolean;\n }>;\n}\n\n@Component({\n selector: 'vdr-product-variants-editor',\n templateUrl: './product-variants-editor.component.html',\n styleUrls: ['./product-variants-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n standalone: false\n})\nexport class ProductVariantsEditorComponent implements OnInit, DeactivateAware {\n formValueChanged = false;\n optionsChanged = false;\n optionGroups: OptionGroupUiModel[];\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\n variants$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['variants']>;\n optionGroups$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups']>;\n totalItems$: Observable<number>;\n currencyCode: CurrencyCode;\n itemsPerPage = 100;\n currentPage = 1;\n searchTermControl = new FormControl('');\n selectionManager = new SelectionManager<any>({\n multiSelect: true,\n itemsAreEqual: (a, b) => a.id === b.id,\n additiveMode: true,\n });\n optionsToAddToVariant: {\n [variantId: string]: { [groupId: string]: string };\n } = {};\n private refresh$ = new Subject<void>();\n private languageCode: LanguageCode;\n\n constructor(\n private route: ActivatedRoute,\n private dataService: DataService,\n private productDetailService: ProductDetailService,\n private notificationService: NotificationService,\n private modalService: ModalService,\n private changeDetector: ChangeDetectorRef,\n ) {}\n\n ngOnInit() {\n this.languageCode =\n (this.route.snapshot.paramMap.get('lang') as LanguageCode) || getDefaultUiLanguage();\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\n });\n\n const product$ = this.refresh$.pipe(\n switchMap(() =>\n this.dataService.product\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .getProductVariantsOptions(this.route.parent?.snapshot.paramMap.get('id')!)\n .mapSingle(data => data.product),\n ),\n startWith(this.route.snapshot.data.product),\n );\n\n this.variants$ = product$.pipe(\n switchMap(product =>\n this.searchTermControl.valueChanges.pipe(\n startWith(''),\n map(term =>\n term\n ? product.variants.filter(v => v.name.toLowerCase().includes(term.toLowerCase()))\n : product.variants,\n ),\n ),\n ),\n );\n this.optionGroups$ = product$.pipe(map(product => product.optionGroups));\n this.totalItems$ = this.variants$.pipe(map(variants => variants.length));\n\n product$.subscribe(p => {\n this.product = p;\n const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();\n const allUsedOptionGroupIds = p.variants.map(v => v.options.map(option => option.groupId)).flat();\n this.optionGroups = p.optionGroups.map(og => ({\n id: og.id,\n isNew: false,\n name: og.name,\n locked: allUsedOptionGroupIds.includes(og.id),\n values: og.options.map(o => ({\n id: o.id,\n name: o.name,\n locked: allUsedOptionIds.includes(o.id),\n })),\n }));\n });\n }\n\n setItemsPerPage(itemsPerPage: number) {\n this.itemsPerPage = itemsPerPage;\n this.currentPage = 1;\n }\n\n setPageNumber(page: number) {\n this.currentPage = page;\n }\n\n onFormChanged(variantInfo: GeneratedVariant) {\n this.formValueChanged = true;\n variantInfo.enabled = true;\n }\n\n canDeactivate(): boolean {\n return !this.formValueChanged;\n }\n\n addOptionGroup() {\n this.modalService\n .fromComponent(CreateProductOptionGroupDialogComponent, {\n locals: {\n languageCode: this.languageCode,\n },\n })\n .pipe(\n switchMap(result => {\n if (result) {\n return this.dataService.product.createProductOptionGroups(result).pipe(\n switchMap(({ createProductOptionGroup }) =>\n this.dataService.product.addOptionGroupToProduct({\n optionGroupId: createProductOptionGroup.id,\n productId: this.product.id,\n }),\n ),\n );\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(result => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'ProductOptionGroup',\n });\n this.refresh$.next();\n this.changeDetector.markForCheck();\n });\n }\n\n removeOptionGroup(\n optionGroup: NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups'][number],\n ) {\n const id = optionGroup.id;\n const usedByVariantsCount = this.product.variants.filter(v =>\n v.options.map(o => o.groupId).includes(id),\n ).length;\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product-option-group'),\n body: usedByVariantsCount ? _('catalog.confirm-delete-product-option-group-body') : '',\n translationVars: { name: optionGroup.name, count: usedByVariantsCount },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(val => {\n if (val) {\n return this.dataService.product.removeOptionGroupFromProduct({\n optionGroupId: id,\n productId: this.product.id,\n force: true,\n });\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(({ removeOptionGroupFromProduct }) => {\n if (removeOptionGroupFromProduct.__typename === 'Product') {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'ProductOptionGroup',\n });\n this.refresh$.next();\n } else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {\n this.notificationService.error(removeOptionGroupFromProduct.message ?? '');\n }\n });\n }\n\n addOption(index: number, optionName: string) {\n const group = this.optionGroups[index];\n if (group && group.id) {\n this.dataService.product\n .addOptionToGroup({\n productOptionGroupId: group.id,\n code: normalizeString(optionName, '-'),\n translations: [{ name: optionName, languageCode: this.languageCode }],\n })\n .subscribe(({ createProductOption }) => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'ProductOption',\n });\n this.refresh$.next();\n });\n }\n }\n\n removeOption(index: number, { id, name }: { id: string; name: string }) {\n const optionGroup = this.optionGroups[index];\n if (optionGroup) {\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product-option'),\n translationVars: { name },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(val => {\n if (val) {\n return this.dataService.product.deleteProductOption(id);\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(({ deleteProductOption }) => {\n if (deleteProductOption.result === DeletionResult.DELETED) {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'ProductOption',\n });\n optionGroup.values = optionGroup.values.filter(v => v.id !== id);\n this.refresh$.next();\n } else {\n this.notificationService.error(deleteProductOption.message ?? '');\n }\n });\n }\n }\n\n setOptionToAddToVariant(variantId: string, optionGroupId: string, optionId?: string) {\n if (!this.optionsToAddToVariant[variantId]) {\n this.optionsToAddToVariant[variantId] = {};\n }\n if (optionId) {\n this.optionsToAddToVariant[variantId][optionGroupId] = optionId;\n } else {\n delete this.optionsToAddToVariant[variantId][optionGroupId];\n }\n }\n\n addOptionToVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\n const optionIds = [\n ...variant.options.map(o => o.id),\n ...Object.values(this.optionsToAddToVariant[variant.id]),\n ];\n this.dataService.product\n .updateProductVariants([\n {\n id: variant.id,\n optionIds: unique(optionIds),\n },\n ])\n .subscribe(({ updateProductVariants }) => {\n this.refresh$.next();\n });\n }\n\n deleteVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product-variant'),\n translationVars: { name: variant.name },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response =>\n response\n ? this.productDetailService.deleteProductVariant(variant.id, this.product.id)\n : EMPTY,\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'ProductVariant',\n });\n this.refresh$.next();\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'ProductVariant',\n });\n },\n );\n }\n\n createNewVariant() {\n this.modalService\n .fromComponent(CreateProductVariantDialogComponent, {\n locals: {\n product: this.product,\n },\n })\n .pipe(\n switchMap(result => {\n if (result) {\n return this.dataService.product.createProductVariants([result]);\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(result => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'ProductVariant',\n });\n this.refresh$.next();\n });\n }\n\n getOption(\n variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\n groupId: string,\n ) {\n return variant.options.find(o => o.groupId === groupId);\n }\n}\n", "<vdr-page-block>\n <vdr-card>\n <div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\n <vdr-form-field [label]=\"'catalog.option' | translate\">\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.option-values' | translate\" class=\"flex-spacer\">\n <vdr-option-value-input\n #optionValueInputComponent\n [options]=\"group.values\"\n [groupName]=\"group.name\"\n [disabled]=\"group.name === ''\"\n (add)=\"addOption(i, $event.name)\"\n (remove)=\"removeOption(i, $event)\"\n ></vdr-option-value-input>\n </vdr-form-field>\n <div>\n <button class=\"button-small mt-4\" (click)=\"removeOptionGroup(group)\">\n <clr-icon shape=\"trash\"></clr-icon>\n </button>\n </div>\n </div>\n <button class=\"button mt-1\" (click)=\"addOptionGroup()\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-product-option-group' | translate }}\n </button>\n </vdr-card>\n <vdr-card [paddingX]=\"false\">\n <div class=\"mx-3\">\n <button class=\"button\" (click)=\"createNewVariant()\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-product-variant' | translate }}\n </button>\n </div>\n <vdr-data-table-2\n id=\"manage-product-variant-list\"\n [items]=\"variants$ | async\"\n [itemsPerPage]=\"itemsPerPage\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n >\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n {{ variant.name }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n {{ variant.sku }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column *ngFor=\"let optionGroup of optionGroups$ | async\" [heading]=\"optionGroup.name\" [id]=\"optionGroup.code\">\n <ng-template let-variant=\"item\">\n <vdr-chip\n *ngIf=\"getOption(variant, optionGroup.id) as option; else selectOption\"\n [colorFrom]=\"optionGroup.code\"\n >{{ option.name }}</vdr-chip\n >\n <ng-template #selectOption>\n <div class=\"flex center\">\n <ng-select\n [items]=\"optionGroup.options\"\n bindLabel=\"name\"\n bindValue=\"id\"\n appendTo=\"body\"\n (change)=\"setOptionToAddToVariant(variant.id, optionGroup.id, $event?.id)\"\n ></ng-select>\n <button\n class=\"button-small ml-1\"\n [class.primary]=\"!!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\n (click)=\"addOptionToVariant(variant)\"\n [disabled]=\"!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\n >\n <clr-icon shape=\"floppy\"></clr-icon>\n </button>\n </div>\n </ng-template>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.price' | translate\" id=\"price\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.price | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.delete' | translate\" id=\"delete\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n <button class=\"button-small\" (click)=\"deleteVariant(variant)\">\n <clr-icon shape=\"trash is-danger\"></clr-icon>\n </button>\n </ng-template>\n </vdr-dt2-column>\n </vdr-data-table-2>\n </vdr-card>\n</vdr-page-block>\n", "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport {\n CreateProductOptionGroupInput,\n Dialog,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n ServerConfigService,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\n\n@Component({\n selector: 'vdr-create-product-option-group-dialog',\n templateUrl: './create-product-option-group-dialog.component.html',\n styleUrls: ['./create-product-option-group-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CreateProductOptionGroupDialogComponent implements Dialog<CreateProductOptionGroupInput> {\n resolveWith: (result?: CreateProductOptionGroupInput) => void;\n languageCode: LanguageCode;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n code: ['', Validators.required],\n });\n constructor(private formBuilder: FormBuilder) {}\n\n updateCode() {\n const nameControl = this.form.get('name');\n const codeControl = this.form.get('code');\n if (nameControl && codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\n }\n }\n\n confirm() {\n const { name, code } = this.form.value;\n if (!name || !code) {\n return;\n }\n this.resolveWith({\n code,\n options: [],\n translations: [{ languageCode: this.languageCode, name }],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.create-product-option-group' | translate }}\n</ng-template>\n<div class=\"form-grid\" [formGroup]=\"form\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'common.code' | translate\"\n for=\"code\"\n >\n <input\n id=\"code\"\n type=\"text\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n</div>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\" [disabled]=\"form.invalid\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormRecord, Validators } from '@angular/forms';\nimport {\n CreateProductVariantInput,\n CurrencyCode,\n Dialog,\n GetProductVariantOptionsQuery,\n} from '@vendure/admin-ui/core';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\n\n@Component({\n selector: 'vdr-create-product-variant-dialog',\n templateUrl: './create-product-variant-dialog.component.html',\n styleUrls: ['./create-product-variant-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CreateProductVariantDialogComponent implements Dialog<CreateProductVariantInput>, OnInit {\n resolveWith: (result?: CreateProductVariantInput) => void;\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n sku: [''],\n price: [''],\n options: this.formBuilder.record<string>({}),\n });\n existingVariant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number] | undefined;\n currencyCode: CurrencyCode;\n\n constructor(private formBuilder: FormBuilder) {}\n\n ngOnInit() {\n this.currencyCode = this.product.variants[0]?.currencyCode;\n for (const optionGroup of this.product.optionGroups) {\n (this.form.get('options') as FormRecord).addControl(\n optionGroup.code,\n new FormControl('', Validators.required),\n );\n }\n const optionsRecord = this.form.get('options') as FormRecord;\n optionsRecord.valueChanges.subscribe(value => {\n const nameControl = this.form.get('name');\n const allNull = Object.values(value).every(v => v == null);\n if (!allNull && value && nameControl && !nameControl.dirty) {\n const name = Object.entries(value)\n .map(\n ([groupCode, optionId]) =>\n this.product.optionGroups\n .find(og => og.code === groupCode)\n ?.options.find(o => o.id === optionId)?.name,\n )\n .join(' ');\n nameControl.setValue(`${this.product.name} ${name}`);\n }\n const allSelected = Object.values(value).every(v => v != null);\n if (allSelected) {\n this.existingVariant = this.product.variants.find(v =>\n Object.entries(value).every(\n ([groupCode, optionId]) =>\n v.options.find(o => o.groupId === this.getGroupIdFromCode(groupCode))?.id ===\n optionId,\n ),\n );\n }\n });\n }\n\n confirm() {\n const { name, sku, options, price } = this.form.value;\n if (!name || !options || price == null) {\n return;\n }\n\n const optionIds = Object.values(options).filter(notNullOrUndefined);\n this.resolveWith({\n productId: this.product.id,\n sku: sku || '',\n price: Number(price),\n optionIds,\n translations: [\n {\n languageCode: this.product.languageCode,\n name,\n },\n ],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n\n private getGroupCodeFromId(id: string): string {\n return this.product.optionGroups.find(og => og.id === id)?.code ?? '';\n }\n\n private getGroupIdFromCode(code: string): string {\n return this.product.optionGroups.find(og => og.code === code)?.id ?? '';\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.create-product-variant' | translate }}\n</ng-template>\n<form [formGroup]=\"form\">\n <div formGroupName=\"options\" class=\"form-grid\">\n <vdr-form-field [label]=\"optionGroup.name\" *ngFor=\"let optionGroup of product.optionGroups\">\n <ng-select [items]=\"optionGroup.options\" [formControlName]=\"optionGroup.code\" bindLabel=\"name\"\n bindValue=\"id\" appendTo=\"body\">\n </ng-select>\n </vdr-form-field>\n <clr-alert *ngIf=\"product.optionGroups.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\"\n class=\"form-grid-span\">\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ 'catalog.cannot-create-variants-without-options' | translate }}\n </span>\n </clr-alert-item>\n </clr-alert>\n </div>\n <div *ngIf=\"existingVariant\" class=\"mt-2\">\n <clr-alert clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ 'catalog.product-variant-exists' | translate }}: {{ existingVariant.name }} ({{\n existingVariant.sku\n }})\n </span>\n </clr-alert-item>\n </clr-alert>\n </div>\n <div class=\"form-grid mt-2\">\n <vdr-form-field [label]=\"'common.name' | translate\">\n <input type=\"text\" formControlName=\"name\" />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.sku' | translate\">\n <input type=\"text\" formControlName=\"sku\" />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.price' | translate\">\n <vdr-currency-input name=\"price\" [currencyCode]=\"currencyCode\" formControlName=\"price\" />\n </vdr-form-field>\n </div>\n</form>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\"\n [disabled]=\"form.invalid || existingVariant || product.optionGroups.length === 0\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>", "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n OnChanges,\n OnInit,\n Output,\n Provider,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { unique } from '@vendure/common/lib/unique';\n\nexport const OPTION_VALUE_INPUT_VALUE_ACCESSOR: Provider = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OptionValueInputComponent),\n multi: true,\n};\n\ninterface Option {\n id?: string;\n name: string;\n locked: boolean;\n}\n\n@Component({\n selector: 'vdr-option-value-input',\n templateUrl: './option-value-input.component.html',\n styleUrls: ['./option-value-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [OPTION_VALUE_INPUT_VALUE_ACCESSOR],\n standalone: false\n})\nexport class OptionValueInputComponent implements ControlValueAccessor {\n @Input() groupName = '';\n @ViewChild('textArea', { static: true }) textArea: ElementRef<HTMLTextAreaElement>;\n @ViewChildren('editNameInput', { read: ElementRef }) nameInputs: QueryList<ElementRef>;\n @Input() options: Option[];\n @Output() add = new EventEmitter<Option>();\n @Output() remove = new EventEmitter<Option>();\n @Output() edit = new EventEmitter<{ index: number; option: Option }>();\n @Input() disabled = false;\n input = '';\n isFocussed = false;\n lastSelected = false;\n formValue: Option[];\n editingIndex = -1;\n onChangeFn: (value: any) => void;\n onTouchFn: (value: any) => void;\n\n get optionValues(): Option[] {\n return this.formValue ?? this.options ?? [];\n }\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n\n registerOnChange(fn: any): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouchFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.changeDetector.markForCheck();\n }\n\n writeValue(obj: any): void {\n this.formValue = obj || [];\n }\n\n focus() {\n this.textArea.nativeElement.focus();\n }\n\n editName(index: number, event: MouseEvent) {\n const optionValue = this.optionValues[index];\n if (!optionValue.locked && !optionValue.id) {\n event.cancelBubble = true;\n this.editingIndex = index;\n const input = this.nameInputs.get(index)?.nativeElement;\n setTimeout(() => input?.focus());\n }\n }\n\n updateOption(index: number, event: InputEvent) {\n const optionValue = this.optionValues[index];\n const newName = (event.target as HTMLInputElement).value;\n if (optionValue) {\n if (newName) {\n optionValue.name = newName;\n this.edit.emit({ index, option: optionValue });\n }\n this.editingIndex = -1;\n }\n }\n\n removeOption(option: Option) {\n if (!option.locked) {\n if (this.formValue) {\n this.formValue = this.formValue?.filter(o => o.name !== option.name);\n this.onChangeFn(this.formValue);\n } else {\n this.remove.emit(option);\n }\n }\n }\n\n handleKey(event: KeyboardEvent) {\n switch (event.key) {\n case ',':\n case 'Enter':\n this.addOptionValue();\n event.preventDefault();\n break;\n case 'Backspace':\n if (this.lastSelected) {\n this.removeLastOption();\n this.lastSelected = false;\n } else if (this.input === '') {\n this.lastSelected = true;\n }\n break;\n default:\n this.lastSelected = false;\n }\n }\n\n handleBlur() {\n this.isFocussed = false;\n this.addOptionValue();\n }\n\n private addOptionValue() {\n const options = this.parseInputIntoOptions(this.input).filter(option => {\n // do not add an option with the same name\n // as an existing option\n const existing = this.options ?? this.formValue;\n return !existing?.find(o => o?.name === option.name);\n });\n if (!this.formValue && this.options) {\n for (const option of options) {\n this.add.emit(option);\n }\n } else {\n this.formValue = unique([...this.formValue, ...options]);\n this.onChangeFn(this.formValue);\n }\n this.input = '';\n }\n\n private parseInputIntoOptions(input: string): Option[] {\n return input\n .split(/[,\\n]/)\n .map(s => s.trim())\n .filter(s => s !== '')\n .map(s => ({ name: s, locked: false }));\n }\n\n private removeLastOption() {\n if (this.optionValues.length) {\n const option = this.optionValues[this.optionValues.length - 1];\n this.removeOption(option);\n }\n }\n}\n", "<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\n <div class=\"chips\" *ngIf=\"0 < optionValues.length\">\n <vdr-chip\n *ngFor=\"let option of optionValues; last as isLast; index as i\"\n [icon]=\"option.locked ? 'lock' : 'times'\"\n [class.selected]=\"isLast && lastSelected\"\n [class.locked]=\"option.locked\"\n [colorFrom]=\"groupName\"\n (iconClick)=\"removeOption(option)\"\n >\n <span [hidden]=\"editingIndex !== i\">\n <input\n #editNameInput\n type=\"text\"\n [ngModel]=\"option.name\"\n (blur)=\"updateOption(i, $event)\"\n (click)=\"$event.cancelBubble = true\"\n />\n </span>\n <span\n class=\"option-name\"\n [class.editable]=\"!option.locked && !option.id\"\n (click)=\"editName(i, $event)\" [hidden]=\"editingIndex === i\">{{ option.name }}</span>\n </vdr-chip>\n </div>\n <textarea\n #textArea\n (keyup)=\"handleKey($event)\"\n (focus)=\"isFocussed = true\"\n (blur)=\"handleBlur()\"\n [(ngModel)]=\"input\"\n [disabled]=\"disabled\"\n ></textarea>\n</div>\n", "import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { BaseEntityResolver, GetProductVariantOptionsQuery, DataService } from '@vendure/admin-ui/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProductVariantsResolver extends BaseEntityResolver<GetProductVariantOptionsQuery['product']> {\n constructor(router: Router, dataService: DataService) {\n super(\n router,\n {\n __typename: 'Product' as const,\n id: '',\n createdAt: '',\n updatedAt: '',\n name: '',\n languageCode: '' as any,\n optionGroups: [],\n variants: [],\n },\n id => dataService.product.getProductVariantsOptions(id).mapStream(data => data.product),\n );\n }\n}\n", "import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, Route } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n CanDeactivateDetailGuard,\n createResolveData,\n DataService,\n PageComponent,\n PageService,\n} from '@vendure/admin-ui/core';\nimport { map } from 'rxjs/operators';\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\nimport { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\n\nexport const createRoutes = (pageService: PageService): Route[] => [\n {\n path: 'products',\n component: PageComponent,\n data: {\n locationId: 'product-list',\n breadcrumb: _('breadcrumb.products'),\n },\n children: pageService.getPageTabRoutes('product-list'),\n },\n {\n path: 'inventory',\n redirectTo: 'products',\n },\n {\n path: 'products/:id',\n component: PageComponent,\n data: {\n locationId: 'product-detail',\n breadcrumb: { label: _('breadcrumb.products'), link: ['../', 'products'] },\n },\n children: [\n {\n path: 'manage-variants',\n component: ProductVariantsEditorComponent,\n canDeactivate: [CanDeactivateDetailGuard],\n data: {\n breadcrumb: ({ product }) => [\n {\n label: `${product.name}`,\n link: ['../'],\n },\n {\n label: _('breadcrumb.manage-variants'),\n link: ['manage-variants'],\n },\n ],\n },\n resolve: {\n product: (route: ActivatedRouteSnapshot) =>\n inject(DataService)\n .product.getProductVariantsOptions(route.parent?.params.id)\n .mapSingle(data => data.product),\n },\n },\n ...pageService.getPageTabRoutes('product-detail'),\n ],\n },\n {\n path: 'products/:productId/variants/:id',\n component: PageComponent,\n data: {\n locationId: 'product-variant-detail',\n breadcrumb: { label: _('breadcrumb.products'), link: ['../', 'products'] },\n },\n children: pageService.getPageTabRoutes('product-variant-detail'),\n },\n {\n path: 'products/:id/options',\n component: ProductOptionsEditorComponent,\n resolve: createResolveData(ProductVariantsResolver),\n canDeactivate: [CanDeactivateDetailGuard],\n data: {\n breadcrumb: productOptionsEditorBreadcrumb,\n },\n },\n {\n path: 'facets',\n component: PageComponent,\n data: {\n locationId: 'facet-list',\n breadcrumb: _('breadcrumb.facets'),\n },\n children: pageService.getPageTabRoutes('facet-list'),\n },\n {\n path: 'facets/:id',\n component: PageComponent,\n data: {\n locationId: 'facet-detail',\n breadcrumb: { label: _('breadcrumb.facets'), link: ['../', 'facets'] },\n },\n children: pageService.getPageTabRoutes('facet-detail'),\n },\n {\n path: 'collections',\n component: PageComponent,\n data: {\n locationId: 'collection-list',\n breadcrumb: _('breadcrumb.collections'),\n },\n children: pageService.getPageTabRoutes('collection-list'),\n },\n {\n path: 'collections/:id',\n component: PageComponent,\n data: {\n locationId: 'collection-detail',\n breadcrumb: { label: _('breadcrumb.collections'), link: ['../', 'collections'] },\n },\n children: pageService.getPageTabRoutes('collection-detail'),\n },\n {\n path: 'assets',\n component: PageComponent,\n data: {\n locationId: 'asset-list',\n breadcrumb: _('breadcrumb.assets'),\n },\n children: pageService.getPageTabRoutes('asset-list'),\n },\n {\n path: 'assets/:id',\n component: PageComponent,\n data: {\n locationId: 'asset-detail',\n breadcrumb: { label: _('breadcrumb.assets'), link: ['../', 'assets'] },\n },\n children: pageService.getPageTabRoutes('asset-detail'),\n },\n];\n\nexport function productOptionsEditorBreadcrumb(data: any, params: any) {\n return data.entity.pipe(\n map((entity: any) => [\n {\n label: _('breadcrumb.products'),\n link: ['../', 'products'],\n },\n {\n label: `${entity.name}`,\n link: ['../', 'products', params.id],\n },\n {\n label: _('breadcrumb.product-options'),\n link: ['options'],\n },\n ]),\n );\n}\n", "import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ViewChild,\n} from '@angular/core';\nimport {\n Dialog,\n FacetValue,\n FacetValueSelectorComponent,\n FacetWithValuesFragment,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-apply-facet-dialog',\n templateUrl: './apply-facet-dialog.component.html',\n styleUrls: ['./apply-facet-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ApplyFacetDialogComponent implements Dialog<FacetValue[]>, AfterViewInit {\n @ViewChild(FacetValueSelectorComponent) private selector: FacetValueSelectorComponent;\n resolveWith: (result?: FacetValue[]) => void;\n selectedValues: FacetValue[] = [];\n // Provided by caller\n facets: FacetWithValuesFragment[];\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n\n ngAfterViewInit() {\n setTimeout(() => this.selector.focus(), 0);\n }\n\n selectValues() {\n this.resolveWith(this.selectedValues);\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>{{ 'catalog.add-facets' | translate }}</ng-template>\n\n<vdr-facet-value-selector\n (selectedValuesChange)=\"selectedValues = $event\"\n></vdr-facet-value-selector>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button\n type=\"submit\"\n (click)=\"selectValues()\"\n [disabled]=\"selectedValues.length === 0\"\n class=\"btn btn-primary\"\n >\n {{ 'catalog.add-facets' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, UntypedFormBuilder } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n ASSET_FRAGMENT,\n AssetDetailQueryDocument,\n AssetDetailQueryQuery,\n DataService,\n getCustomFieldsDefaults,\n LanguageCode,\n NotificationService,\n TAG_FRAGMENT,\n TypedBaseDetailComponent,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nexport const ASSET_DETAIL_QUERY = gql`\n query AssetDetailQuery($id: ID!) {\n asset(id: $id) {\n ...Asset\n tags {\n ...Tag\n }\n }\n }\n ${ASSET_FRAGMENT}\n ${TAG_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-asset-detail',\n templateUrl: './asset-detail.component.html',\n styleUrls: ['./asset-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class AssetDetailComponent\n extends TypedBaseDetailComponent<typeof AssetDetailQueryDocument, 'asset'>\n implements OnInit, OnDestroy\n{\n readonly customFields = this.getCustomFieldConfig('Asset');\n detailForm = new FormGroup({\n name: new FormControl(''),\n tags: new FormControl([] as string[]),\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n\n constructor(\n private notificationService: NotificationService,\n protected dataService: DataService,\n private formBuilder: UntypedFormBuilder,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n onAssetChange(event: { id: string; name: string; tags: string[] }) {\n this.detailForm.get('name')?.setValue(event.name);\n this.detailForm.get('tags')?.setValue(event.tags);\n this.detailForm.markAsDirty();\n }\n\n save() {\n this.dataService.product\n .updateAsset({\n id: this.id,\n name: this.detailForm.value.name,\n tags: this.detailForm.value.tags,\n customFields: this.detailForm.value.customFields,\n })\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Asset' });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Asset',\n });\n },\n );\n }\n\n protected setFormValues(\n entity: NonNullable<AssetDetailQueryQuery['asset']>,\n languageCode: LanguageCode,\n ): void {\n this.detailForm.get('name')?.setValue(entity.name);\n this.detailForm.get('tags')?.setValue(entity.tags.map(t => t.id));\n if (this.customFields.length) {\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get(['customFields']), entity);\n }\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left></vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"asset-detail\" />\n <button\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateAsset']\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.update' | translate }}\n </button>\n <vdr-action-bar-dropdown-menu locationId=\"asset-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-page-block>\n <vdr-asset-preview\n [asset]=\"entity$ | async\"\n [editable]=\"true\"\n [customFields]=\"customFields\"\n [customFieldsForm]=\"detailForm.get('customFields')\"\n (assetChange)=\"onAssetChange($event)\"\n />\n</vdr-page-block>\n", "import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n BaseListComponent,\n DataService,\n DeletionResult,\n GetAssetListQuery,\n GetAssetListQueryVariables,\n ItemOf,\n LogicalOperator,\n ModalService,\n NotificationService,\n SortOrder,\n TagFragment,\n} from '@vendure/admin-ui/core';\nimport { PaginationInstance } from 'ngx-pagination';\nimport { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs';\nimport { debounceTime, finalize, map, switchMap, takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-asset-list',\n templateUrl: './asset-list.component.html',\n styleUrls: ['./asset-list.component.scss'],\n standalone: false\n})\nexport class AssetListComponent\n extends BaseListComponent<\n GetAssetListQuery,\n ItemOf<GetAssetListQuery, 'assets'>,\n GetAssetListQueryVariables\n >\n implements OnInit\n{\n searchTerm$ = new BehaviorSubject<string | undefined>(undefined);\n filterByTags$ = new BehaviorSubject<TagFragment[] | undefined>(undefined);\n uploading = false;\n allTags$: Observable<TagFragment[]>;\n paginationConfig$: Observable<PaginationInstance>;\n\n constructor(\n private notificationService: NotificationService,\n private modalService: ModalService,\n private dataService: DataService,\n router: Router,\n route: ActivatedRoute,\n ) {\n super(router, route);\n super.setQueryFn(\n (...args: any[]) => this.dataService.product.getAssetList(...args).refetchOnChannelChange(),\n data => data.assets,\n (skip, take) => {\n const searchTerm = this.searchTerm$.value;\n const tags = this.filterByTags$.value?.map(t => t.value);\n return {\n options: {\n skip,\n take,\n ...(searchTerm\n ? {\n filter: {\n name: { contains: searchTerm },\n },\n }\n : {}),\n sort: {\n createdAt: SortOrder.DESC,\n },\n tags,\n tagsOperator: LogicalOperator.AND,\n },\n };\n },\n { take: 25, skip: 0 },\n );\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.paginationConfig$ = combineLatest(this.itemsPerPage$, this.currentPage$, this.totalItems$).pipe(\n map(([itemsPerPage, currentPage, totalItems]) => ({ itemsPerPage, currentPage, totalItems })),\n );\n this.searchTerm$.pipe(debounceTime(250), takeUntil(this.destroy$)).subscribe(() => this.refresh());\n\n this.filterByTags$.pipe(takeUntil(this.destroy$)).subscribe(() => this.refresh());\n this.allTags$ = this.dataService.product.getTagList().mapStream(data => data.tags.items);\n }\n\n filesSelected(files: File[]) {\n if (files.length) {\n this.uploading = true;\n this.dataService.product\n .createAssets(files)\n .pipe(finalize(() => (this.uploading = false)))\n .subscribe(({ createAssets }) => {\n let successCount = 0;\n for (const result of createAssets) {\n switch (result.__typename) {\n case 'Asset':\n successCount++;\n break;\n case 'MimeTypeError':\n this.notificationService.error(result.message);\n break;\n }\n }\n if (0 < successCount) {\n super.refresh();\n this.notificationService.success(_('asset.notify-create-assets-success'), {\n count: successCount,\n });\n }\n });\n }\n }\n\n deleteAssets(assets: Asset[]) {\n this.showModalAndDelete(assets.map(a => a.id))\n .pipe(\n switchMap(response => {\n if (response.result === DeletionResult.DELETED) {\n return [true];\n } else {\n return this.showModalAndDelete(\n assets.map(a => a.id),\n response.message || '',\n ).pipe(map(r => r.result === DeletionResult.DELETED));\n }\n }),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'Assets',\n });\n this.refresh();\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'Assets',\n });\n },\n );\n }\n\n private showModalAndDelete(assetIds: string[], message?: string) {\n return this.modalService\n .dialog({\n title: _('catalog.confirm-delete-assets'),\n translationVars: {\n count: assetIds.length,\n },\n body: message,\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(res => (res ? this.dataService.product.deleteAssets(assetIds, !!message) : EMPTY)),\n map(res => res.deleteAssets),\n );\n }\n}\n", "<vdr-page-block>\n <div class=\"my-2\">\n <vdr-asset-search-input\n [tags]=\"allTags$ | async\"\n (searchTermChange)=\"searchTerm$.next($event)\"\n (tagsChange)=\"filterByTags$.next($event)\"\n >\n <vdr-asset-file-input\n (selectFiles)=\"filesSelected($event)\"\n [uploading]=\"uploading\"\n dropZoneTarget=\".content-area\"\n ></vdr-asset-file-input>\n </vdr-asset-search-input>\n </div>\n <vdr-asset-gallery\n [assets]=\"(items$ | async)! | paginate : (paginationConfig$ | async) || {}\"\n [multiSelect]=\"true\"\n [canDelete]=\"['DeleteCatalog', 'DeleteAsset'] | hasPermission\"\n (deleteAssets)=\"deleteAssets($event)\"\n ></vdr-asset-gallery>\n\n <div class=\"paging-controls\">\n <vdr-items-per-page-controls\n [itemsPerPage]=\"itemsPerPage$ | async\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n ></vdr-items-per-page-controls>\n\n <vdr-pagination-controls\n [currentPage]=\"currentPage$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n (pageChange)=\"setPageNumber($event)\"\n ></vdr-pagination-controls>\n </div>\n</vdr-page-block>\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n Dialog,\n GetChannelsQuery,\n ItemOf,\n LogicalOperator,\n NotificationService,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, from, lastValueFrom, Observable } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\n\ntype Channel = ItemOf<GetChannelsQuery, 'channels'>;\n\n@Component({\n selector: 'vdr-assign-products-to-channel-dialog',\n templateUrl: './assign-products-to-channel-dialog.component.html',\n styleUrls: ['./assign-products-to-channel-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class AssignProductsToChannelDialogComponent implements OnInit, Dialog<any> {\n selectedChannel: Channel | null | undefined;\n currentChannel: Channel;\n availableChannels: Channel[];\n resolveWith: (result?: any) => void;\n variantsPreview$: Observable<Array<{ id: string; name: string; price: number; pricePreview: number }>>;\n priceFactorControl = new UntypedFormControl(1);\n selectedChannelIdControl = new UntypedFormControl();\n\n // assigned by ModalService.fromComponent() call\n productIds: string[];\n productVariantIds: string[] | undefined;\n currentChannelIds: string[];\n\n get isProductVariantMode(): boolean {\n return this.productVariantIds != null;\n }\n\n constructor(private dataService: DataService, private notificationService: NotificationService) {}\n\n ngOnInit() {\n const activeChannelId$ = this.dataService.client\n .userStatus()\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\n const allChannels$ = this.dataService.settings.getChannels().mapSingle(data => data.channels);\n\n combineLatest(activeChannelId$, allChannels$).subscribe(([activeChannelId, channels]) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.currentChannel = channels.items.find(c => c.id === activeChannelId)!;\n this.availableChannels = channels.items;\n });\n\n this.selectedChannelIdControl.valueChanges.subscribe(ids => {\n this.selectChannel(ids);\n });\n\n this.variantsPreview$ = combineLatest(\n from(this.getTopVariants(10)),\n this.priceFactorControl.valueChanges.pipe(startWith(1)),\n ).pipe(\n map(([variants, factor]) =>\n variants.map(v => ({\n id: v.id,\n name: v.name,\n price: v.price,\n pricePreview: v.price * +factor,\n })),\n ),\n );\n }\n\n selectChannel(channelIds: string[]) {\n this.selectedChannel = this.availableChannels.find(c => c.id === channelIds[0]);\n }\n\n assign() {\n const selectedChannel = this.selectedChannel;\n if (selectedChannel) {\n if (!this.isProductVariantMode) {\n this.dataService.product\n .assignProductsToChannel({\n channelId: selectedChannel.id,\n productIds: this.productIds,\n priceFactor: +this.priceFactorControl.value,\n })\n .subscribe(() => {\n this.notificationService.success(_('catalog.assign-product-to-channel-success'), {\n channel: selectedChannel.code,\n count: this.productIds.length,\n });\n this.resolveWith(true);\n });\n } else if (this.productVariantIds) {\n this.dataService.product\n .assignVariantsToChannel({\n channelId: selectedChannel.id,\n productVariantIds: this.productVariantIds,\n priceFactor: +this.priceFactorControl.value,\n })\n .subscribe(() => {\n this.notificationService.success(_('catalog.assign-variant-to-channel-success'), {\n channel: selectedChannel.code,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n count: this.productVariantIds!.length,\n });\n this.resolveWith(true);\n });\n }\n }\n }\n\n cancel() {\n this.resolveWith();\n }\n\n private async getTopVariants(take: number) {\n return (\n await lastValueFrom(\n this.dataService.product.getProductVariants({\n filterOperator: LogicalOperator.OR,\n filter: {\n productId: { in: this.productIds },\n id: { in: this.productVariantIds },\n },\n take,\n }).single$,\n )\n ).productVariants.items;\n }\n}\n", "<ng-template vdrDialogTitle>\n <ng-container *ngIf=\"isProductVariantMode; else productModeTitle\">{{\n 'catalog.assign-variants-to-channel' | translate\n }}</ng-container>\n <ng-template #productModeTitle>{{ 'catalog.assign-products-to-channel' | translate }}</ng-template>\n</ng-template>\n\n<div class=\"flex\">\n <clr-input-container>\n <label>{{ 'common.channel' | translate }}</label>\n <vdr-channel-assignment-control\n clrInput\n [multiple]=\"false\"\n [includeDefaultChannel]=\"false\"\n [disableChannelIds]=\"currentChannelIds\"\n [formControl]=\"selectedChannelIdControl\"\n ></vdr-channel-assignment-control>\n </clr-input-container>\n <div class=\"flex-spacer\"></div>\n <clr-input-container>\n <label>{{ 'catalog.price-conversion-factor' | translate }}</label>\n <input clrInput type=\"number\" min=\"0\" max=\"99999\" [formControl]=\"priceFactorControl\" />\n </clr-input-container>\n</div>\n\n<div class=\"channel-price-preview\">\n <label class=\"clr-control-label\">{{ 'catalog.channel-price-preview' | translate }}</label>\n <table class=\"table\">\n <thead>\n <tr>\n <th>{{ 'common.name' | translate }}</th>\n <th>\n {{\n 'catalog.price-in-channel'\n | translate: { channel: currentChannel?.code | channelCodeToLabel | translate }\n }}\n </th>\n <th>\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\n {{ 'catalog.price-in-channel' | translate: { channel: selectedChannel?.code } }}\n </ng-template>\n <ng-template #noSelection>\n {{ 'catalog.no-channel-selected' | translate }}\n </ng-template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of variantsPreview$ | async\">\n <td>{{ row.name }}</td>\n <td>{{ row.price | localeCurrency: currentChannel?.defaultCurrencyCode }}</td>\n <td>\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\n {{ row.pricePreview | localeCurrency: selectedChannel?.defaultCurrencyCode }}\n </ng-template>\n <ng-template #noChannelSelected> - </ng-template>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"assign()\" [disabled]=\"!selectedChannel\" class=\"btn btn-primary\">\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\n {{ 'catalog.assign-to-named-channel' | translate: { channelCode: selectedChannel?.code } }}\n </ng-template>\n <ng-template #noSelection>\n {{ 'catalog.no-channel-selected' | translate }}\n </ng-template>\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport {\n DataService,\n Dialog,\n FacetValueFragment,\n GetProductsWithFacetValuesByIdsQuery,\n GetProductsWithFacetValuesByIdsQueryVariables,\n GetVariantsWithFacetValuesByIdsQuery,\n UpdateProductsBulkMutation,\n UpdateProductsBulkMutationVariables,\n UpdateVariantsBulkMutation,\n UpdateVariantsBulkMutationVariables,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { Observable, Subscription } from 'rxjs';\n\nimport {\n GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS,\n GET_VARIANTS_WITH_FACET_VALUES_BY_IDS,\n UPDATE_PRODUCTS_BULK,\n UPDATE_VARIANTS_BULK,\n} from './bulk-add-facet-values-dialog.graphql';\n\ninterface ProductOrVariant {\n id: string;\n name: string;\n sku?: string;\n facetValues: Array<{\n id: string;\n name: string;\n code: string;\n facet: Array<{\n id: string;\n name: string;\n code: string;\n }>;\n }>;\n}\n\n@Component({\n selector: 'vdr-bulk-add-facet-values-dialog',\n templateUrl: './bulk-add-facet-values-dialog.component.html',\n styleUrls: ['./bulk-add-facet-values-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class BulkAddFacetValuesDialogComponent implements OnInit, OnDestroy, Dialog<FacetValueFragment[]> {\n resolveWith: (result?: FacetValueFragment[]) => void;\n /* provided by call to ModalService */\n mode: 'product' | 'variant' = 'product';\n ids?: string[];\n state: 'loading' | 'ready' | 'saving' = 'loading';\n\n selectedValues: FacetValueFragment[] = [];\n items: ProductOrVariant[] = [];\n facetValuesRemoved = false;\n private subscription: Subscription;\n constructor(\n private dataService: DataService,\n private changeDetectorRef: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n const fetchData$: Observable<any> =\n this.mode === 'product'\n ? this.dataService\n .query<\n GetProductsWithFacetValuesByIdsQuery,\n GetProductsWithFacetValuesByIdsQueryVariables\n >(GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS, {\n ids: this.ids ?? [],\n })\n .mapSingle(({ products }) =>\n products.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\n )\n : this.dataService\n .query<\n GetVariantsWithFacetValuesByIdsQuery,\n GetProductsWithFacetValuesByIdsQueryVariables\n >(GET_VARIANTS_WITH_FACET_VALUES_BY_IDS, {\n ids: this.ids ?? [],\n })\n .mapSingle(({ productVariants }) =>\n productVariants.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\n );\n this.subscription = fetchData$.subscribe({\n next: items => {\n this.items = items;\n this.state = 'ready';\n this.changeDetectorRef.markForCheck();\n },\n });\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n\n cancel() {\n this.resolveWith();\n }\n\n removeFacetValue(item: ProductOrVariant, facetValueId: string) {\n item.facetValues = item.facetValues.filter(fv => fv.id !== facetValueId);\n this.facetValuesRemoved = true;\n }\n\n addFacetValues() {\n const selectedFacetValueIds = this.selectedValues.map(sv => sv.id);\n this.state = 'saving';\n const save$: Observable<any> =\n this.mode === 'product'\n ? this.dataService.mutate<UpdateProductsBulkMutation, UpdateProductsBulkMutationVariables>(\n UPDATE_PRODUCTS_BULK,\n {\n input: this.items?.map(product => ({\n id: product.id,\n facetValueIds: unique([\n ...product.facetValues.map(fv => fv.id),\n ...selectedFacetValueIds,\n ]),\n })),\n },\n )\n : this.dataService.mutate<UpdateVariantsBulkMutation, UpdateVariantsBulkMutationVariables>(\n UPDATE_VARIANTS_BULK,\n {\n input: this.items?.map(product => ({\n id: product.id,\n facetValueIds: unique([\n ...product.facetValues.map(fv => fv.id),\n ...selectedFacetValueIds,\n ]),\n })),\n },\n );\n return save$.subscribe(result => {\n this.resolveWith(this.selectedValues);\n });\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.edit-facet-values' | translate }}\n</ng-template>\n\n<div class=\"flex\">\n <div class=\"flex center\">\n <div class=\"mr2\">\n {{ 'catalog.add-facet-value' | translate }}\n </div>\n <vdr-facet-value-selector\n (selectedValuesChange)=\"selectedValues = $event\"\n ></vdr-facet-value-selector>\n </div>\n</div>\n\n<table class=\"table\" *ngIf=\"state !== 'loading'; else placeholder\">\n <tbody>\n <tr *ngFor=\"let item of items\">\n <td class=\"left align-middle\">\n <div>{{ item.name }}</div>\n <div *ngIf=\"item.sku\" class=\"sku\">{{ item.sku }}</div>\n </td>\n <td class=\"left\">\n <vdr-facet-value-chip\n *ngFor=\"let facetValue of item.facetValues\"\n [facetValue]=\"facetValue\"\n (remove)=\"removeFacetValue(item, facetValue.id)\"\n ></vdr-facet-value-chip>\n </td>\n </tr>\n </tbody>\n</table>\n\n<ng-template #placeholder>\n <div class=\"loading\">\n <clr-spinner></clr-spinner>\n </div>\n</ng-template>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button\n type=\"submit\"\n (click)=\"addFacetValues()\"\n [disabled]=\"selectedValues.length === 0 && facetValuesRemoved === false\"\n class=\"btn btn-primary\"\n >\n {{ 'common.update' | translate }}\n </button>\n</ng-template>\n", "import { gql } from 'apollo-angular';\n\nexport const GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS = gql`\n query GetProductsWithFacetValuesByIds($ids: [String!]!) {\n products(options: { filter: { id: { in: $ids } } }) {\n items {\n id\n name\n facetValues {\n id\n name\n code\n facet {\n id\n name\n code\n }\n }\n }\n }\n }\n`;\n\nexport const GET_VARIANTS_WITH_FACET_VALUES_BY_IDS = gql`\n query GetVariantsWithFacetValuesByIds($ids: [String!]!) {\n productVariants(options: { filter: { id: { in: $ids } } }) {\n items {\n id\n name\n sku\n facetValues {\n id\n name\n code\n facet {\n id\n name\n code\n }\n }\n }\n }\n }\n`;\n\nexport const UPDATE_PRODUCTS_BULK = gql`\n mutation UpdateProductsBulk($input: [UpdateProductInput!]!) {\n updateProducts(input: $input) {\n id\n name\n facetValues {\n id\n name\n code\n }\n }\n }\n`;\n\nexport const UPDATE_VARIANTS_BULK = gql`\n mutation UpdateVariantsBulk($input: [UpdateProductVariantInput!]!) {\n updateProductVariants(input: $input) {\n id\n name\n facetValues {\n id\n name\n code\n }\n }\n }\n`;\n", "import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n CollectionFilterParameter,\n ConfigurableOperationInput,\n DataService,\n GetCollectionContentsQuery,\n} from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport {\n catchError,\n debounceTime,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n startWith,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-collection-contents',\n templateUrl: './collection-contents.component.html',\n styleUrls: ['./collection-contents.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionContentsComponent implements OnInit, OnChanges, OnDestroy {\n @Input() collectionId: string;\n @Input() parentId: string;\n @Input() inheritFilters: boolean;\n @Input() updatedFilters: ConfigurableOperationInput[] | undefined;\n @Input() previewUpdatedFilters = false;\n @ContentChild(TemplateRef, { static: true }) headerTemplate: TemplateRef<any>;\n\n contents$: Observable<NonNullable<GetCollectionContentsQuery['collection']>['productVariants']['items']>;\n contentsTotalItems$: Observable<number>;\n contentsItemsPerPage$: Observable<number>;\n contentsCurrentPage$: Observable<number>;\n filterTermControl = new UntypedFormControl('');\n isLoading = false;\n private collectionIdChange$ = new BehaviorSubject<string>('');\n private parentIdChange$ = new BehaviorSubject<string>('');\n private filterChanges$ = new BehaviorSubject<ConfigurableOperationInput[]>([]);\n private inheritFiltersChanges$ = new BehaviorSubject<boolean>(true);\n private refresh$ = new BehaviorSubject<boolean>(true);\n private destroy$ = new Subject<void>();\n\n constructor(private route: ActivatedRoute, private router: Router, private dataService: DataService) {}\n\n ngOnInit() {\n this.contentsCurrentPage$ = this.route.queryParamMap.pipe(\n map(qpm => qpm.get('contentsPage')),\n map(page => (!page ? 1 : +page)),\n startWith(1),\n distinctUntilChanged(),\n );\n\n this.contentsItemsPerPage$ = this.route.queryParamMap.pipe(\n map(qpm => qpm.get('contentsPerPage')),\n map(perPage => (!perPage ? 10 : +perPage)),\n startWith(10),\n distinctUntilChanged(),\n );\n\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\n debounceTime(250),\n tap(() => this.setContentsPageNumber(1)),\n startWith(''),\n );\n\n const filterChanges$ = this.filterChanges$.asObservable().pipe(\n filter(() => this.previewUpdatedFilters),\n tap(() => this.setContentsPageNumber(1)),\n startWith([]),\n );\n\n const inheritFiltersChanges$ = this.inheritFiltersChanges$.asObservable().pipe(\n filter(() => this.inheritFilters != null),\n distinctUntilChanged(),\n tap(() => this.setContentsPageNumber(1)),\n startWith(true),\n );\n\n const fetchUpdate$ = combineLatest(\n this.collectionIdChange$,\n this.parentIdChange$,\n this.contentsCurrentPage$,\n this.contentsItemsPerPage$,\n filterTerm$,\n filterChanges$,\n inheritFiltersChanges$,\n this.refresh$,\n );\n\n const collection$ = fetchUpdate$.pipe(\n takeUntil(this.destroy$),\n tap(() => (this.isLoading = true)),\n debounceTime(50),\n switchMap(([id, parentId, currentPage, itemsPerPage, filterTerm, filters, inheritFilters]) => {\n const take = itemsPerPage;\n const skip = (currentPage - 1) * itemsPerPage;\n if (filters.length && this.previewUpdatedFilters) {\n const filterClause = filterTerm\n ? ({ name: { contains: filterTerm } } as CollectionFilterParameter)\n : undefined;\n return this.dataService.collection\n .previewCollectionVariants(\n {\n parentId,\n filters,\n inheritFilters,\n },\n {\n take,\n skip,\n filter: filterClause,\n },\n )\n .mapSingle(data => data.previewCollectionVariants)\n .pipe(catchError(() => of({ items: [], totalItems: 0 })));\n } else if (id) {\n return this.dataService.collection\n .getCollectionContents(id, take, skip, filterTerm)\n .mapSingle(data => data.collection?.productVariants);\n } else {\n return of(null);\n }\n }),\n tap(() => (this.isLoading = false)),\n finalize(() => (this.isLoading = false)),\n );\n\n this.contents$ = collection$.pipe(map(result => (result ? result.items : [])));\n this.contentsTotalItems$ = collection$.pipe(map(result => (result ? result.totalItems : 0)));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ('collectionId' in changes) {\n this.collectionIdChange$.next(changes.collectionId.currentValue);\n }\n if ('parentId' in changes) {\n this.parentIdChange$.next(changes.parentId.currentValue);\n }\n if ('inheritFilters' in changes) {\n this.inheritFiltersChanges$.next(changes.inheritFilters.currentValue);\n }\n if ('updatedFilters' in changes) {\n if (this.updatedFilters) {\n this.filterChanges$.next(this.updatedFilters);\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n setContentsPageNumber(page: number) {\n this.setParam('contentsPage', page);\n }\n\n setContentsItemsPerPage(perPage: number) {\n this.setParam('contentsPerPage', perPage);\n }\n\n refresh() {\n this.refresh$.next(true);\n }\n\n private setParam(key: string, value: any) {\n this.router.navigate(['./'], {\n relativeTo: this.route,\n queryParams: {\n [key]: value,\n },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\n}\n", "<div class=\"table-wrapper\">\n <div class=\"progress loop\" [class.visible]=\"isLoading\"></div>\n <div class=\"header-title-row\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { $implicit: contentsTotalItems$ | async }\"\n ></ng-container>\n </div>\n <vdr-data-table-2\n id=\"collection-contents\"\n [class.loading]=\"isLoading\"\n [items]=\"contents$ | async\"\n [itemsPerPage]=\"contentsItemsPerPage$ | async\"\n [totalItems]=\"contentsTotalItems$ | async\"\n [currentPage]=\"contentsCurrentPage$ | async\"\n (pageChange)=\"setContentsPageNumber($event)\"\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\n >\n <vdr-dt2-search\n [searchTermControl]=\"filterTermControl\"\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['/catalog/products', variant.productId]\"\n ><span>{{ variant.name }}</span\n ><clr-icon shape=\"arrow right\"\n /></a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n {{ variant.sku }}\n </ng-template>\n </vdr-dt2-column>\n </vdr-data-table-2>\n</div>\n", "import { CdkDrag, CdkDragDrop, CdkDropList, DragRef } from '@angular/cdk/drag-drop';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { DataService, DataTable2Component, GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\n\nexport type CollectionTableItem = ItemOf<GetCollectionListQuery, 'collections'>;\nexport type CollectionOrderEvent = {\n collectionId: string;\n parentId: string;\n index: number;\n};\n@Component({\n selector: 'vdr-collection-data-table',\n templateUrl: './collection-data-table.component.html',\n styleUrls: [\n '../../../../core/src/shared/components/data-table-2/data-table2.component.scss',\n './collection-data-table.component.scss',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionDataTableComponent\n extends DataTable2Component<CollectionTableItem>\n implements OnChanges, AfterViewInit\n{\n @Input() subCollections: CollectionTableItem[];\n @Output() changeOrder = new EventEmitter<CollectionOrderEvent>();\n @ViewChild(CdkDropList, { static: true }) dropList: CdkDropList<{\n depth: number;\n collection: CollectionTableItem;\n }>;\n @ViewChildren('collectionRow', { read: CdkDrag }) collectionRowList: QueryList<CdkDrag>;\n dragRefs: DragRef[] = [];\n absoluteIndex: { [id: string]: number } = {};\n constructor(\n protected changeDetectorRef: ChangeDetectorRef,\n protected dataService: DataService,\n ) {\n super(changeDetectorRef, dataService);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n super.ngOnChanges(changes);\n if (changes.subCollections || changes.items) {\n const allCollections: CollectionTableItem[] = [];\n for (const collection of this.items ?? []) {\n allCollections.push(collection);\n const subCollectionMatches = this.getSubcollections(collection);\n allCollections.push(...subCollectionMatches.flat());\n }\n allCollections.forEach((collection, index) => (this.absoluteIndex[collection.id] = index));\n }\n }\n\n ngAfterViewInit() {\n this.collectionRowList.changes.subscribe((val: QueryList<CdkDrag>) => {\n this.dropList.getSortedItems().forEach(item => this.dropList.removeItem(item));\n for (const ref of val.toArray()) {\n ref.dropContainer = this.dropList;\n ref._dragRef._withDropContainer(this.dropList._dropListRef);\n this.dropList.addItem(ref);\n }\n });\n }\n\n getSubcollections(item: CollectionTableItem) {\n return this.subCollections?.filter(c => c.parentId === item.id) ?? [];\n }\n\n sortPredicate = (index: number, item: CdkDrag<{ depth: number; collection: CollectionTableItem }>) => {\n const itemAtIndex = this.dropList.getSortedItems()[index];\n return itemAtIndex?.data.collection.parentId === item.data.collection.parentId;\n };\n\n onDrop(\n event: CdkDragDrop<{\n depth: number;\n collection: CollectionTableItem;\n }>,\n ) {\n const isTopLevel = event.item.data.collection.breadcrumbs.length === 2;\n const pageIndexOffset = isTopLevel ? (this.currentPage - 1) * this.itemsPerPage : 0;\n const parentId = event.item.data.collection.parentId;\n const parentIndex = this.items.findIndex(i => i.id === parentId);\n const adjustedIndex = pageIndexOffset + event.currentIndex - parentIndex - 1;\n this.changeOrder.emit({\n collectionId: event.item.data.collection.id,\n index: adjustedIndex,\n parentId: event.item.data.collection.parentId,\n });\n\n if (isTopLevel) {\n this.items = [...this.items];\n this.items.splice(event.previousIndex, 1);\n this.items.splice(event.currentIndex, 0, event.item.data.collection);\n } else {\n const parent = this.items.find(i => i.id === parentId);\n if (parent) {\n const subCollections = this.getSubcollections(parent);\n const adjustedPreviousIndex = pageIndexOffset + event.previousIndex - parentIndex - 1;\n subCollections.splice(adjustedPreviousIndex, 1);\n subCollections.splice(event.currentIndex, 0, event.item.data.collection);\n }\n }\n this.changeDetectorRef.markForCheck();\n }\n}\n", "<vdr-data-table-filter-presets\n *ngIf=\"filters\"\n [filters]=\"filters\"\n [dataTableId]=\"id\"\n></vdr-data-table-filter-presets>\n<div class=\"table-wrapper\">\n <div class=\"bulk-actions\">\n <ng-content select=\"vdr-bulk-action-menu\"></ng-content>\n </div>\n <table class=\"\" [class.no-select]=\"disableSelect\">\n <thead [class.items-selected]=\"selectionManager?.selection.length\">\n <tr class=\"heading-row\">\n <th *ngIf=\"selectionManager\" class=\"selection-col\">\n <div class=\"flex\">\n <div class=\"drag-handle-spacer\"></div>\n <input\n type=\"checkbox\"\n clrCheckbox\n [checked]=\"selectionManager?.areAllCurrentItemsSelected()\"\n (change)=\"onToggleAllClick()\"\n />\n </div>\n </th>\n <th\n *ngFor=\"let column of visibleSortedColumns; last as isLast\"\n [class.expand]=\"column.expand\"\n >\n <div class=\"cell-content\" [ngClass]=\"column.align\">\n <vdr-ui-extension-point\n [locationId]=\"id\"\n [metadata]=\"column.id\"\n api=\"dataTable\"\n [topPx]=\"-6\"\n [leftPx]=\"-24\"\n display=\"block\"\n >\n <span>{{ column.heading }}</span>\n </vdr-ui-extension-point>\n <div *ngIf=\"column.sort as sort\" class=\"sort-toggle\">\n <button (click)=\"sort.toggleSortOrder()\" [class.active]=\"sort.sortOrder\">\n <clr-icon *ngIf=\"!sort.sortOrder\" shape=\"two-way-arrows left\"></clr-icon>\n <clr-icon *ngIf=\"sort.sortOrder === 'ASC'\" shape=\"arrow up\"></clr-icon>\n <clr-icon *ngIf=\"sort.sortOrder === 'DESC'\" shape=\"arrow down\"></clr-icon>\n </button>\n <div class=\"sort-label\" *ngIf=\"sort.sortOrder\">{{ sort.sortOrder }}</div>\n </div>\n </div>\n </th>\n <th>\n <div class=\"column-picker\">\n <vdr-data-table-colum-picker\n [uiLanguage]=\"uiLanguage$ | async\"\n [columns]=\"sortedColumns\"\n (reorder)=\"onColumnReorder($event)\"\n (resetColumns)=\"onColumnsReset()\"\n ></vdr-data-table-colum-picker>\n </div>\n </th>\n </tr>\n <tr *ngIf=\"searchComponent || customSearchTemplate || filters?.length\">\n <th\n [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\"\n class=\"filter-row\"\n [class.active]=\"showSearchFilterRow\"\n >\n <button\n class=\"button-ghost toggle-search-filter-row\"\n [class.active]=\"showSearchFilterRow\"\n (click)=\"toggleSearchFilterRow()\"\n [title]=\"'common.search-and-filter-list' | translate\"\n >\n <clr-icon shape=\"search\"></clr-icon>\n </button>\n <div class=\"filter-row-wrapper\" [class.hidden]=\"!showSearchFilterRow\">\n <ng-container *ngTemplateOutlet=\"searchComponent?.template\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customSearchTemplate\"></ng-container>\n <ng-container *ngIf=\"filters\">\n <div class=\"filters\">\n <vdr-data-table-filters\n *ngFor=\"let activeFilter of filters.activeFilters\"\n [filterWithValue]=\"activeFilter\"\n [filters]=\"filters\"\n class=\"mt-1\"\n ></vdr-data-table-filters>\n <vdr-data-table-filters\n *ngIf=\"filters.length\"\n [filters]=\"filters\"\n class=\"mt-1\"\n ></vdr-data-table-filters>\n <vdr-add-filter-preset-button\n [filters]=\"filters\"\n [dataTableId]=\"id\"\n ></vdr-add-filter-preset-button>\n </div>\n </ng-container>\n </div>\n </th>\n </tr>\n </thead>\n <tbody\n cdkDropList\n cdkDropListLockAxis=\"y\"\n (cdkDropListDropped)=\"onDrop($event)\"\n [cdkDropListSortPredicate]=\"sortPredicate\"\n >\n <ng-container\n *ngFor=\"\n let item of items\n | paginate\n : {\n itemsPerPage: itemsPerPage,\n currentPage: currentPage,\n totalItems: totalItems,\n id: id,\n };\n index as i;\n trackBy: trackByFn.bind(this)\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"collectionRowTmp\"\n [ngTemplateOutletContext]=\"{ item: item, i: i, depth: 0 }\"\n ></ng-container>\n </ng-container>\n <ng-container>\n <tr *ngIf=\"!items?.length\">\n <td [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\">\n <vdr-empty-placeholder [emptyStateLabel]=\"emptyStateLabel\"></vdr-empty-placeholder>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n</div>\n<div class=\"table-footer\">\n <vdr-items-per-page-controls\n *ngIf=\"totalItems\"\n [itemsPerPage]=\"itemsPerPage\"\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\n ></vdr-items-per-page-controls>\n <div *ngIf=\"totalItems\" class=\"p5 total-items-count\">\n {{ 'common.total-items' | translate : { currentStart, currentEnd, totalItems } }}\n </div>\n\n <vdr-pagination-controls\n *ngIf=\"totalItems\"\n [id]=\"id\"\n [currentPage]=\"currentPage\"\n [itemsPerPage]=\"itemsPerPage\"\n [totalItems]=\"totalItems\"\n (pageChange)=\"pageChange.emit($event)\"\n ></vdr-pagination-controls>\n</div>\n\n<ng-template #collectionRowTmp let-item=\"item\" let-depth=\"depth\">\n <tr #collectionRow cdkDrag [cdkDragData]=\"{ depth: depth, collection: item }\" cdkDragBoundary=\"tbody\">\n <td\n *ngIf=\"selectionManager\"\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\n class=\"selection-col\"\n >\n <div class=\"flex\">\n <div class=\"drag-handle\" cdkDragHandle [title]=\"'catalog.reorder-collection' | translate\">\n <clr-icon shape=\"drag-handle\"></clr-icon>\n </div>\n <input\n type=\"checkbox\"\n clrCheckbox\n [checked]=\"selectionManager?.isSelected(item)\"\n (click)=\"onRowClick(item, $event)\"\n />\n </div>\n </td>\n <td\n *ngFor=\"let column of visibleSortedColumns\"\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\n >\n <div class=\"cell-content\" [ngClass]=\"column.align\">\n <ng-container\n *ngIf=\"customComponents.get(column.id) as componentConfig; else defaultComponent\"\n >\n <ng-container\n *ngComponentOutlet=\"\n componentConfig.config.component;\n inputs: { rowItem: item };\n injector: componentConfig.injector\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultComponent>\n <ng-container\n *ngTemplateOutlet=\"column.template; context: { item: item, depth: depth }\"\n ></ng-container>\n </ng-template>\n </div>\n </td>\n <td [class.active]=\"activeIndex === absoluteIndex[item.id]\"><!-- column select --></td>\n </tr>\n <ng-container *ngFor=\"let subCollection of getSubcollections(item)\">\n <ng-container\n *ngTemplateOutlet=\"collectionRowTmp; context: { item: subCollection, depth: depth + 1 }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n", "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { FormBuilder, UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n COLLECTION_FRAGMENT,\n CollectionDetailQueryDocument,\n CollectionFragment,\n ConfigurableOperation,\n ConfigurableOperationDefinition,\n ConfigurableOperationInput,\n CreateCollectionInput,\n createUpdatedTranslatable,\n DataService,\n encodeConfigArgValue,\n findTranslation,\n getConfigArgValue,\n getCustomFieldsDefaults,\n LanguageCode,\n LocalStorageService,\n ModalService,\n NotificationService,\n Permission,\n TypedBaseDetailComponent,\n unicodePatternValidator,\n UpdateCollectionInput,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { gql } from 'apollo-angular';\nimport { combineLatest, merge, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, take } from 'rxjs/operators';\n\nimport { CollectionContentsComponent } from '../collection-contents/collection-contents.component';\n\nexport const COLLECTION_DETAIL_QUERY = gql`\n query CollectionDetailQuery($id: ID!) {\n collection(id: $id) {\n ...Collection\n }\n }\n ${COLLECTION_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-collection-detail',\n templateUrl: './collection-detail.component.html',\n styleUrls: ['./collection-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class CollectionDetailComponent\n extends TypedBaseDetailComponent<typeof CollectionDetailQueryDocument, 'collection'>\n implements OnInit, OnDestroy\n{\n customFields = this.getCustomFieldConfig('Collection');\n detailForm = this.formBuilder.group({\n name: ['', Validators.required],\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9._-]+$/u)],\n description: '',\n visible: false,\n inheritFilters: true,\n filters: this.formBuilder.array([]),\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n assetChanges: { assets?: Asset[]; featuredAsset?: Asset } = {};\n filters: ConfigurableOperation[] = [];\n allFilters: ConfigurableOperationDefinition[] = [];\n updatedFilters$: Observable<ConfigurableOperationInput[]>;\n inheritFilters$: Observable<boolean>;\n livePreview = false;\n parentId$: Observable<string | undefined>;\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateCollection];\n private filterRemoved$ = new Subject<void>();\n @ViewChild('collectionContents') contentsComponent: CollectionContentsComponent;\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n protected dataService: DataService,\n private formBuilder: FormBuilder,\n private notificationService: NotificationService,\n private modalService: ModalService,\n private localStorageService: LocalStorageService,\n ) {\n super();\n this.livePreview = this.localStorageService.get('livePreviewCollectionContents') ?? false;\n }\n\n ngOnInit() {\n this.init();\n this.dataService.collection.getCollectionFilters().single$.subscribe(res => {\n this.allFilters = res.collectionFilters;\n });\n const filtersFormArray = this.detailForm.get('filters') as UntypedFormArray;\n const inheritFiltersControl = this.detailForm.get('inheritFilters') as UntypedFormControl;\n this.inheritFilters$ = inheritFiltersControl.valueChanges.pipe(distinctUntilChanged());\n this.updatedFilters$ = merge(filtersFormArray.statusChanges, this.filterRemoved$).pipe(\n debounceTime(200),\n filter(() => filtersFormArray.touched),\n map(() =>\n this.mapOperationsToInputs(this.filters, filtersFormArray.value).filter(_filter => {\n // ensure all the arguments have valid values. E.g. a newly-added\n // filter will not yet have valid values\n for (const arg of _filter.arguments) {\n if (arg.value === '') {\n return false;\n }\n }\n return true;\n }),\n ),\n );\n this.parentId$ = this.route.paramMap.pipe(\n map(pm => pm.get('parentId') || undefined),\n switchMap(parentId => {\n if (parentId) {\n return of(parentId);\n } else {\n return this.entity$.pipe(map(collection => collection.parent?.id));\n }\n }),\n );\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n getFilterDefinition(_filter: ConfigurableOperation): ConfigurableOperationDefinition | undefined {\n return this.allFilters.find(f => f.code === _filter.code);\n }\n\n assetsChanged(): boolean {\n return !!Object.values(this.assetChanges).length;\n }\n\n /**\n * If creating a new Collection, automatically generate the slug based on the collection name.\n */\n updateSlug(nameValue: string) {\n const slugControl = this.detailForm.get(['slug']);\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\n }\n }\n\n addFilter(collectionFilter: ConfigurableOperation) {\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\n const argsHash = collectionFilter.args.reduce(\n (output, arg) => ({\n ...output,\n [arg.name]: getConfigArgValue(arg.value),\n }),\n {},\n );\n filtersArray.push(\n this.formBuilder.control({\n code: collectionFilter.code,\n args: argsHash,\n }),\n );\n this.filters.push({\n code: collectionFilter.code,\n args: collectionFilter.args.map(a => ({ name: a.name, value: getConfigArgValue(a.value) })),\n });\n }\n\n removeFilter(index: number) {\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\n if (index !== -1) {\n filtersArray.removeAt(index);\n filtersArray.markAsDirty();\n filtersArray.markAsTouched();\n this.filters.splice(index, 1);\n this.filterRemoved$.next();\n }\n }\n\n create() {\n if (!this.detailForm.dirty) {\n return;\n }\n const input = this.getUpdatedCollection(\n {\n id: '',\n createdAt: '',\n updatedAt: '',\n languageCode: this.languageCode,\n name: '',\n slug: '',\n isPrivate: false,\n breadcrumbs: [],\n description: '',\n featuredAsset: null,\n assets: [],\n translations: [],\n inheritFilters: true,\n filters: [],\n parent: {} as any,\n children: null,\n },\n this.detailForm,\n this.languageCode,\n ) as CreateCollectionInput;\n const parentId = this.route.snapshot.paramMap.get('parentId');\n if (parentId) {\n input.parentId = parentId;\n }\n this.dataService.collection.createCollection(input).subscribe(\n data => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'Collection',\n });\n this.assetChanges = {};\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.router.navigate(['../', data.createCollection.id], { relativeTo: this.route });\n },\n err => {\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Collection',\n });\n },\n );\n }\n\n save() {\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([category, languageCode]) => {\n const input = this.getUpdatedCollection(\n category,\n this.detailForm,\n languageCode,\n ) as UpdateCollectionInput;\n return this.dataService.collection.updateCollection(input);\n }),\n )\n .subscribe(\n () => {\n this.assetChanges = {};\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'Collection',\n });\n this.contentsComponent.refresh();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Collection',\n });\n },\n );\n }\n\n canDeactivate(): boolean {\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\n }\n\n toggleLivePreview() {\n this.livePreview = !this.livePreview;\n this.localStorageService.set('livePreviewCollectionContents', this.livePreview);\n }\n\n trackByFn(index: number, item: ConfigurableOperation) {\n return JSON.stringify(item);\n }\n\n /**\n * Sets the values of the form on changes to the category or current language.\n */\n protected setFormValues(entity: CollectionFragment, languageCode: LanguageCode) {\n const currentTranslation = findTranslation(entity, languageCode);\n\n this.detailForm.patchValue({\n name: currentTranslation ? currentTranslation.name : '',\n slug: currentTranslation ? currentTranslation.slug : '',\n description: currentTranslation ? currentTranslation.description : '',\n visible: !entity.isPrivate,\n inheritFilters: entity.inheritFilters,\n });\n\n const formArray = this.detailForm.get('filters') as UntypedFormArray;\n if (formArray.length !== entity.filters.length) {\n formArray.clear();\n this.filters = [];\n entity.filters.forEach(f => this.addFilter(f));\n }\n\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get(['customFields']),\n entity,\n currentTranslation,\n );\n }\n }\n\n /**\n * Given a category and the value of the form, this method creates an updated copy of the category which\n * can then be persisted to the API.\n */\n private getUpdatedCollection(\n category: CollectionFragment,\n form: typeof this.detailForm,\n languageCode: LanguageCode,\n ): CreateCollectionInput | UpdateCollectionInput {\n const updatedCategory = createUpdatedTranslatable({\n translatable: category,\n updatedFields: form.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: category.name || '',\n slug: category.slug || '',\n description: category.description || '',\n },\n });\n return {\n ...updatedCategory,\n assetIds: this.assetChanges.assets?.map(a => a.id),\n featuredAssetId: this.assetChanges.featuredAsset?.id,\n isPrivate: !form.value.visible,\n filters: this.mapOperationsToInputs(this.filters, this.detailForm.value.filters),\n };\n }\n\n /**\n * Maps an array of conditions or actions to the input format expected by the GraphQL API.\n */\n private mapOperationsToInputs(\n operations: ConfigurableOperation[],\n formValueOperations: any,\n ): ConfigurableOperationInput[] {\n return operations.map((o, i) => ({\n code: o.code,\n arguments: Object.entries(formValueOperations[i].args).map(([name, value], j) => ({\n name,\n value: encodeConfigArgValue(value),\n })),\n }));\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"collection-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n *vdrIfPermissions=\"updatePermission\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"collection-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n formControlName=\"visible\"\n id=\"visibility\"\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n />\n <label class=\"visible-toggle\">\n <ng-container *ngIf=\"detailForm.value.visible; else private\">{{\n 'catalog.public' | translate\n }}</ng-container>\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\n </label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\n </vdr-card>\n </vdr-page-detail-sidebar>\n\n <vdr-page-block *ngIf=\"entity$ | async as entity\"\n ><nav role=\"navigation\">\n <ul class=\"collection-breadcrumbs\">\n <li *ngFor=\"let breadcrumb of entity.breadcrumbs; let isFirst = first; let isLast = last\">\n <a [routerLink]=\"['/catalog/collections']\" *ngIf=\"isFirst\">{{\n 'catalog.root-collection' | translate\n }}</a>\n <a\n [routerLink]=\"['/catalog/collections', breadcrumb.id]\"\n *ngIf=\"!isFirst && !isLast\"\n >{{ breadcrumb.name | translate }}</a\n >\n <ng-container *ngIf=\"isLast\">{{ breadcrumb.name | translate }}</ng-container>\n </li>\n </ul>\n </nav>\n </vdr-page-block>\n\n <vdr-page-block>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n (input)=\"updateSlug($event.target.value)\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'catalog.slug' | translate\"\n for=\"slug\"\n [errors]=\"{ pattern: ('catalog.slug-pattern-error' | translate) }\"\n >\n <input\n id=\"slug\"\n type=\"text\"\n formControlName=\"slug\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field\n class=\"form-grid-span\"\n [label]=\"'common.description' | translate\"\n for=\"slug\"\n >\n <vdr-rich-text-editor\n formControlName=\"description\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-rich-text-editor>\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card\n formGroupName=\"customFields\"\n *ngIf=\"customFields.length\"\n [title]=\"'common.custom-fields' | translate\"\n >\n <vdr-tabbed-custom-fields\n entityName=\"Collection\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n <vdr-custom-detail-component-host\n locationId=\"collection-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n <vdr-card [title]=\"'catalog.assets' | translate\">\n <vdr-assets\n [assets]=\"entity?.assets\"\n [featuredAsset]=\"entity?.featuredAsset\"\n [updatePermissions]=\"updatePermission\"\n (change)=\"assetChanges = $event\"\n ></vdr-assets>\n </vdr-card>\n <vdr-card [title]=\"'catalog.filters' | translate\">\n <vdr-form-field [label]=\"'catalog.filter-inheritance' | translate\" for=\"inheritFilters\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n formControlName=\"inheritFilters\"\n id=\"inheritFilters\"\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n />\n <label class=\"visible-toggle\">\n <ng-container *ngIf=\"detailForm.value.inheritFilters; else noInherit\">{{\n 'catalog.inherit-filters-from-parent' | translate\n }}</ng-container>\n <ng-template #noInherit>{{\n 'catalog.do-not-inherit-filters' | translate\n }}</ng-template>\n </label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n <div formArrayName=\"filters\">\n <ng-container *ngFor=\"let filter of filters; index as i; trackBy: trackByFn\">\n <vdr-configurable-input\n (remove)=\"removeFilter(i)\"\n [position]=\"i\"\n [operation]=\"filter\"\n [operationDefinition]=\"getFilterDefinition(filter)\"\n [formControlName]=\"i\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-configurable-input>\n </ng-container>\n </div>\n <div *vdrIfPermissions=\"updatePermission\">\n <vdr-dropdown>\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n <span>{{ 'marketing.add-condition' | translate }}</span>\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let filter of allFilters\"\n type=\"button\"\n vdrDropdownItem\n (click)=\"addFilter(filter)\"\n >\n {{ filter.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n\n <vdr-card [title]=\"'common.contents' | translate\" [paddingX]=\"false\">\n <vdr-collection-contents\n [collectionId]=\"id\"\n [parentId]=\"parentId$ | async\"\n [updatedFilters]=\"updatedFilters$ | async\"\n [inheritFilters]=\"inheritFilters$ | async\"\n [previewUpdatedFilters]=\"livePreview\"\n #collectionContents\n >\n <ng-template let-count>\n <div class=\"ml-3\">\n <div class=\"contents-title\">\n {{ 'catalog.collection-contents' | translate }} ({{\n 'common.results-count' | translate : { count: count }\n }})\n </div>\n <clr-checkbox-wrapper [class.disabled]=\"detailForm.get('filters')?.pristine\">\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModelOptions]=\"{ standalone: true }\"\n [disabled]=\"detailForm.get('filters')?.pristine\"\n [ngModel]=\"livePreview\"\n (ngModelChange)=\"toggleLivePreview()\"\n />\n <label>{{ 'catalog.live-preview-contents' | translate }}</label>\n </clr-checkbox-wrapper>\n </div>\n </ng-template>\n </vdr-collection-contents>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { Pipe, PipeTransform } from '@angular/core';\nimport { GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\n\n/**\n * Removes the root collection and self breadcrumb from the collection breadcrumb list.\n */\n@Pipe({\n name: 'collectionBreadcrumb',\n standalone: false\n})\nexport class CollectionBreadcrumbPipe implements PipeTransform {\n transform(value: ItemOf<GetCollectionListQuery, 'collections'>): unknown {\n return value?.breadcrumbs.slice(1, -1);\n }\n}\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DataService, Dialog, GetCollectionListQuery, I18nService, ItemOf } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, startWith, switchMap, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-move-collections-dialog',\n templateUrl: './move-collections-dialog.component.html',\n styleUrls: ['./move-collections-dialog.component.scss', '../collection-list/collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class MoveCollectionsDialogComponent\n implements OnInit, Dialog<ItemOf<GetCollectionListQuery, 'collections'>>\n{\n resolveWith: (result?: ItemOf<GetCollectionListQuery, 'collections'>) => void;\n searchTermControl = new FormControl('');\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n totalItems$: Observable<number>;\n currentPage$ = new BehaviorSubject(1);\n itemsPerPage$ = new BehaviorSubject(10);\n expandedIds$ = new Subject<string[]>();\n expandedIds: string[] = [];\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n\n constructor(private dataService: DataService, private i18nService: I18nService) {}\n\n ngOnInit() {\n const getCollectionsResult = this.dataService.collection.getCollections();\n\n const searchTerm$ = this.searchTermControl.valueChanges.pipe(\n debounceTime(250),\n distinctUntilChanged(),\n startWith(''),\n );\n const currentPage$ = this.currentPage$.pipe(distinctUntilChanged());\n const itemsPerPage$ = this.itemsPerPage$.pipe(distinctUntilChanged());\n combineLatest(searchTerm$, currentPage$, itemsPerPage$).subscribe(\n ([searchTerm, currentPage, itemsPerPage]) => {\n const topLevelOnly = searchTerm === '';\n getCollectionsResult.ref.refetch({\n options: {\n skip: (currentPage - 1) * itemsPerPage,\n take: itemsPerPage,\n filter: {\n name: { contains: searchTerm },\n },\n topLevelOnly,\n },\n });\n },\n );\n\n const rootCollectionId$ = this.dataService.collection\n .getCollections({\n take: 1,\n topLevelOnly: true,\n })\n .mapSingle(data => data.collections.items[0].parentId);\n\n this.items$ = combineLatest(\n getCollectionsResult.mapStream(({ collections }) => collections),\n rootCollectionId$,\n ).pipe(\n map(([collections, rootCollectionId]) => [\n ...(rootCollectionId\n ? [\n {\n id: rootCollectionId,\n name: this.i18nService.translate('catalog.root-collection'),\n slug: '',\n parentId: '__',\n position: 0,\n featuredAsset: null,\n children: [],\n breadcrumbs: [],\n isPrivate: false,\n createdAt: '',\n updatedAt: '',\n } satisfies ItemOf<GetCollectionListQuery, 'collections'>,\n ]\n : []),\n ...collections.items,\n ]),\n );\n this.totalItems$ = getCollectionsResult.mapStream(data => data.collections.totalItems);\n\n this.subCollections$ = this.expandedIds$.pipe(\n tap(val => (this.expandedIds = val)),\n switchMap(ids => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.expandedIds$.next(expandedIds);\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.move-collections' | translate }}\n</ng-template>\n<vdr-collection-data-table\n class=\"mt-2\"\n id=\"move-collection-list\"\n [items]=\"items$ | async\"\n [subCollections]=\"subCollections$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n (pageChange)=\"currentPage$.next($event)\"\n (itemsPerPageChange)=\"itemsPerPage$.next($event)\"\n>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\n ></vdr-dt2-search>\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-collection=\"item\">\n {{ collection.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-collection=\"item\" let-depth=\"depth\">\n <div [ngClass]=\"'indent-' + depth\"></div>\n <clr-icon\n class=\"child-arrow\"\n [class.transparent]=\"depth === 0\"\n shape=\"child-arrow\"\n *ngIf=\"!collection.children?.length && collection.parentId !== '__'\"\n ></clr-icon>\n <button\n class=\"icon-button folder-button\"\n *ngIf=\"collection.children?.length\"\n (click)=\"toggleExpanded(collection)\"\n >\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\n </button>\n <button class=\"icon-button folder-button\" *ngIf=\"collection.parentId === '__'\" disabled>\n <clr-icon shape=\"folder\" class=\"is-solid\"></clr-icon>\n </button>\n <button class=\"button-ghost\" (click)=\"resolveWith(collection)\">\n <span>{{ 'catalog.move-collection-to' | translate : {name: collection.name} }}</span>\n </button>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\n <ng-template let-collection=\"item\">\n <div class=\"breadcrumb\">\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\n <ng-container *ngIf=\"breadcrumbs.length\">\n <div *ngFor=\"let item of breadcrumbs\">\n <span class=\"separator\">/</span>{{ item.name }}\n </div>\n </ng-container>\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\n </ng-container>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\">\n <ng-template let-collection=\"item\">\n {{ collection.slug }}\n </ng-template>\n </vdr-dt2-column>\n</vdr-collection-data-table>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkAssignToChannelAction,\n createBulkDeleteAction,\n createBulkRemoveFromChannelAction,\n DataService,\n DuplicateEntityDialogComponent,\n GetCollectionListQuery,\n ItemOf,\n ModalService,\n MoveCollectionInput,\n NotificationService,\n Permission,\n} from '@vendure/admin-ui/core';\nimport { EMPTY } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { CollectionPartial } from '../collection-tree/collection-tree.types';\nimport { MoveCollectionsDialogComponent } from '../move-collections-dialog/move-collections-dialog.component';\n\nimport { CollectionListComponent } from './collection-list.component';\n\nexport const deleteCollectionsBulkAction = createBulkDeleteAction<\n ItemOf<GetCollectionListQuery, 'collections'>\n>({\n location: 'collection-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteCollection) ||\n userPermissions.includes(Permission.DeleteCatalog),\n getItemName: item => item.name,\n bulkDelete: (dataService, ids) =>\n dataService.collection.deleteCollections(ids).pipe(map(res => res.deleteCollections)),\n});\n\nexport const moveCollectionsBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\n location: 'collection-list',\n label: _('catalog.move-collections'),\n icon: 'drag-handle',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateCollection),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n modalService\n .fromComponent(MoveCollectionsDialogComponent, {\n size: 'xl',\n closable: true,\n })\n .pipe(\n switchMap(result => {\n if (result) {\n const inputs: MoveCollectionInput[] = selection.map(c => ({\n collectionId: c.id,\n parentId: result.id,\n index: 0,\n }));\n return dataService.collection.moveCollection(inputs);\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(result => {\n notificationService.success(_('catalog.move-collections-success'), {\n count: selection.length,\n });\n clearSelection();\n hostComponent.refresh();\n });\n },\n};\n\nexport const assignCollectionsToChannelBulkAction = createBulkAssignToChannelAction<\n ItemOf<GetCollectionListQuery, 'collections'>\n>({\n location: 'collection-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateCollection),\n getItemName: item => item.name,\n bulkAssignToChannel: (dataService, collectionIds, channelIds) =>\n channelIds.map(channelId =>\n dataService.collection\n .assignCollectionsToChannel({\n collectionIds,\n channelId,\n })\n .pipe(map(res => res.assignCollectionsToChannel)),\n ),\n});\n\nexport const removeCollectionsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetCollectionListQuery, 'collections'>\n>({\n location: 'collection-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteCatalog) ||\n userPermissions.includes(Permission.DeleteCollection),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, collectionIds, channelId) =>\n dataService.collection\n .removeCollectionsFromChannel({\n channelId: channelId,\n collectionIds,\n })\n .pipe(map(res => res.removeCollectionsFromChannel)),\n});\n\nexport const duplicateCollectionsBulkAction: BulkAction<\n ItemOf<GetCollectionListQuery, 'collections'>,\n CollectionListComponent\n> = {\n location: 'collection-list',\n label: _('common.duplicate'),\n icon: 'copy',\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(DuplicateEntityDialogComponent<ItemOf<GetCollectionListQuery, 'collections'>>, {\n locals: {\n entities: selection,\n entityName: 'Collection',\n title: _('catalog.duplicate-collections'),\n getEntityName: entity => entity.name,\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n hostComponent.refresh();\n }\n });\n },\n};\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n GetCollectionListDocument,\n GetCollectionListQuery,\n ItemOf,\n LanguageCode,\n NotificationService,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { distinctUntilChanged, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { CollectionOrderEvent } from '../collection-data-table/collection-data-table.component';\n\n@Component({\n selector: 'vdr-collection-list',\n templateUrl: './collection-list.component.html',\n styleUrls: ['./collection-list.component.scss', './collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionListComponent\n extends TypedBaseListComponent<typeof GetCollectionListDocument, 'collections'>\n implements OnInit\n{\n activeCollectionId$: Observable<string | null>;\n activeCollectionIndex$: Observable<number>;\n activeCollectionTitle$: Observable<string>;\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n expandedIds: string[] = [];\n dataTableListId = 'collection-list';\n readonly customFields = this.getCustomFieldConfig('Collection');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilter({\n name: 'slug',\n label: _('common.slug'),\n type: { kind: 'text' },\n filterField: 'slug',\n })\n .addFilter({\n name: 'visibility',\n type: { kind: 'boolean' },\n label: _('common.visibility'),\n toFilterInput: value => ({\n isPrivate: { eq: !value },\n }),\n })\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n readonly sorts = this.createSortCollection()\n .defaultSort('position', 'ASC')\n .addSort({ name: 'createdAt' })\n .addSort({ name: 'updatedAt' })\n .addSort({ name: 'name' })\n .addSort({ name: 'slug' })\n .addSort({ name: 'position' })\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor(\n protected dataService: DataService,\n private notificationService: NotificationService,\n ) {\n super();\n super.configure({\n document: GetCollectionListDocument,\n getItems: data => data.collections,\n setVariables: (skip, _take) => {\n const topLevelOnly =\n this.searchTermControl.value === '' && this.filters.activeFilters.length === 0\n ? true\n : undefined;\n return {\n options: {\n skip,\n take: _take,\n filter: {\n name: { contains: this.searchTermControl.value },\n ...this.filters.createFilterInput(),\n },\n topLevelOnly,\n sort: this.sorts.createSortInput(),\n },\n };\n },\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\n });\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.activeCollectionId$ = this.route.paramMap.pipe(\n map(pm => pm.get('contents')),\n distinctUntilChanged(),\n );\n const expandedIds$ = this.route.queryParamMap.pipe(\n map(qpm => qpm.get('expanded')),\n distinctUntilChanged(),\n map(ids => (ids ? ids.split(',') : [])),\n );\n expandedIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\n this.expandedIds = ids;\n });\n this.subCollections$ = combineLatest(expandedIds$, this.refresh$).pipe(\n switchMap(([ids]) => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n\n this.activeCollectionTitle$ = combineLatest(\n this.activeCollectionId$,\n this.items$,\n this.subCollections$,\n ).pipe(\n map(([id, collections, subCollections]) => {\n if (id) {\n const match = [...collections, ...subCollections].find(c => c.id === id);\n return match ? match.name : '';\n }\n return '';\n }),\n );\n this.activeCollectionIndex$ = combineLatest(\n this.activeCollectionId$,\n this.items$,\n this.subCollections$,\n ).pipe(\n map(([id, collections, subCollections]) => {\n if (id) {\n const allCollections: typeof collections = [];\n for (const collection of collections) {\n allCollections.push(collection);\n const subCollectionMatches = subCollections.filter(\n c => c.parentId && c.parentId === collection.id,\n );\n allCollections.push(...subCollectionMatches);\n }\n return allCollections.findIndex(c => c.id === id);\n }\n return -1;\n }),\n );\n }\n\n onRearrange(event: CollectionOrderEvent) {\n this.dataService.collection.moveCollection([event]).subscribe({\n next: () => {\n this.notificationService.success(_('common.notify-saved-changes'));\n this.refresh();\n },\n error: err => {\n this.notificationService.error(_('common.notify-save-changes-error'));\n },\n });\n }\n\n closeContents() {\n const params = { ...this.route.snapshot.params };\n delete params.contents;\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\n }\n\n setLanguage(code: LanguageCode) {\n this.dataService.client.setContentLanguage(code).subscribe();\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.router.navigate(['./'], {\n queryParams: {\n expanded: expandedIds.filter(id => !!id).join(','),\n },\n queryParamsHandling: 'merge',\n relativeTo: this.route,\n });\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"collection-list\" />\n <a\n class=\"btn btn-primary\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\n [routerLink]=\"['./create']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-collection' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"collection-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-split-view [rightPanelOpen]=\"activeCollectionId$ | async\" (closeClicked)=\"closeContents()\">\n <ng-template vdrSplitViewLeft>\n <vdr-collection-data-table\n class=\"mt-2\"\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [subCollections]=\"subCollections$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n [activeIndex]=\"activeCollectionIndex$ | async\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (changeOrder)=\"onRearrange($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n >\n <vdr-bulk-action-menu\n locationId=\"collection-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n ></vdr-bulk-action-menu>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\n ></vdr-dt2-search>\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-collection=\"item\">\n {{ collection.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-collection=\"item\">\n {{ collection.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-collection=\"item\">\n {{ collection.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.position' | translate\" id=\"position\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('position')\"\n >\n <ng-template let-collection=\"item\">\n {{ collection.position }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.name' | translate\" id=\"name\"\n [optional]=\"false\"\n [sort]=\"sorts.get('name')\"\n >\n <ng-template let-collection=\"item\" let-depth=\"depth\">\n <div [ngClass]=\"'indent-' + depth\"></div>\n <clr-icon\n class=\"child-arrow\"\n [class.transparent]=\"depth === 0\"\n shape=\"child-arrow\"\n *ngIf=\"!collection.children?.length\"\n ></clr-icon>\n <button\n class=\"icon-button folder-button\"\n *ngIf=\"collection.children?.length\"\n (click)=\"toggleExpanded(collection)\"\n >\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\n </button>\n <a class=\"button-ghost\" [routerLink]=\"['./', collection.id]\"\n ><span>{{ collection.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\n <ng-template let-collection=\"item\">\n <div class=\"breadcrumb\">\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\n <ng-container *ngIf=\"breadcrumbs.length\">\n <div *ngFor=\"let item of breadcrumbs\">\n <span class=\"separator\">/</span>{{ item.name }}\n </div>\n </ng-container>\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\n </ng-container>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\n <ng-template let-collection=\"item\">\n {{ collection.slug }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\n <ng-template let-collection=\"item\">\n <vdr-chip *ngIf=\"collection.isPrivate\" colorType=\"warning\">{{\n 'common.private' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!collection.isPrivate\" colorType=\"success\">{{\n 'common.public' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.view-contents' | translate\" id=\"view-contents\" [optional]=\"false\">\n <ng-template let-collection=\"item\">\n <a\n class=\"button-small bg-weight-150\"\n [routerLink]=\"['./', { contents: collection.id }]\"\n [queryParams]=\"{ contentsPage: 1 }\"\n queryParamsHandling=\"merge\"\n >\n <span>{{ 'common.view-contents' | translate }}</span>\n <clr-icon shape=\"file-group\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n </vdr-collection-data-table>\n </ng-template>\n <ng-template vdrSplitViewRight [splitViewTitle]=\"activeCollectionTitle$ | async\">\n <ng-container *ngIf=\"activeCollectionId$ | async as activeGroup\">\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\"></vdr-collection-contents>\n </ng-container>\n </ng-template>\n</vdr-split-view>\n", "import { CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nimport { RootNode, TreeNode } from './array-to-tree';\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\n\n/**\n * Facilitates communication between the CollectionTreeComponent and child CollectionTreeNodeComponents\n * without introducing a cyclic dependency.\n */\n@Injectable()\nexport class CollectionTreeService implements OnDestroy {\n private allMoveListItems: Array<{ path: string; id: string; ancestorIdPath: Set<string> }> = [];\n private collectionTree: RootNode<CollectionPartial>;\n private _rearrange$ = new Subject<RearrangeEvent>();\n private _delete$ = new Subject<string>();\n\n public rearrange$: Observable<RearrangeEvent>;\n public delete$: Observable<string>;\n\n constructor() {\n this.rearrange$ = this._rearrange$.asObservable();\n this.delete$ = this._delete$.asObservable();\n }\n\n ngOnDestroy() {\n this._rearrange$.complete();\n this._delete$.complete();\n }\n\n setCollectionTree(tree: RootNode<CollectionPartial>) {\n this.collectionTree = tree;\n }\n\n resetMoveList() {\n this.allMoveListItems = [];\n }\n\n getMoveListItems(collection: CollectionPartial) {\n if (this.allMoveListItems.length === 0) {\n this.allMoveListItems = this.calculateAllMoveListItems();\n }\n return this.allMoveListItems.filter(\n item =>\n item.id !== collection.id &&\n !item.ancestorIdPath.has(collection.id) &&\n item.id !== collection.parent?.id,\n );\n }\n\n onDrop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\n const item = event.item.data as CollectionPartial;\n const newParent = event.container.data;\n const newParentId = newParent.id;\n if (newParentId == null) {\n throw new Error(`Could not determine the ID of the root Collection`);\n }\n this._rearrange$.next({\n collectionId: item.id,\n parentId: newParentId,\n index: event.currentIndex,\n });\n }\n\n onMove(event: RearrangeEvent) {\n this._rearrange$.next(event);\n }\n\n onDelete(id: string) {\n this._delete$.next(id);\n }\n\n private calculateAllMoveListItems() {\n const visit = (\n node: TreeNode<any>,\n parentPath: string[],\n ancestorIdPath: Set<string>,\n output: Array<{ path: string; id: string; ancestorIdPath: Set<string> }>,\n ) => {\n const path = parentPath.concat(node.name);\n output.push({ path: path.slice(1).join(' / ') || 'root', id: node.id, ancestorIdPath });\n node.children.forEach(child =>\n visit(child, path, new Set<string>([...ancestorIdPath, node.id]), output),\n );\n return output;\n };\n return visit(this.collectionTree, [], new Set<string>(), []);\n }\n}\n", "import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n SimpleChanges,\n SkipSelf,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { DataService, Permission, SelectionManager } from '@vendure/admin-ui/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\n\nimport { RootNode, TreeNode } from './array-to-tree';\nimport { CollectionTreeService } from './collection-tree.service';\nimport { CollectionPartial } from './collection-tree.types';\n\n@Component({\n selector: 'vdr-collection-tree-node',\n templateUrl: './collection-tree-node.component.html',\n styleUrls: ['./collection-tree-node.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionTreeNodeComponent implements OnInit, OnChanges, OnDestroy {\n depth = 0;\n parentName: string;\n @Input() collectionTree: TreeNode<CollectionPartial>;\n @Input() activeCollectionId: string;\n @Input() expandAll = false;\n @Input() selectionManager: SelectionManager<CollectionPartial>;\n hasUpdatePermission$: Observable<boolean>;\n hasDeletePermission$: Observable<boolean>;\n moveListItems: Array<{ path: string; id: string }> = [];\n private subscription: Subscription;\n\n constructor(\n @SkipSelf() @Optional() private parent: CollectionTreeNodeComponent,\n private dataService: DataService,\n private collectionTreeService: CollectionTreeService,\n private router: Router,\n private route: ActivatedRoute,\n private changeDetectorRef: ChangeDetectorRef,\n ) {\n if (parent) {\n this.depth = parent.depth + 1;\n }\n }\n\n ngOnInit() {\n this.parentName = this.collectionTree.name || '<root>';\n const permissions$ = this.dataService.client\n .userStatus()\n .mapStream(data => data.userStatus.permissions)\n .pipe(shareReplay(1));\n this.hasUpdatePermission$ = permissions$.pipe(\n map(\n perms =>\n perms.includes(Permission.UpdateCatalog) || perms.includes(Permission.UpdateCollection),\n ),\n );\n this.hasDeletePermission$ = permissions$.pipe(\n map(\n perms =>\n perms.includes(Permission.DeleteCatalog) || perms.includes(Permission.DeleteCollection),\n ),\n );\n this.subscription = this.selectionManager?.selectionChanges$.subscribe(() =>\n this.changeDetectorRef.markForCheck(),\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const expandAllChange = changes['expandAll'];\n if (expandAllChange) {\n if (expandAllChange.previousValue === true && expandAllChange.currentValue === false) {\n this.collectionTree.children.forEach(c => (c.expanded = false));\n }\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n\n trackByFn(index: number, item: CollectionPartial) {\n return item.id;\n }\n\n toggleExpanded(collection: TreeNode<CollectionPartial>) {\n collection.expanded = !collection.expanded;\n let expandedIds = this.route.snapshot.queryParamMap.get('expanded')?.split(',') ?? [];\n if (collection.expanded) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.router.navigate(['./'], {\n queryParams: {\n expanded: expandedIds.filter(id => !!id).join(','),\n },\n queryParamsHandling: 'merge',\n relativeTo: this.route,\n });\n }\n\n getMoveListItems(collection: CollectionPartial) {\n this.moveListItems = this.collectionTreeService.getMoveListItems(collection);\n }\n\n move(collection: CollectionPartial, parentId: string) {\n this.collectionTreeService.onMove({\n index: 0,\n parentId,\n collectionId: collection.id,\n });\n }\n\n moveUp(collection: CollectionPartial, currentIndex: number) {\n if (!collection.parent) {\n return;\n }\n this.collectionTreeService.onMove({\n index: currentIndex - 1,\n parentId: collection.parent.id,\n collectionId: collection.id,\n });\n }\n\n moveDown(collection: CollectionPartial, currentIndex: number) {\n if (!collection.parent) {\n return;\n }\n this.collectionTreeService.onMove({\n index: currentIndex + 1,\n parentId: collection.parent.id,\n collectionId: collection.id,\n });\n }\n\n drop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\n moveItemInArray(this.collectionTree.children, event.previousIndex, event.currentIndex);\n this.collectionTreeService.onDrop(event);\n }\n\n delete(id: string) {\n this.collectionTreeService.onDelete(id);\n }\n}\n", "<div\n cdkDropList\n class=\"tree-node\"\n #dropList\n [cdkDropListData]=\"collectionTree\"\n [cdkDropListDisabled]=\"!(hasUpdatePermission$ | async)\"\n (cdkDropListDropped)=\"drop($event)\"\n>\n <div\n class=\"collection\"\n [class.private]=\"collection.isPrivate\"\n *ngFor=\"let collection of collectionTree.children; index as i; trackBy: trackByFn\"\n cdkDrag\n [cdkDragData]=\"collection\"\n >\n <div\n class=\"collection-detail\"\n [ngClass]=\"'depth-' + depth\"\n [class.active]=\"collection.id === activeCollectionId\"\n >\n <div>\n <input\n type=\"checkbox\"\n clrCheckbox\n [checked]=\"selectionManager.isSelected(collection)\"\n (click)=\"selectionManager.toggleSelection(collection, $event)\"\n />\n </div>\n <div class=\"name\">\n <button\n class=\"icon-button folder-button\"\n [disabled]=\"expandAll\"\n *ngIf=\"collection.children?.length; else folderSpacer\"\n (click)=\"toggleExpanded(collection)\"\n >\n <clr-icon shape=\"folder\" *ngIf=\"!collection.expanded && !expandAll\"></clr-icon>\n <clr-icon shape=\"folder-open\" *ngIf=\"collection.expanded || expandAll\"></clr-icon>\n </button>\n <ng-template #folderSpacer>\n <div class=\"folder-button-spacer\"></div>\n </ng-template>\n {{ collection.name }}\n </div>\n <div class=\"flex-spacer\"></div>\n <vdr-chip *ngIf=\"collection.isPrivate\">{{ 'catalog.private' | translate }}</vdr-chip>\n <a\n class=\"btn btn-link btn-sm\"\n [routerLink]=\"['./', { contents: collection.id }]\"\n queryParamsHandling=\"preserve\"\n >\n <clr-icon shape=\"view-list\"></clr-icon>\n {{ 'catalog.view-contents' | translate }}\n </a>\n <a class=\"btn btn-link btn-sm\" [routerLink]=\"['/catalog/collections/', collection.id]\">\n <clr-icon shape=\"edit\"></clr-icon>\n {{ 'common.edit' | translate }}\n </a>\n <div class=\"drag-handle\" cdkDragHandle *vdrIfPermissions=\"['UpdateCatalog', 'UpdateCollection']\">\n <clr-icon shape=\"drag-handle\" size=\"24\"></clr-icon>\n </div>\n <vdr-dropdown>\n <button class=\"icon-button\" vdrDropdownTrigger (click)=\"getMoveListItems(collection)\">\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\n <a\n class=\"dropdown-item\"\n [routerLink]=\"['./', 'create', { parentId: collection.id }]\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-collection' | translate }}\n </a>\n <div class=\"dropdown-divider\"></div>\n <button\n type=\"button\"\n vdrDropdownItem\n [disabled]=\"i === 0 || !(hasUpdatePermission$ | async)\"\n (click)=\"moveUp(collection, i)\"\n >\n <clr-icon shape=\"caret up\"></clr-icon>\n {{ 'catalog.move-up' | translate }}\n </button>\n <button\n type=\"button\"\n vdrDropdownItem\n [disabled]=\"\n i === collectionTree.children.length - 1 || !(hasUpdatePermission$ | async)\n \"\n (click)=\"moveDown(collection, i)\"\n >\n <clr-icon shape=\"caret down\"></clr-icon>\n {{ 'catalog.move-down' | translate }}\n </button>\n <h4 class=\"dropdown-header\">{{ 'catalog.move-to' | translate }}</h4>\n <button\n type=\"button\"\n vdrDropdownItem\n *ngFor=\"let item of moveListItems\"\n (click)=\"move(collection, item.id)\"\n [disabled]=\"!(hasUpdatePermission$ | async)\"\n >\n <div class=\"move-to-item\">\n <div class=\"move-icon\">\n <clr-icon shape=\"child-arrow\"></clr-icon>\n </div>\n <div class=\"path\">\n {{ item.path }}\n </div>\n </div>\n </button>\n <div class=\"dropdown-divider\"></div>\n <button\n class=\"button\"\n vdrDropdownItem\n (click)=\"delete(collection.id)\"\n [disabled]=\"!(hasDeletePermission$ | async)\"\n >\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\n {{ 'common.delete' | translate }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n <vdr-collection-tree-node\n *ngIf=\"collection.expanded || expandAll\"\n [expandAll]=\"expandAll\"\n [collectionTree]=\"collection\"\n [activeCollectionId]=\"activeCollectionId\"\n [selectionManager]=\"selectionManager\"\n ></vdr-collection-tree-node>\n </div>\n</div>\n", "export type HasParent = { id: string; parent?: { id: string } | null };\nexport type TreeNode<T extends HasParent> = T & { children: Array<TreeNode<T>>; expanded: boolean };\nexport type RootNode<T extends HasParent> = { id?: string; children: Array<TreeNode<T>> };\n\n/**\n * Builds a tree from an array of nodes which have a parent.\n * Based on https://stackoverflow.com/a/31247960/772859, modified to preserve ordering.\n */\nexport function arrayToTree<T extends HasParent>(\n nodes: T[],\n currentState?: RootNode<T>,\n expandedIds: string[] = [],\n): RootNode<T> {\n const topLevelNodes: Array<TreeNode<T>> = [];\n const mappedArr: { [id: string]: TreeNode<T> } = {};\n const currentStateMap = treeToMap(currentState);\n\n // First map the nodes of the array to an object -> create a hash table.\n for (const node of nodes) {\n mappedArr[node.id] = { ...(node as any), children: [] };\n }\n\n for (const id of nodes.map(n => n.id)) {\n if (mappedArr.hasOwnProperty(id)) {\n const mappedElem = mappedArr[id];\n mappedElem.expanded = currentStateMap.get(id)?.expanded ?? expandedIds.includes(id);\n const parent = mappedElem.parent;\n if (!parent) {\n continue;\n }\n // If the element is not at the root level, add it to its parent array of children.\n const parentIsRoot = !mappedArr[parent.id];\n if (!parentIsRoot) {\n if (mappedArr[parent.id]) {\n mappedArr[parent.id].children.push(mappedElem);\n } else {\n mappedArr[parent.id] = { children: [mappedElem] } as any;\n }\n } else {\n topLevelNodes.push(mappedElem);\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rootId = topLevelNodes.length ? topLevelNodes[0].parent!.id : undefined;\n return { id: rootId, children: topLevelNodes };\n}\n\n/**\n * Converts an existing tree (as generated by the arrayToTree function) into a flat\n * Map. This is used to persist certain states (e.g. `expanded`) when re-building the\n * tree.\n */\nfunction treeToMap<T extends HasParent>(tree?: RootNode<T>): Map<string, TreeNode<T>> {\n const nodeMap = new Map<string, TreeNode<T>>();\n function visit(node: TreeNode<T>) {\n nodeMap.set(node.id, node);\n node.children.forEach(visit);\n }\n if (tree) {\n visit(tree as TreeNode<T>);\n }\n return nodeMap;\n}\n", "import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { Collection, SelectionManager } from '@vendure/admin-ui/core';\n\nimport { arrayToTree, RootNode } from './array-to-tree';\nimport { CollectionTreeService } from './collection-tree.service';\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\n\n@Component({\n selector: 'vdr-collection-tree',\n templateUrl: 'collection-tree.component.html',\n styleUrls: ['./collection-tree.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [CollectionTreeService],\n standalone: false\n})\nexport class CollectionTreeComponent implements OnInit, OnChanges {\n @Input() collections: CollectionPartial[];\n @Input() activeCollectionId: string;\n @Input() expandAll = false;\n @Input() expandedIds: string[] = [];\n @Input() selectionManager: SelectionManager<CollectionPartial>;\n @Output() rearrange = new EventEmitter<RearrangeEvent>();\n @Output() deleteCollection = new EventEmitter<string>();\n collectionTree: RootNode<CollectionPartial>;\n\n constructor(private collectionTreeService: CollectionTreeService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if ('collections' in changes && this.collections) {\n this.collectionTree = arrayToTree(this.collections, this.collectionTree, this.expandedIds);\n this.collectionTreeService.setCollectionTree(this.collectionTree);\n this.collectionTreeService.resetMoveList();\n }\n }\n\n ngOnInit() {\n this.collectionTreeService.rearrange$.subscribe(event => this.rearrange.emit(event));\n this.collectionTreeService.delete$.subscribe(id => this.deleteCollection.emit(id));\n }\n}\n", "<vdr-collection-tree-node\n *ngIf=\"collectionTree\"\n cdkDropListGroup\n [expandAll]=\"expandAll\"\n [collectionTree]=\"collectionTree\"\n [selectionManager]=\"selectionManager\"\n [activeCollectionId]=\"activeCollectionId\"\n></vdr-collection-tree-node>\n", "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Dialog, GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-confirm-variant-deletion-dialog',\n templateUrl: './confirm-variant-deletion-dialog.component.html',\n styleUrls: ['./confirm-variant-deletion-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ConfirmVariantDeletionDialogComponent implements Dialog<boolean> {\n resolveWith: (result?: boolean) => void;\n variants: NonNullable<GetProductVariantOptionsQuery['product']>['variants'] = [];\n\n confirm() {\n this.resolveWith(true);\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.confirm-deletion-of-unused-variants-title' | translate }}\n</ng-template>\n{{ 'catalog.confirm-deletion-of-unused-variants-body' | translate }}\n<ul>\n <li *ngFor=\"let variant of variants\">{{ variant.name }} ({{ variant.sku }})</li>\n</ul>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport { CreateFacetValueInput, Dialog, LanguageCode } from '@vendure/admin-ui/core';\n\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\n\n@Component({\n selector: 'vdr-create-facet-value-dialog',\n templateUrl: './create-facet-value-dialog.component.html',\n styleUrls: ['./create-facet-value-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CreateFacetValueDialogComponent implements Dialog<CreateFacetValueInput> {\n resolveWith: (result?: CreateFacetValueInput) => void;\n languageCode: LanguageCode;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n code: ['', Validators.required],\n });\n facetId: string;\n constructor(private formBuilder: FormBuilder) {}\n\n updateCode() {\n const nameControl = this.form.get('name');\n const codeControl = this.form.get('code');\n if (nameControl && codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\n }\n }\n\n confirm() {\n const { name, code } = this.form.value;\n if (!name || !code) {\n return;\n }\n this.resolveWith({\n facetId: this.facetId,\n code,\n translations: [{ languageCode: this.languageCode, name }],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.create-facet-value' | translate }}\n</ng-template>\n<div class=\"form-grid\" [formGroup]=\"form\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'common.code' | translate\"\n for=\"code\"\n >\n <input\n id=\"code\"\n type=\"text\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n</div>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\" [disabled]=\"form.invalid\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n FormRecord,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n CreateFacetInput,\n createUpdatedTranslatable,\n DataService,\n DeletionResult,\n FACET_WITH_VALUE_LIST_FRAGMENT,\n FacetWithValueListFragment,\n findTranslation,\n getCustomFieldsDefaults,\n GetFacetDetailDocument,\n GetFacetDetailQuery,\n GetFacetDetailQueryVariables,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n TypedBaseDetailComponent,\n UpdateFacetInput,\n UpdateFacetValueInput,\n} from '@vendure/admin-ui/core';\nimport { SortOrder } from '@vendure/common/lib/generated-types';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\nimport { gql } from 'apollo-angular';\nimport { BehaviorSubject, combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\nimport { debounceTime, map, mergeMap, switchMap, take, takeUntil } from 'rxjs/operators';\nimport { CreateFacetValueDialogComponent } from '../create-facet-value-dialog/create-facet-value-dialog.component';\n\nexport const FACET_DETAIL_QUERY = gql`\n query GetFacetDetail($id: ID!, $facetValueListOptions: FacetValueListOptions) {\n facet(id: $id) {\n ...FacetWithValueList\n }\n }\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\n`;\n\ntype ValueItem =\n | FacetWithValueListFragment['valueList']['items'][number]\n | { id: string; name: string; code: string };\n\n@Component({\n selector: 'vdr-facet-detail',\n templateUrl: './facet-detail.component.html',\n styleUrls: ['./facet-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class FacetDetailComponent\n extends TypedBaseDetailComponent<typeof GetFacetDetailDocument, 'facet'>\n implements OnInit, OnDestroy\n{\n readonly customFields = this.getCustomFieldConfig('Facet');\n readonly customValueFields = this.getCustomFieldConfig('FacetValue');\n detailForm = this.formBuilder.group({\n facet: this.formBuilder.group({\n code: ['', Validators.required],\n name: '',\n visible: true,\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n }),\n values: this.formBuilder.record<\n FormGroup<{\n id: FormControl<string>;\n name: FormControl<string>;\n code: FormControl<string>;\n customFields: FormGroup;\n }>\n >({}),\n });\n currentPage = 1;\n itemsPerPage = 10;\n totalItems = 0;\n filterControl = new FormControl('');\n values$ = new BehaviorSubject<ValueItem[]>([]);\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateFacet];\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n protected dataService: DataService,\n private formBuilder: FormBuilder,\n private notificationService: NotificationService,\n private modalService: ModalService,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n this.filterControl.valueChanges\n .pipe(debounceTime(200), takeUntil(this.destroy$))\n .subscribe(filterTerm => {\n this.currentPage = 1;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, filterTerm);\n });\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n updateCode(currentCode: string, nameValue: string) {\n if (!currentCode) {\n const codeControl = this.detailForm.get(['facet', 'code']);\n if (codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(nameValue, '-'));\n }\n }\n }\n\n updateValueCode(currentCode: string, nameValue: string, valueId: string) {\n if (!currentCode) {\n const codeControl = this.detailForm.get(['values', valueId, 'code']);\n if (codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(nameValue, '-'));\n }\n }\n }\n\n customValueFieldIsSet(index: number, name: string): boolean {\n return !!this.detailForm.get(['values', index, 'customFields', name]);\n }\n\n addFacetValue() {\n this.modalService\n .fromComponent(CreateFacetValueDialogComponent, {\n locals: {\n languageCode: this.languageCode,\n facetId: this.id,\n },\n })\n .pipe(\n switchMap(result => {\n if (!result) {\n return EMPTY;\n } else {\n return this.dataService.facet.createFacetValues([result]);\n }\n }),\n )\n .subscribe(result => {\n if (result.createFacetValues) {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'FacetValue',\n });\n this.currentPage = 1;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage);\n }\n });\n }\n\n create() {\n const facetForm = this.detailForm.get('facet') as (typeof this.detailForm)['controls']['facet'];\n if (!facetForm || !facetForm.dirty) {\n return;\n }\n const newFacet = this.getUpdatedFacet(\n {\n id: '',\n createdAt: '',\n updatedAt: '',\n isPrivate: false,\n languageCode: this.languageCode,\n name: '',\n code: '',\n translations: [],\n },\n facetForm,\n this.languageCode,\n ) as CreateFacetInput;\n this.dataService.facet.createFacet(newFacet).subscribe(\n data => {\n this.notificationService.success(_('common.notify-create-success'), { entity: 'Facet' });\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.router.navigate(['../', data.createFacet.id], { relativeTo: this.route });\n },\n err => {\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Facet',\n });\n },\n );\n }\n\n save() {\n const valuesFormRecord = this.detailForm.get(\n 'values',\n ) as (typeof this.detailForm)['controls']['values'];\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([facet, languageCode]) => {\n const facetForm = this.detailForm.get(\n 'facet',\n ) as (typeof this.detailForm)['controls']['facet'];\n const updateOperations: Array<Observable<any>> = [];\n\n if (facetForm && facetForm.dirty) {\n const updatedFacetInput = this.getUpdatedFacet(\n facet,\n facetForm,\n languageCode,\n ) as UpdateFacetInput;\n if (updatedFacetInput) {\n updateOperations.push(this.dataService.facet.updateFacet(updatedFacetInput));\n }\n }\n if (valuesFormRecord && valuesFormRecord.dirty) {\n const updatedValues = this.getUpdatedFacetValues(valuesFormRecord, languageCode);\n if (updatedValues.length) {\n updateOperations.push(this.dataService.facet.updateFacetValues(updatedValues));\n }\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Facet' });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Facet',\n });\n },\n );\n }\n\n deleteFacetValue(facetValueId: string) {\n this.showModalAndDelete(facetValueId)\n .pipe(\n switchMap(response => {\n if (response.result === DeletionResult.DELETED) {\n return [true];\n } else {\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\n map(r => r.result === DeletionResult.DELETED),\n );\n }\n }),\n switchMap(deleted =>\n deleted\n ? this.dataService.query(GetFacetDetailDocument, {\n id: this.id,\n }).single$\n : [],\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'FacetValue',\n });\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, this.filterControl.value);\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'FacetValue',\n });\n },\n );\n }\n\n private showModalAndDelete(facetValueId: string, message?: string) {\n return this.modalService\n .dialog({\n title: _('catalog.confirm-delete-facet-value'),\n body: message,\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(result =>\n result ? this.dataService.facet.deleteFacetValues([facetValueId], !!message) : EMPTY,\n ),\n map(result => result.deleteFacetValues[0]),\n );\n }\n\n protected setCurrentPage(newPage: number) {\n this.currentPage = newPage;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, this.filterControl.value);\n }\n\n protected setItemsPerPage(itemsPerPage: number) {\n this.itemsPerPage = itemsPerPage;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, this.filterControl.value);\n }\n\n private fetchFacetValues(currentPage: number, itemsPerPage: number, filterTerm?: string | null) {\n this.dataService\n .query<GetFacetDetailQuery, GetFacetDetailQueryVariables>(FACET_DETAIL_QUERY, {\n id: this.id,\n facetValueListOptions: {\n take: itemsPerPage,\n skip: (currentPage - 1) * itemsPerPage,\n sort: {\n createdAt: SortOrder.DESC,\n },\n ...(filterTerm ? { filter: { name: { contains: filterTerm } } } : {}),\n },\n })\n .single$.subscribe(({ facet }) => {\n if (facet) {\n this.values$.next([...facet.valueList.items]);\n this.totalItems = facet.valueList.totalItems;\n this.setFacetValueFormValues(facet, this.languageCode);\n }\n });\n }\n\n /**\n * Sets the values of the form on changes to the facet or current language.\n */\n protected setFormValues(facet: FacetWithValueListFragment, languageCode: LanguageCode) {\n const currentTranslation = findTranslation(facet, languageCode);\n\n this.detailForm.patchValue({\n facet: {\n code: facet.code,\n visible: !facet.isPrivate,\n name: currentTranslation?.name ?? '',\n },\n });\n\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get(['facet', 'customFields']),\n facet,\n currentTranslation,\n );\n }\n this.values$.next([...facet.valueList.items]);\n this.totalItems = facet.valueList.totalItems;\n this.setFacetValueFormValues(facet, languageCode);\n }\n\n private setFacetValueFormValues(facet: FacetWithValueListFragment, languageCode: LanguageCode) {\n const currentValuesFormGroup = this.detailForm.get('values') as FormRecord;\n facet.valueList.items.forEach(value => {\n const valueTranslation = findTranslation(value, languageCode);\n const group = {\n id: value.id,\n code: value.code,\n name: valueTranslation ? valueTranslation.name : '',\n };\n let valueControl = currentValuesFormGroup.get(value.id) as FormGroup;\n if (!valueControl) {\n valueControl = this.formBuilder.group(group);\n currentValuesFormGroup.addControl(value.id, valueControl);\n } else {\n valueControl.patchValue(group);\n }\n if (this.customValueFields.length) {\n let customValueFieldsGroup = valueControl.get(['customFields']) as\n | UntypedFormGroup\n | undefined;\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = new UntypedFormGroup({});\n valueControl.addControl('customFields', customValueFieldsGroup);\n }\n\n if (customValueFieldsGroup) {\n for (const fieldDef of this.customValueFields) {\n const key = fieldDef.name;\n const fieldValue =\n fieldDef.type === 'localeString'\n ? (valueTranslation as any | undefined)?.customFields?.[key]\n : (value as any).customFields[key];\n const control = customValueFieldsGroup.get(key);\n if (control) {\n control.setValue(fieldValue);\n } else {\n customValueFieldsGroup.addControl(key, new UntypedFormControl(fieldValue));\n }\n }\n }\n }\n });\n }\n\n /**\n * Given a facet and the value of the detailForm, this method creates an updated copy of the facet which\n * can then be persisted to the API.\n */\n private getUpdatedFacet(\n facet: Omit<FacetWithValueListFragment, 'valueList'>,\n facetFormGroup: (typeof this.detailForm)['controls']['facet'],\n languageCode: LanguageCode,\n ): CreateFacetInput | UpdateFacetInput {\n const input = createUpdatedTranslatable({\n translatable: facet,\n updatedFields: facetFormGroup.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: facet.name || '',\n },\n });\n input.isPrivate = !facetFormGroup.value.visible;\n return input;\n }\n\n /**\n * Given an array of facet values and the values from the detailForm, this method creates a new array\n * which can be persisted to the API via an updateFacetValues mutation.\n */\n private getUpdatedFacetValues(\n valuesFormGroup: FormGroup,\n languageCode: LanguageCode,\n ): UpdateFacetValueInput[] {\n const dirtyValueValues = Object.values(valuesFormGroup.controls)\n .filter(c => c.dirty)\n .map(c => c.value);\n\n return dirtyValueValues\n .map((value, i) =>\n createUpdatedTranslatable({\n translatable: value,\n updatedFields: value,\n customFieldConfig: this.customValueFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: '',\n },\n }),\n )\n .filter(notNullOrUndefined);\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"facet-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n *vdrIfPermissions=\"updatePermission\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"facet-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar formGroupName=\"facet\">\n <vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n formControlName=\"visible\"\n id=\"visibility\"\n />\n <label class=\"visible-toggle\">\n <ng-container *ngIf=\"detailForm.value.facet?.visible; else private\">{{\n 'catalog.public' | translate\n }}</ng-container>\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\n </label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <vdr-card>\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n <vdr-page-block>\n <vdr-card formGroupName=\"facet\">\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n (input)=\"updateCode(entity?.code, $event.target.value)\"\n />\n </vdr-form-field>\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\n <input\n id=\"code\"\n type=\"text\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"Facet\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('facet.customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </vdr-card>\n\n <vdr-custom-detail-component-host\n locationId=\"facet-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n\n <vdr-card\n *ngIf=\"!(isNew$ | async)\"\n [title]=\"'catalog.facet-values' | translate\"\n [paddingX]=\"false\"\n >\n <ng-template vdrCardControls>\n <input\n type=\"text\"\n class=\"mr-3\"\n [formControl]=\"filterControl\"\n [placeholder]=\"'catalog.filter-by-name' | translate\"\n />\n </ng-template>\n <ng-container *ngIf=\"values$ | async as filteredValues\">\n <table class=\"facet-values-list table\" formArrayName=\"values\">\n <thead>\n <tr>\n <th></th>\n <th>{{ 'common.name' | translate }}</th>\n <th>{{ 'common.code' | translate }}</th>\n <ng-container *ngIf=\"customValueFields.length\">\n <th>{{ 'common.custom-fields' | translate }}</th>\n </ng-container>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr\n class=\"facet-value\"\n *ngFor=\"\n let value of filteredValues\n | paginate\n : {\n currentPage: currentPage,\n itemsPerPage: itemsPerPage,\n totalItems: totalItems,\n };\n let i = index\n \"\n [formGroup]=\"detailForm.get(['values', value.id])\"\n >\n <td class=\"align-middle\">\n <vdr-entity-info [entity]=\"value\"></vdr-entity-info>\n </td>\n <td class=\"align-middle\">\n <input\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n (input)=\"updateValueCode(value.code, $event.target.value, value.id)\"\n />\n </td>\n <td class=\"align-middle\">\n <input type=\"text\" formControlName=\"code\" />\n </td>\n <td class=\"\" *ngIf=\"customValueFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"FacetValue\"\n [customFields]=\"customValueFields\"\n [compact]=\"true\"\n [customFieldsFormGroup]=\"\n detailForm.get(['values', value.id, 'customFields'])\n \"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </td>\n <td class=\"align-middle\">\n <vdr-dropdown>\n <button type=\"button\" class=\"icon-button\" vdrDropdownTrigger>\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\n <button\n type=\"button\"\n class=\"delete-button\"\n (click)=\"deleteFacetValue(value.id)\"\n [disabled]=\"!(updatePermission | hasPermission)\"\n vdrDropdownItem\n >\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\n {{ 'common.delete' | translate }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"pagination-wrapper\">\n <vdr-items-per-page-controls\n [itemsPerPage]=\"itemsPerPage\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n ></vdr-items-per-page-controls>\n <vdr-pagination-controls\n [currentPage]=\"currentPage\"\n [itemsPerPage]=\"itemsPerPage\"\n [totalItems]=\"totalItems\"\n (pageChange)=\"setCurrentPage($event)\"\n ></vdr-pagination-controls>\n </div>\n </ng-container>\n <div>\n <button\n type=\"button\"\n class=\"button m-3\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\n (click)=\"addFacetValue()\"\n >\n <clr-icon shape=\"add\"></clr-icon>\n {{ 'catalog.add-facet-value' | translate }}\n </button>\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkAssignToChannelAction,\n createBulkDeleteAction,\n createBulkRemoveFromChannelAction,\n currentChannelIsNotDefault,\n DataService,\n DuplicateEntityDialogComponent,\n getChannelCodeFromUserStatus,\n GetFacetListQuery,\n ItemOf,\n ModalService,\n NotificationService,\n Permission,\n RemoveFacetsFromChannelMutation,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport { FacetListComponent } from './facet-list.component';\n\nexport const deleteFacetsBulkAction = createBulkDeleteAction<ItemOf<GetFacetListQuery, 'facets'>>({\n location: 'facet-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteFacet) ||\n userPermissions.includes(Permission.DeleteCatalog),\n getItemName: item => item.name,\n shouldRetryItem: (response, item) => !!response.message,\n bulkDelete: (dataService, ids, retrying) =>\n dataService.facet.deleteFacets(ids, retrying).pipe(map(res => res.deleteFacets)),\n});\n\nexport const assignFacetsToChannelBulkAction = createBulkAssignToChannelAction<\n ItemOf<GetFacetListQuery, 'facets'>\n>({\n location: 'facet-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateFacet),\n getItemName: item => item.name,\n bulkAssignToChannel: (dataService, facetIds, channelIds) =>\n channelIds.map(channelId =>\n dataService.facet\n .assignFacetsToChannel({\n facetIds,\n channelId,\n })\n .pipe(map(res => res.assignFacetsToChannel)),\n ),\n});\n\nexport const removeFacetsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetFacetListQuery, 'facets'>,\n RemoveFacetsFromChannelMutation['removeFacetsFromChannel'][number]\n>({\n location: 'facet-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteCatalog) ||\n userPermissions.includes(Permission.DeleteFacet),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, facetIds, channelId, retrying) =>\n dataService.facet\n .removeFacetsFromChannel({\n channelId: channelId,\n facetIds,\n force: retrying,\n })\n .pipe(map(res => res.removeFacetsFromChannel)),\n isErrorResult: result => (result.__typename === 'FacetInUseError' ? result.message : undefined),\n});\n\nexport const removeFacetsFromChannelBulkAction2: BulkAction<\n ItemOf<GetFacetListQuery, 'facets'>,\n FacetListComponent\n> = {\n location: 'facet-list',\n label: _('catalog.remove-from-channel'),\n getTranslationVars: ({ injector }) => getChannelCodeFromUserStatus(injector.get(DataService)),\n icon: 'layers',\n iconClass: 'is-warning',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateFacet) ||\n userPermissions.includes(Permission.UpdateCatalog),\n isVisible: ({ injector }) => currentChannelIsNotDefault(injector.get(DataService)),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n\n const activeChannelId$ = dataService.client\n .userStatus()\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\n\n function showModalAndDelete(facetIds: string[], message?: string) {\n return modalService\n .dialog({\n title: _('catalog.remove-from-channel'),\n translationVars: {\n count: selection.length,\n },\n size: message ? 'lg' : 'md',\n body: message,\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n {\n type: 'danger',\n label: message ? _('common.force-remove') : _('common.remove'),\n returnValue: true,\n },\n ],\n })\n .pipe(\n switchMap(res =>\n res\n ? activeChannelId$.pipe(\n switchMap(activeChannelId =>\n activeChannelId\n ? dataService.facet.removeFacetsFromChannel({\n channelId: activeChannelId,\n facetIds,\n force: !!message,\n })\n : EMPTY,\n ),\n map(res2 => res2.removeFacetsFromChannel),\n )\n : EMPTY,\n ),\n );\n }\n\n showModalAndDelete(unique(selection.map(f => f.id)))\n .pipe(\n switchMap(result => {\n let removedCount = selection.length;\n const errors: string[] = [];\n const errorIds: string[] = [];\n let i = 0;\n for (const item of result) {\n if (item.__typename === 'FacetInUseError') {\n errors.push(item.message);\n errorIds.push(selection[i]?.id);\n removedCount--;\n }\n i++;\n }\n if (0 < errorIds.length) {\n return showModalAndDelete(errorIds, errors.join('\\n')).pipe(\n map(result2 => {\n const notRemovedCount = result2.filter(\n r => r.__typename === 'FacetInUseError',\n ).length;\n return selection.length - notRemovedCount;\n }),\n );\n } else {\n return of(removedCount);\n }\n }),\n switchMap(removedCount =>\n removedCount\n ? getChannelCodeFromUserStatus(dataService).then(({ channelCode }) => ({\n channelCode,\n removedCount,\n }))\n : EMPTY,\n ),\n )\n .subscribe(({ removedCount, channelCode }) => {\n if (removedCount) {\n hostComponent.refresh();\n clearSelection();\n notificationService.success(_('catalog.notify-remove-facets-from-channel-success'), {\n count: removedCount,\n channelCode,\n });\n }\n });\n },\n};\n\nexport const duplicateFacetsBulkAction: BulkAction<\n ItemOf<GetFacetListQuery, 'facets'>,\n FacetListComponent\n> = {\n location: 'facet-list',\n label: _('common.duplicate'),\n icon: 'copy',\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(DuplicateEntityDialogComponent<ItemOf<GetFacetListQuery, 'facets'>>, {\n locals: {\n entities: selection,\n entityName: 'Facet',\n title: _('catalog.duplicate-facets'),\n getEntityName: entity => entity.name,\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n hostComponent.refresh();\n }\n });\n },\n};\n", "import { Component, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n FACET_WITH_VALUE_LIST_FRAGMENT,\n GetFacetListDocument,\n GetFacetListQuery,\n ItemOf,\n LanguageCode,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nexport const FACET_LIST_QUERY = gql`\n query GetFacetList($options: FacetListOptions, $facetValueListOptions: FacetValueListOptions) {\n facets(options: $options) {\n items {\n ...FacetWithValueList\n }\n totalItems\n }\n }\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-facet-list',\n templateUrl: './facet-list.component.html',\n styleUrls: ['./facet-list.component.scss'],\n standalone: false\n})\nexport class FacetListComponent\n extends TypedBaseListComponent<typeof GetFacetListDocument, 'facets'>\n implements OnInit\n{\n readonly initialLimit = 3;\n displayLimit: { [id: string]: number } = {};\n\n dataTableListId = 'facet-list';\n readonly customFields = this.getCustomFieldConfig('Facet');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilter({\n name: 'visibility',\n type: { kind: 'boolean' },\n label: _('common.visibility'),\n toFilterInput: value => ({\n isPrivate: { eq: !value },\n }),\n })\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n\n readonly sorts = this.createSortCollection()\n .defaultSort('createdAt', 'DESC')\n .addSort({ name: 'id' })\n .addSort({ name: 'createdAt' })\n .addSort({ name: 'updatedAt' })\n .addSort({ name: 'name' })\n .addSort({ name: 'code' })\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor(protected dataService: DataService) {\n super();\n super.configure({\n document: GetFacetListDocument,\n getItems: data => data.facets,\n setVariables: (skip, take) => ({\n options: {\n skip,\n take,\n filter: {\n name: {\n contains: this.searchTermControl.value,\n },\n ...this.filters.createFilterInput(),\n },\n sort: this.sorts.createSortInput(),\n },\n facetValueListOptions: {\n take: 100,\n },\n }),\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\n });\n }\n\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\n if (this.displayLimit[facet.id] === facet.valueList.items.length) {\n this.displayLimit[facet.id] = this.initialLimit;\n } else {\n this.displayLimit[facet.id] = facet.valueList.items.length;\n }\n }\n\n setLanguage(code: LanguageCode) {\n this.dataService.client.setContentLanguage(code).subscribe();\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"facet-list\" />\n <a\n class=\"btn btn-primary\"\n [routerLink]=\"['./create']\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-facet' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"facet-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-data-table-2\n class=\"mt-2\"\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"facet-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n ></vdr-bulk-action-menu>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\n ></vdr-dt2-search>\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\n <ng-template let-facet=\"item\">\n {{ facet.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-facet=\"item\">\n {{ facet.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-facet=\"item\">\n {{ facet.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\n <ng-template let-facet=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', facet.id]\"\n ><span>{{ facet.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\">\n <ng-template let-facet=\"item\">\n {{ facet.code }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\n <ng-template let-facet=\"item\">\n <vdr-chip *ngIf=\"facet.isPrivate\" colorType=\"warning\">{{\n 'common.private' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!facet.isPrivate\" colorType=\"success\">{{\n 'common.public' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.values' | translate\" id=\"values\">\n <ng-template let-facet=\"item\">\n <div class=\"facet-values-list\">\n <vdr-facet-value-chip\n *ngFor=\"let value of facet.valueList.items | slice : 0 : displayLimit[facet.id] || 3\"\n [facetValue]=\"value\"\n [removable]=\"false\"\n [displayFacetName]=\"false\"\n ></vdr-facet-value-chip>\n <vdr-chip *ngIf=\"displayLimit[facet.id] < facet.valueList.totalItems && (displayLimit[facet.id] || 0) === facet.valueList.items.length\">\n ... + {{ facet.valueList.totalItems - facet.valueList.items.length }}\n </vdr-chip>\n <button\n class=\"button-small\"\n *ngIf=\"facet.valueList.items.length > initialLimit\"\n (click)=\"toggleDisplayLimit(facet)\"\n >\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.valueList.items.length; else collapse\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ facet.valueList.totalItems - initialLimit }}\n </ng-container>\n <ng-template #collapse>\n <clr-icon shape=\"minus\"></clr-icon>\n </ng-template>\n </button>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column *ngFor=\"let customField of customFields\" [customField]=\"customField\" [sorts]=\"sorts\" />\n</vdr-data-table-2>\n", "import { Component, ElementRef, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\nimport { AbstractControl, FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport {\n CurrencyCode,\n DataService,\n GetStockLocationListDocument,\n GetStockLocationListQuery,\n ItemOf,\n} from '@vendure/admin-ui/core';\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { OptionValueInputComponent } from '../option-value-input/option-value-input.component';\n\nconst DEFAULT_VARIANT_CODE = '__DEFAULT_VARIANT__';\nexport type CreateVariantValues = {\n optionValues: string[];\n enabled: boolean;\n sku: string;\n price: number;\n stock: number;\n};\nexport type CreateProductVariantsConfig = {\n groups: Array<{ name: string; values: string[] }>;\n variants: CreateVariantValues[];\n stockLocationId: string;\n};\n\n@Component({\n selector: 'vdr-generate-product-variants',\n templateUrl: './generate-product-variants.component.html',\n styleUrls: ['./generate-product-variants.component.scss'],\n standalone: false\n})\nexport class GenerateProductVariantsComponent implements OnInit {\n @Output() variantsChange = new EventEmitter<CreateProductVariantsConfig>();\n @ViewChildren('optionGroupName', { read: ElementRef }) groupNameInputs: QueryList<ElementRef>;\n optionGroups: Array<{ name: string; values: Array<{ name: string; locked: boolean }> }> = [];\n currencyCode: CurrencyCode;\n variants: Array<{ id: string; values: string[] }>;\n variantFormValues: {\n [id: string]: FormGroup<{\n optionValues: FormControl<string[]>;\n enabled: FormControl<boolean>;\n price: FormControl<number>;\n sku: FormControl<string>;\n stock: FormControl<number>;\n }>;\n } = {};\n stockLocations$: Observable<Array<ItemOf<GetStockLocationListQuery, 'stockLocations'>>>;\n selectedStockLocationId: string | null = null;\n constructor(\n private dataService: DataService,\n private formBuilder: FormBuilder,\n ) {}\n\n ngOnInit() {\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\n });\n this.stockLocations$ = this.dataService\n .query(GetStockLocationListDocument, {\n options: {\n take: 999,\n },\n })\n .refetchOnChannelChange()\n .mapStream(({ stockLocations }) => stockLocations.items)\n .pipe(\n tap(items => {\n if (items.length) {\n this.selectedStockLocationId = items[0].id;\n this.onFormChange();\n }\n }),\n );\n\n this.generateVariants();\n }\n\n addOption() {\n this.optionGroups.push({ name: '', values: [] });\n const index = this.optionGroups.length - 1;\n setTimeout(() => {\n const input = this.groupNameInputs.get(index)?.nativeElement;\n input?.focus();\n });\n }\n\n removeOption(name: string) {\n this.optionGroups = this.optionGroups.filter(g => g.name !== name);\n this.generateVariants();\n }\n\n generateVariants() {\n const totalValuesCount = this.optionGroups.reduce((sum, group) => sum + group.values.length, 0);\n const groups = totalValuesCount\n ? this.optionGroups.map(g => g.values.map(v => v.name))\n : [[DEFAULT_VARIANT_CODE]];\n this.variants = generateAllCombinations(groups).map(values => ({ id: values.join('|'), values }));\n\n this.variants.forEach((variant, index) => {\n if (!this.variantFormValues[variant.id]) {\n const formGroup = this.formBuilder.nonNullable.group({\n optionValues: [variant.values],\n enabled: true as boolean,\n price: this.copyFromDefault(variant.id, 'price', 0),\n sku: this.copyFromDefault(variant.id, 'sku', ''),\n stock: this.copyFromDefault(variant.id, 'stock', 0),\n });\n formGroup.valueChanges.subscribe(() => this.onFormChange());\n if (index === 0) {\n formGroup.get('price')?.valueChanges.subscribe(value => {\n this.copyValuesToPristine('price', formGroup.get('price'));\n });\n formGroup.get('sku')?.valueChanges.subscribe(value => {\n this.copyValuesToPristine('sku', formGroup.get('sku'));\n });\n formGroup.get('stock')?.valueChanges.subscribe(value => {\n this.copyValuesToPristine('stock', formGroup.get('stock'));\n });\n }\n this.variantFormValues[variant.id] = formGroup;\n }\n });\n this.onFormChange();\n }\n\n trackByFn(index: number, variant: { name: string; values: string[] }) {\n return variant.values.join('|');\n }\n\n handleEnter(event: KeyboardEvent, optionValueInputComponent: OptionValueInputComponent) {\n event.preventDefault();\n event.stopPropagation();\n optionValueInputComponent.focus();\n }\n\n copyValuesToPristine(field: 'price' | 'sku' | 'stock', formControl: AbstractControl | null) {\n if (!formControl) {\n return;\n }\n Object.values(this.variantFormValues).forEach(formGroup => {\n const correspondingFormControl = formGroup.get(field) as FormControl;\n if (correspondingFormControl && correspondingFormControl.pristine) {\n correspondingFormControl.setValue(formControl.value, { emitEvent: false });\n }\n });\n }\n\n onFormChange() {\n const variantsToCreate = this.variants\n .map(v => this.variantFormValues[v.id].value as CreateVariantValues)\n .filter(v => v.enabled);\n this.variantsChange.emit({\n groups: this.optionGroups.map(og => ({ name: og.name, values: og.values.map(v => v.name) })),\n variants: variantsToCreate,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n stockLocationId: this.selectedStockLocationId!,\n });\n }\n\n private copyFromDefault<T extends keyof CreateVariantValues>(\n variantId: string,\n prop: T,\n value: CreateVariantValues[T],\n ): CreateVariantValues[T] {\n return variantId !== DEFAULT_VARIANT_CODE\n ? (this.variantFormValues[DEFAULT_VARIANT_CODE].get(prop)?.value as CreateVariantValues[T])\n : value;\n }\n}\n", "<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\n <div class=\"name\">\n <label>{{ 'catalog.option' | translate }}</label>\n <input\n #optionGroupName\n placeholder=\"e.g. Size\"\n clrInput\n [(ngModel)]=\"group.name\"\n name=\"name\"\n required\n (keydown.enter)=\"handleEnter($event, optionValueInputComponent)\"\n />\n </div>\n <div class=\"values\">\n <label>{{ 'catalog.option-values' | translate }}</label>\n <vdr-option-value-input\n #optionValueInputComponent\n [(ngModel)]=\"group.values\"\n (ngModelChange)=\"generateVariants()\"\n (edit)=\"generateVariants()\"\n [groupName]=\"group.name\"\n [disabled]=\"group.name === ''\"\n ></vdr-option-value-input>\n </div>\n <div class=\"remove-group\">\n <button\n class=\"button-small mt-2\"\n [title]=\"'catalog.remove-option' | translate\"\n (click)=\"removeOption(group.name)\"\n >\n <clr-icon shape=\"trash\"></clr-icon>\n </button>\n </div>\n</div>\n<button class=\"button mb-2\" (click)=\"addOption()\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-option' | translate }}\n</button>\n\n<ng-container *ngIf=\"stockLocations$ | async as stockLocations\">\n <clr-alert *ngIf=\"stockLocations.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ 'catalog.no-stock-locations-available-on-current-channel' | translate }}\n </span>\n </clr-alert-item>\n </clr-alert>\n\n <div class=\"form-grid mb-2\">\n <vdr-form-field *ngIf=\"stockLocations.length\" [label]=\"'catalog.add-stock-to-location' | translate\">\n <select [(ngModel)]=\"selectedStockLocationId\">\n <option *ngFor=\"let location of stockLocations\" [value]=\"location.id\">\n {{ location.name }}\n </option>\n </select>\n </vdr-form-field>\n </div>\n\n <div class=\"variants-preview\" *ngIf=\"0 < stockLocations.length\">\n <table class=\"table\">\n <thead>\n <tr>\n <th *ngIf=\"1 < variants.length\">{{ 'common.create' | translate }}</th>\n <th *ngIf=\"1 < variants.length\">{{ 'catalog.variant' | translate }}</th>\n <th>{{ 'catalog.sku' | translate }}</th>\n <th>{{ 'catalog.price' | translate }}</th>\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\n </tr>\n </thead>\n <tr\n *ngFor=\"let variant of variants; trackBy: trackByFn\"\n [class.disabled]=\"!variantFormValues[variant.id].value.enabled === false\"\n [formGroup]=\"variantFormValues[variant.id]\"\n >\n <td *ngIf=\"1 < variants.length\">\n <input type=\"checkbox\" formControlName=\"enabled\" clrCheckbox />\n </td>\n <td *ngIf=\"1 < variants.length\">\n {{ variant.values.join(' ') }}\n </td>\n <td>\n <vdr-form-field>\n <input type=\"text\" formControlName=\"sku\" [placeholder]=\"'catalog.sku' | translate\" />\n </vdr-form-field>\n </td>\n <td>\n <vdr-form-field>\n <vdr-currency-input\n formControlName=\"price\"\n [currencyCode]=\"currencyCode\"\n ></vdr-currency-input>\n </vdr-form-field>\n </td>\n <td>\n <vdr-form-field>\n <input type=\"number\" formControlName=\"stock\" min=\"0\" step=\"1\" />\n </vdr-form-field>\n </td>\n </tr>\n </table>\n </div>\n</ng-container>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n CreateProductInput,\n createUpdatedTranslatable,\n DataService,\n findTranslation,\n getChannelCodeFromUserStatus,\n getCustomFieldsDefaults,\n GetProductDetailDocument,\n GetProductDetailQuery,\n GetProductWithVariantsQuery,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n PRODUCT_DETAIL_FRAGMENT,\n ProductDetailFragment,\n ProductVariantFragment,\n TypedBaseDetailComponent,\n unicodePatternValidator,\n UpdateProductInput,\n UpdateProductMutation,\n UpdateProductVariantInput,\n UpdateProductVariantsMutation,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\nimport { unique } from '@vendure/common/lib/unique';\nimport { gql } from 'apollo-angular';\nimport { combineLatest, concat, EMPTY, from, Observable, of } from 'rxjs';\nimport { distinctUntilChanged, map, mergeMap, shareReplay, switchMap, take } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { CreateProductVariantsConfig } from '../generate-product-variants/generate-product-variants.component';\n\ninterface SelectedAssets {\n assets?: Asset[];\n featuredAsset?: Asset;\n}\n\nexport const GET_PRODUCT_DETAIL = gql`\n query GetProductDetail($id: ID!) {\n product(id: $id) {\n ...ProductDetail\n }\n }\n ${PRODUCT_DETAIL_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-product-detail2',\n templateUrl: './product-detail.component.html',\n styleUrls: ['./product-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class ProductDetailComponent\n extends TypedBaseDetailComponent<typeof GetProductDetailDocument, 'product'>\n implements OnInit, OnDestroy\n{\n readonly customFields = this.getCustomFieldConfig('Product');\n detailForm = this.formBuilder.group({\n enabled: true,\n name: ['', Validators.required],\n autoUpdateVariantNames: true,\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9._-]+$/u)],\n description: '',\n facetValueIds: [[] as string[]],\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n assetChanges: SelectedAssets = {};\n productChannels$: Observable<ProductDetailFragment['channels']>;\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [], stockLocationId: '' };\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n private productDetailService: ProductDetailService,\n private formBuilder: FormBuilder,\n private modalService: ModalService,\n private notificationService: NotificationService,\n protected dataService: DataService,\n private changeDetector: ChangeDetectorRef,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n\n const productFacetValues$ = this.isNew$.pipe(\n switchMap(isNew => {\n return isNew ? of([]) : this.entity$.pipe(map(product => product.facetValues));\n }),\n );\n const productGroup = this.detailForm;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const formFacetValueIdChanges$ = productGroup.get('facetValueIds')!.valueChanges.pipe(\n distinctUntilChanged(),\n switchMap(ids =>\n this.dataService.facet\n .getFacetValues({ filter: { id: { in: ids } } })\n .mapSingle(({ facetValues }) => facetValues.items),\n ),\n shareReplay(1),\n );\n this.facetValues$ = concat(\n productFacetValues$.pipe(take(1)),\n productFacetValues$.pipe(switchMap(() => formFacetValueIdChanges$)),\n );\n this.productChannels$ = this.entity$.pipe(map(p => p.channels));\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n isDefaultChannel(channelCode: string): boolean {\n return channelCode === DEFAULT_CHANNEL_CODE;\n }\n\n assignToChannel() {\n this.productChannels$\n .pipe(\n take(1),\n switchMap(channels =>\n this.modalService.fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productIds: [this.id],\n currentChannelIds: channels.map(c => c.id),\n },\n }),\n ),\n )\n .subscribe();\n }\n\n removeFromChannel(channelId: string) {\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\n .pipe(\n switchMap(({ channelCode }) =>\n this.modalService.dialog({\n title: _('catalog.remove-product-from-channel'),\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n {\n type: 'danger',\n label: _('catalog.remove-from-channel'),\n translationVars: { channelCode },\n returnValue: true,\n },\n ],\n }),\n ),\n switchMap(response =>\n response\n ? this.dataService.product.removeProductsFromChannel({\n channelId,\n productIds: [this.id],\n })\n : EMPTY,\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('catalog.notify-remove-product-from-channel-success'));\n },\n err => {\n this.notificationService.error(_('catalog.notify-remove-product-from-channel-error'));\n },\n );\n }\n\n assignVariantToChannel(variant: ProductVariantFragment) {\n return this.modalService\n .fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productIds: [this.id],\n productVariantIds: [variant.id],\n currentChannelIds: variant.channels.map(c => c.id),\n },\n })\n .subscribe();\n }\n\n removeVariantFromChannel({ channelId, variant }: { channelId: string; variant: ProductVariantFragment }) {\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\n .pipe(\n switchMap(({ channelCode }) =>\n this.modalService.dialog({\n title: _('catalog.remove-product-variant-from-channel'),\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n {\n type: 'danger',\n label: _('catalog.remove-from-channel'),\n translationVars: { channelCode },\n returnValue: true,\n },\n ],\n }),\n ),\n switchMap(response =>\n response\n ? this.dataService.product.removeVariantsFromChannel({\n channelId,\n productVariantIds: [variant.id],\n })\n : EMPTY,\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('catalog.notify-remove-variant-from-channel-success'));\n },\n err => {\n this.notificationService.error(_('catalog.notify-remove-variant-from-channel-error'));\n },\n );\n }\n\n assetsChanged(): boolean {\n return !!Object.values(this.assetChanges).length;\n }\n\n /**\n * If creating a new product, automatically generate the slug based on the product name.\n */\n updateSlug(nameValue: string) {\n const slugControl = this.detailForm.get('slug');\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\n }\n }\n\n selectProductFacetValue() {\n this.displayFacetValueModal().subscribe(facetValueIds => {\n if (facetValueIds) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(unique([...currentFacetValueIds, ...facetValueIds]));\n facetValueIdsControl.markAsDirty();\n }\n });\n }\n\n removeProductFacetValue(facetValueId: string) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(currentFacetValueIds.filter(id => id !== facetValueId));\n facetValueIdsControl.markAsDirty();\n }\n\n private displayFacetValueModal(): Observable<string[] | undefined> {\n return this.modalService\n .fromComponent(ApplyFacetDialogComponent, {\n size: 'md',\n closable: true,\n })\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\n }\n\n create() {\n const productGroup = this.detailForm;\n if (!productGroup.dirty) {\n return;\n }\n\n const newProduct = this.getUpdatedProduct(\n {\n id: '',\n createdAt: '',\n updatedAt: '',\n enabled: true,\n languageCode: this.languageCode,\n name: '',\n slug: '',\n featuredAsset: null,\n assets: [],\n description: '',\n translations: [],\n optionGroups: [],\n facetValues: [],\n channels: [],\n },\n productGroup as UntypedFormGroup,\n this.languageCode,\n ) as CreateProductInput;\n this.productDetailService\n .createProductWithVariants(newProduct, this.createVariantsConfig, this.languageCode)\n .subscribe(\n ({ createProductVariants, productId }) => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'Product',\n });\n this.assetChanges = {};\n this.detailForm.markAsPristine();\n this.router.navigate(['../', productId], { relativeTo: this.route });\n },\n err => {\n // eslint-disable-next-line no-console\n console.error(err);\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Product',\n });\n },\n );\n }\n\n save() {\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([product, languageCode]) => {\n const productGroup = this.detailForm;\n let productInput: UpdateProductInput | undefined;\n let variantsInput: UpdateProductVariantInput[] | undefined;\n\n if (productGroup.dirty || this.assetsChanged()) {\n productInput = this.getUpdatedProduct(\n product,\n productGroup as UntypedFormGroup,\n languageCode,\n ) as UpdateProductInput;\n }\n\n return this.productDetailService.updateProduct({\n product,\n languageCode,\n autoUpdate: this.detailForm.get(['autoUpdateVariantNames'])?.value ?? false,\n productInput,\n variantsInput,\n });\n }),\n )\n .subscribe(\n result => {\n this.updateSlugAfterSave(result);\n this.detailForm.markAsPristine();\n this.assetChanges = {};\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'Product',\n });\n this.changeDetector.markForCheck();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Product',\n });\n },\n );\n }\n\n canDeactivate(): boolean {\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\n }\n\n /**\n * Sets the values of the form on changes to the product or current language.\n */\n protected setFormValues(\n product: NonNullable<GetProductWithVariantsQuery['product']>,\n languageCode: LanguageCode,\n ) {\n const currentTranslation = findTranslation(product, languageCode);\n this.detailForm.patchValue({\n enabled: product.enabled,\n name: currentTranslation ? currentTranslation.name : '',\n slug: currentTranslation ? currentTranslation.slug : '',\n description: currentTranslation ? currentTranslation.description : '',\n facetValueIds: product.facetValues.map(fv => fv.id),\n });\n\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get(['customFields']),\n product,\n currentTranslation,\n );\n }\n }\n\n /**\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\n * can then be persisted to the API.\n */\n private getUpdatedProduct(\n product: NonNullable<GetProductDetailQuery['product']>,\n productFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductInput | CreateProductInput {\n const updatedProduct = createUpdatedTranslatable({\n translatable: product,\n updatedFields: productFormGroup.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: product.name || '',\n slug: product.slug || '',\n description: product.description || '',\n },\n });\n return {\n ...updatedProduct,\n assetIds: this.assetChanges.assets?.map(a => a.id),\n featuredAssetId: this.assetChanges.featuredAsset?.id,\n facetValueIds: productFormGroup.controls.facetValueIds.dirty\n ? productFormGroup.value.facetValueIds\n : undefined,\n } as UpdateProductInput | CreateProductInput;\n }\n\n /**\n * The server may alter the slug value in order to normalize and ensure uniqueness upon saving.\n */\n private updateSlugAfterSave(results: Array<UpdateProductMutation | UpdateProductVariantsMutation>) {\n const firstResult = results[0];\n const slugControl = this.detailForm.get(['product', 'slug']);\n\n function isUpdateMutation(input: any): input is UpdateProductMutation {\n return input.hasOwnProperty('updateProduct');\n }\n\n if (slugControl && isUpdateMutation(firstResult)) {\n slugControl.setValue(firstResult.updateProduct.slug, { emitEvent: false });\n }\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <div class=\"flex clr-flex-row\"></div>\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"product-detail\"></vdr-action-bar-items>\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine || createVariantsConfig.variants.length === 0\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n *vdrIfPermissions=\"updatePermissions\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"product-detail\"></vdr-action-bar-dropdown-menu>\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermissions\">\n <input\n type=\"checkbox\"\n clrToggle\n name=\"enabled\"\n [formControl]=\"detailForm.get(['enabled'])\"\n />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <ng-container *ngIf=\"!(isNew$ | async)\">\n <vdr-card *vdrIfMultichannel [title]=\"'common.channels' | translate\">\n <vdr-form-item *vdrIfDefaultChannelActive>\n <div class=\"flex channel-assignment\">\n <div class=\"mb-2\">\n <ng-container *ngFor=\"let channel of productChannels$ | async\">\n <vdr-chip\n *ngIf=\"!isDefaultChannel(channel.code)\"\n icon=\"times-circle\"\n (iconClick)=\"removeFromChannel(channel.id)\"\n >\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\n {{ channel.code | channelCodeToLabel }}\n </vdr-chip>\n </ng-container>\n </div>\n <button class=\"button-small\" (click)=\"assignToChannel()\">\n <clr-icon shape=\"layers\"></clr-icon>\n {{ 'common.assign-to-channel' | translate }}\n </button>\n </div>\n </vdr-form-item>\n </vdr-card>\n </ng-container>\n <vdr-card *ngIf=\"entity?.optionGroups.length\" [title]=\"'catalog.product-options' | translate\">\n <div class=\"options\">\n <vdr-chip\n *ngFor=\"let optionGroup of entity?.optionGroups | sort : 'id'\"\n [colorFrom]=\"optionGroup.code\"\n [invert]=\"true\"\n >\n {{ optionGroup.name }}\n </vdr-chip>\n </div>\n <div>\n <a [routerLink]=\"['options']\" class=\"button-small mt-2\" *vdrIfPermissions=\"updatePermissions\">\n <clr-icon shape=\"pencil\"></clr-icon>\n {{ 'catalog.edit-options' | translate }}\n </a>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'catalog.facets' | translate\">\n <div class=\"facets\">\n <vdr-facet-value-chip\n *ngFor=\"let facetValue of facetValues$ | async\"\n [facetValue]=\"facetValue\"\n [removable]=\"updatePermissions | hasPermission\"\n (remove)=\"removeProductFacetValue(facetValue.id)\"\n ></vdr-facet-value-chip>\n </div>\n <div>\n <button\n class=\"button-small mt-2\"\n *vdrIfPermissions=\"updatePermissions\"\n (click)=\"selectProductFacetValue()\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-facets' | translate }}\n </button>\n </div>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\n </vdr-card>\n </vdr-page-detail-sidebar>\n\n <vdr-page-block>\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\n <vdr-card>\n <div class=\"form-grid\">\n <div>\n <vdr-form-field [label]=\"'catalog.product-name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n (input)=\"updateSlug($event.target.value)\"\n />\n </vdr-form-field>\n <div *ngIf=\"(isNew$ | async) === false && detailForm.get(['name'])?.dirty\">\n <clr-checkbox-wrapper>\n <input\n clrCheckbox\n type=\"checkbox\"\n id=\"auto-update\"\n formControlName=\"autoUpdateVariantNames\"\n />\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\n </clr-checkbox-wrapper>\n </div>\n </div>\n <vdr-form-field\n [label]=\"'catalog.slug' | translate\"\n for=\"slug\"\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\n >\n <input\n id=\"slug\"\n type=\"text\"\n formControlName=\"slug\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field\n class=\"form-grid-span\"\n [label]=\"'common.description' | translate\"\n for=\"slug\"\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\n >\n <vdr-rich-text-editor\n formControlName=\"description\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n ></vdr-rich-text-editor>\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"Product\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n <vdr-custom-detail-component-host\n locationId=\"product-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n <vdr-card [title]=\"'catalog.assets' | translate\">\n <vdr-assets\n [assets]=\"assetChanges.assets || entity?.assets\"\n [featuredAsset]=\"assetChanges.featuredAsset || entity?.featuredAsset\"\n [updatePermissions]=\"updatePermissions\"\n (change)=\"assetChanges = $event\"\n ></vdr-assets>\n </vdr-card>\n\n <vdr-card [title]=\"'catalog.product-variants' | translate\" [paddingX]=\"isNew$ | async\">\n <div *ngIf=\"isNew$ | async; else variantList\">\n <vdr-generate-product-variants\n (variantsChange)=\"createVariantsConfig = $event\"\n ></vdr-generate-product-variants>\n </div>\n <ng-template #variantList>\n <vdr-product-variant-list\n [productId]=\"this.id\"\n dataTableId=\"product-detail-variants-list\"\n [hideLanguageSelect]=\"true\"\n ></vdr-product-variant-list>\n </ng-template>\n <div class=\"mx-3\" *ngIf=\"(isNew$ | async) === false\">\n <a class=\"button\" [routerLink]=\"['manage-variants']\">\n <clr-icon shape=\"add-text\"></clr-icon>\n {{ 'catalog.manage-variants' | translate }}</a\n >\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { Component, Input, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataTableLocationId,\n ProductVariantFilterParameter,\n ProductVariantListQueryDocument,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-product-variant-list',\n templateUrl: './product-variant-list.component.html',\n styleUrls: ['./product-variant-list.component.scss'],\n standalone: false,\n})\nexport class ProductVariantListComponent\n extends TypedBaseListComponent<typeof ProductVariantListQueryDocument, 'productVariants'>\n implements OnInit\n{\n @Input() productId?: string;\n @Input() hideLanguageSelect = false;\n pageLocationId = 'product-variant-list' as const;\n @Input() dataTableId: DataTableLocationId | undefined;\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilters([\n {\n name: 'name',\n type: { kind: 'text' },\n label: _('common.name'),\n filterField: 'name',\n },\n {\n name: 'enabled',\n type: { kind: 'boolean' },\n label: _('common.enabled'),\n filterField: 'enabled',\n },\n {\n name: 'sku',\n type: { kind: 'text' },\n label: _('catalog.sku'),\n filterField: 'sku',\n },\n {\n name: 'price',\n type: { kind: 'number', inputType: 'currency' },\n label: _('common.price'),\n filterField: 'price',\n },\n {\n name: 'priceWithTax',\n type: { kind: 'number', inputType: 'currency' },\n label: _('common.price-with-tax'),\n filterField: 'priceWithTax',\n },\n ])\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n\n readonly sorts = this.createSortCollection()\n .addSorts([\n { name: 'id' },\n { name: 'createdAt' },\n { name: 'updatedAt' },\n { name: 'name' },\n { name: 'sku' },\n { name: 'price' },\n { name: 'priceWithTax' },\n ])\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor() {\n super();\n this.configure({\n document: ProductVariantListQueryDocument,\n getItems: data => data.productVariants,\n setVariables: (skip, take) => {\n const searchTerm = this.searchTermControl.value;\n const filterParam: ProductVariantFilterParameter = { _and: [] };\n const filterInput = this.filters.createFilterInput();\n if (Object.keys(filterInput).length) {\n filterParam._and?.push(filterInput);\n }\n if (searchTerm) {\n filterParam._and?.push({\n _or: [\n {\n name: { contains: searchTerm },\n },\n {\n sku: { contains: searchTerm },\n },\n ],\n });\n }\n if (this.productId) {\n filterParam._and?.push({\n productId: {\n eq: this.productId,\n },\n });\n }\n return {\n options: {\n skip,\n take,\n filter: filterParam,\n sort: this.sorts.createSortInput(),\n },\n };\n },\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\n });\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector *ngIf=\"!hideLanguageSelect\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items [locationId]=\"pageLocationId\" />\n <vdr-action-bar-dropdown-menu [locationId]=\"pageLocationId\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-data-table-2\n class=\"mt-2\"\n [id]=\"dataTableId || 'product-variant-list'\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"product-variant-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n />\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'settings.search-by-product-name-or-sku' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\n <ng-template let-variant=\"item\">\n {{ variant.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-variant=\"item\">\n {{ variant.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-variant=\"item\">\n {{ variant.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\n <ng-template let-variant=\"item\">\n <div class=\"image-placeholder\">\n <img\n *ngIf=\"variant.featuredAsset as asset; else imagePlaceholder\"\n [src]=\"asset | assetPreview : 'tiny'\"\n />\n <ng-template #imagePlaceholder>\n <div class=\"placeholder\">\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\n <ng-template let-variant=\"item\">\n <a\n class=\"button-ghost\"\n [routerLink]=\"['/catalog/products', variant.productId, 'variants', variant.id]\"\n ><span>{{ variant.name }}</span\n >\n <clr-icon shape=\"arrow right\"\n />\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [sort]=\"sorts.get('sku')\">\n <ng-template let-variant=\"item\">\n {{ variant.sku }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-variant=\"item\">\n <vdr-chip *ngIf=\"variant.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}\n </vdr-chip>\n <vdr-chip *ngIf=\"!variant.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}\n </vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.price' | translate\" id=\"price\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('price')\"\n >\n <ng-template let-variant=\"item\">\n {{ variant.price | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\"\n [sort]=\"sorts.get('priceWithTax')\">\n <ng-template let-variant=\"item\">\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n\n <vdr-dt2-column [heading]=\"'catalog.stock-on-hand' | translate\" id=\"stock-on-hand\" [hiddenByDefault]=\"false\">\n <ng-template let-variant=\"item\">\n <vdr-chip *ngFor=\"let stockLevel of variant.stockLevels\" [title]=\"stockLevel.stockLocation?.name\">\n <div class=\"flex center\">\n <div>\n {{\n stockLevel.stockOnHand\n }}<span class=\"ml-1\" *ngIf=\"stockLevel.stockAllocated\"\n >({{ stockLevel.stockAllocated }} allocated)</span\n >\n </div>\n </div>\n </vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column *ngFor=\"let field of customFields\" [customField]=\"field\" [sorts]=\"sorts\" />\n</vdr-data-table-2>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkRemoveFromChannelAction,\n DataService,\n DeletionResult,\n DuplicateEntityDialogComponent,\n GetProductListQuery,\n isMultiChannel,\n ItemOf,\n ModalService,\n NotificationService,\n Permission,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { BulkAddFacetValuesDialogComponent } from '../bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\n\nimport { ProductListComponent } from './product-list.component';\n\nexport const deleteProductsBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('common.delete'),\n icon: 'trash',\n iconClass: 'is-danger',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteProduct) ||\n userPermissions.includes(Permission.DeleteCatalog),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n modalService\n .dialog({\n title: _('catalog.confirm-bulk-delete-products'),\n translationVars: {\n count: selection.length,\n },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response =>\n response ? dataService.product.deleteProducts(unique(selection.map(p => p.id))) : EMPTY,\n ),\n )\n .subscribe(result => {\n let deleted = 0;\n const errors: string[] = [];\n for (const item of result.deleteProducts) {\n if (item.result === DeletionResult.DELETED) {\n deleted++;\n } else if (item.message) {\n errors.push(item.message);\n }\n }\n if (0 < deleted) {\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\n count: deleted,\n });\n }\n if (0 < errors.length) {\n notificationService.error(errors.join('\\n'));\n }\n hostComponent.refresh();\n clearSelection();\n });\n },\n};\n\nexport const assignProductsToChannelBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('common.assign-to-channel'),\n icon: 'layers',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\n onClick: ({ injector, selection, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productIds: unique(selection.map(p => p.id)),\n currentChannelIds: [],\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n }\n });\n },\n};\n\nexport const removeProductsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetProductListQuery, 'products'>\n>({\n location: 'product-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, productIds, channelId) =>\n dataService.product\n .removeProductsFromChannel({\n channelId: channelId,\n productIds,\n })\n .pipe(map(res => res.removeProductsFromChannel)),\n});\n\nexport const assignFacetValuesToProductsBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('catalog.edit-facet-values'),\n icon: 'tag',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const notificationService = injector.get(NotificationService);\n const mode = 'product';\n const ids = unique(selection.map(p => p.id));\n return modalService\n .fromComponent(BulkAddFacetValuesDialogComponent, {\n size: 'xl',\n locals: {\n mode,\n ids,\n },\n })\n .subscribe(result => {\n if (result) {\n notificationService.success(_('common.notify-bulk-update-success'), {\n count: selection.length,\n entity: mode === 'product' ? 'Products' : 'ProductVariants',\n });\n clearSelection();\n }\n });\n },\n};\n\nexport const duplicateProductsBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('common.duplicate'),\n icon: 'copy',\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(DuplicateEntityDialogComponent<ItemOf<GetProductListQuery, 'products'>>, {\n locals: {\n entities: selection,\n entityName: 'Product',\n title: _('catalog.duplicate-products'),\n getEntityName: entity => entity.name,\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n hostComponent.refresh();\n }\n });\n },\n};\n", "import { Component, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n FacetValueFormInputComponent,\n JobQueueService,\n JobState,\n LogicalOperator,\n ModalService,\n NotificationService,\n ProductListQueryDocument,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\nimport { EMPTY, lastValueFrom } from 'rxjs';\nimport { delay, switchMap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-products-list',\n templateUrl: './product-list.component.html',\n styleUrls: ['./product-list.component.scss'],\n standalone: false,\n})\nexport class ProductListComponent\n extends TypedBaseListComponent<typeof ProductListQueryDocument, 'products'>\n implements OnInit\n{\n pendingSearchIndexUpdates = 0;\n dataTableListId = 'product-list';\n pageLocationId = 'product-list' as const;\n readonly customFields = this.getCustomFieldConfig('Product');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilters([\n {\n name: 'enabled',\n type: { kind: 'boolean' },\n label: _('common.enabled'),\n filterField: 'enabled',\n },\n {\n name: 'slug',\n type: { kind: 'text' },\n label: _('common.slug'),\n filterField: 'slug',\n },\n ])\n .addFilter({\n name: 'facetValues',\n type: {\n kind: 'custom',\n component: FacetValueFormInputComponent,\n serializeValue: value => value.map(v => v.id).join(','),\n deserializeValue: value => value.split(',').map(id => ({ id })),\n getLabel: value => {\n if (value.length === 0) {\n return '';\n }\n if (value[0].name) {\n return value.map(v => v.name).join(', ');\n } else {\n return lastValueFrom(\n this.dataService.facet\n .getFacetValues({ filter: { id: { in: value.map(v => v.id) } } })\n .mapSingle(({ facetValues }) =>\n facetValues.items.map(fv => fv.name).join(', '),\n ),\n );\n }\n },\n },\n label: _('catalog.facet-values'),\n toFilterInput: (value: any[]) => ({\n facetValueId: {\n in: value.map(v => v.id),\n },\n }),\n })\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n\n readonly sorts = this.createSortCollection()\n .defaultSort('createdAt', 'DESC')\n .addSorts([\n { name: 'id' },\n { name: 'createdAt' },\n { name: 'updatedAt' },\n { name: 'name' },\n { name: 'slug' },\n ])\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor(\n protected dataService: DataService,\n private modalService: ModalService,\n private notificationService: NotificationService,\n private jobQueueService: JobQueueService,\n ) {\n super();\n this.configure({\n document: ProductListQueryDocument,\n getItems: data => data.products,\n setVariables: (skip, take) => {\n const searchTerm = this.searchTermControl.value;\n let filterInput = this.filters.createFilterInput();\n if (searchTerm) {\n filterInput = {\n name: {\n contains: searchTerm,\n },\n sku: {\n contains: searchTerm,\n },\n };\n }\n return {\n options: {\n skip,\n take,\n filter: {\n ...(filterInput ?? {}),\n },\n filterOperator: searchTerm ? LogicalOperator.OR : LogicalOperator.AND,\n sort: this.sorts.createSortInput(),\n },\n };\n },\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\n });\n }\n\n rebuildSearchIndex() {\n this.dataService.product.reindex().subscribe(({ reindex }) => {\n this.notificationService.info(_('catalog.reindexing'));\n this.jobQueueService.addJob(reindex.id, job => {\n if (job.state === JobState.COMPLETED) {\n const time = new Intl.NumberFormat().format(job.duration || 0);\n this.notificationService.success(_('catalog.reindex-successful'), {\n count: job.result.indexedItemCount,\n time,\n });\n this.refresh();\n } else {\n this.notificationService.error(_('catalog.reindex-error'));\n }\n });\n });\n }\n\n deleteProduct(productId: string) {\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product'),\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response => (response ? this.dataService.product.deleteProduct(productId) : EMPTY)),\n // Short delay to allow the product to be removed from the search index before\n // refreshing.\n delay(500),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'Product',\n });\n this.refresh();\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'Product',\n });\n },\n );\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items [locationId]=\"pageLocationId\"></vdr-action-bar-items>\n <a\n class=\"btn btn-primary mr-1\"\n [routerLink]=\"['./create']\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateProduct']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-product' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu [alwaysShow]=\"true\" [locationId]=\"pageLocationId\">\n <button type=\"button\" vdrDropdownItem (click)=\"rebuildSearchIndex()\">\n <clr-icon shape=\"refresh\" class=\"\"></clr-icon>\n {{ 'catalog.rebuild-search-index' | translate }}\n </button>\n </vdr-action-bar-dropdown-menu>\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-data-table-2\n class=\"mt-2\"\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n [locationId]=\"dataTableListId\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n ></vdr-bulk-action-menu>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'settings.search-by-product-name-or-sku' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\n <ng-template let-product=\"item\">\n {{ product.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-product=\"item\">\n {{ product.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-product=\"item\">\n {{ product.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\n <ng-template let-product=\"item\">\n <div class=\"image-placeholder\">\n <img\n *ngIf=\"product.featuredAsset as asset; else imagePlaceholder\"\n [src]=\"asset | assetPreview : 'tiny'\"\n />\n <ng-template #imagePlaceholder>\n <div class=\"placeholder\">\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\n <ng-template let-product=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', product.id]\"\n ><span>{{ product.name }}</span\n ><clr-icon shape=\"arrow right\"\n /></a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\n <ng-template let-product=\"item\">\n {{ product.slug }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-product=\"item\">\n <vdr-chip *ngIf=\"product.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!product.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.number-of-variants' | translate\" id=\"number-of-variants\">\n <ng-template let-product=\"item\">\n {{ 'catalog.variant-count' | translate : { count: product.variantList?.totalItems } }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n</vdr-data-table-2>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, UntypedFormGroup } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n CreateProductVariantInput,\n createUpdatedTranslatable,\n CurrencyCode,\n DataService,\n findTranslation,\n getCustomFieldsDefaults,\n GetProductVariantDetailDocument,\n GetProductVariantDetailQuery,\n GlobalFlag,\n ItemOf,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n ProductOptionFragment,\n ProductVariantUpdateMutationDocument,\n TypedBaseDetailComponent,\n UpdateProductVariantInput,\n} from '@vendure/admin-ui/core';\nimport { pick } from '@vendure/common/lib/pick';\nimport { unique } from '@vendure/common/lib/unique';\nimport { combineLatest, concat, Observable } from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n mergeMap,\n shareReplay,\n skip,\n switchMap,\n switchMapTo,\n take,\n tap,\n} from 'rxjs/operators';\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\n\ninterface SelectedAssets {\n assets?: Asset[];\n featuredAsset?: Asset;\n}\n\ninterface VariantFormValue {\n id: string;\n enabled: boolean;\n sku: string;\n name: string;\n taxCategoryId: string;\n stockOnHand: number;\n useGlobalOutOfStockThreshold: boolean;\n outOfStockThreshold: number;\n trackInventory: GlobalFlag;\n facetValueIds: string[][];\n customFields?: any;\n}\ntype T = NonNullable<GetProductVariantDetailQuery['productVariant']>;\ntype T1 = T['stockLevels'];\n@Component({\n selector: 'vdr-product-variant-detail',\n templateUrl: './product-variant-detail.component.html',\n styleUrls: ['./product-variant-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductVariantDetailComponent\n extends TypedBaseDetailComponent<typeof GetProductVariantDetailDocument, 'productVariant'>\n implements OnInit, OnDestroy\n{\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\n readonly customPriceFields = this.getCustomFieldConfig('ProductVariantPrice');\n readonly customOptionFields = this.getCustomFieldConfig('ProductOption');\n stockLevels$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['stockLevels']>;\n detailForm = this.formBuilder.group<VariantFormValue>({\n id: '',\n enabled: false,\n sku: '',\n name: '',\n taxCategoryId: '',\n stockOnHand: 0,\n useGlobalOutOfStockThreshold: true,\n outOfStockThreshold: 0,\n trackInventory: GlobalFlag.TRUE,\n facetValueIds: [],\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n stockLevelsForm = this.formBuilder.array<\n FormGroup<{\n stockLocationId: FormControl<string | null>;\n stockLocationName: FormControl<string | null>;\n stockOnHand: FormControl<number | null>;\n stockAllocated: FormControl<number | null>;\n }>\n >([]);\n pricesForm = this.formBuilder.array<\n FormGroup<{\n price: FormControl<number | null>;\n currencyCode: FormControl<CurrencyCode | null>;\n delete: FormControl<boolean | null>;\n customFields: FormGroup<any>; //TODO: Add type\n }>\n >([]);\n assetChanges: SelectedAssets = {};\n taxCategories$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'taxCategories'>>>;\n unusedStockLocation$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'stockLocations'>>>;\n unusedCurrencyCodes$: Observable<string[]>;\n channelPriceIncludesTax$: Observable<boolean>;\n readonly GlobalFlag = GlobalFlag;\n globalTrackInventory: boolean;\n globalOutOfStockThreshold: number;\n facetValues$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['facetValues']>;\n channelDefaultCurrencyCode: CurrencyCode;\n\n constructor(\n private productDetailService: ProductDetailService,\n private formBuilder: FormBuilder,\n private modalService: ModalService,\n private notificationService: NotificationService,\n protected dataService: DataService,\n private changeDetector: ChangeDetectorRef,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n this.dataService.settings.getGlobalSettings('cache-first').single$.subscribe(({ globalSettings }) => {\n this.globalTrackInventory = globalSettings.trackInventory;\n this.globalOutOfStockThreshold = globalSettings.outOfStockThreshold;\n this.changeDetector.markForCheck();\n });\n this.taxCategories$ = this.result$.pipe(map(data => data.taxCategories.items));\n const availableCurrencyCodes$ = this.result$.pipe(\n tap(data => (this.channelDefaultCurrencyCode = data.activeChannel.defaultCurrencyCode)),\n map(data => data.activeChannel.availableCurrencyCodes),\n );\n this.unusedCurrencyCodes$ = combineLatest(this.pricesForm.valueChanges, availableCurrencyCodes$).pipe(\n map(([prices, currencyCodes]) =>\n currencyCodes.filter(code => !prices.map(p => p.currencyCode).includes(code)),\n ),\n );\n const stockLocations$ = this.result$.pipe(map(data => data.stockLocations.items));\n this.unusedStockLocation$ = combineLatest(this.entity$, stockLocations$).pipe(\n map(([entity, stockLocations]) => {\n const usedIds = entity.stockLevels.map(l => l.stockLocation.id);\n return stockLocations.filter(l => !usedIds.includes(l.id));\n }),\n );\n this.channelPriceIncludesTax$ = this.dataService.settings\n .getActiveChannel('cache-first')\n .refetchOnChannelChange()\n .mapStream(data => data.activeChannel.pricesIncludeTax)\n .pipe(shareReplay(1));\n this.stockLevels$ = this.entity$.pipe(map(entity => entity?.stockLevels ?? []));\n const facetValues$ = this.entity$.pipe(map(variant => variant.facetValues ?? []));\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const formFacetValueIdChanges$ = this.detailForm.get('facetValueIds')!.valueChanges.pipe(\n skip(1),\n distinctUntilChanged(),\n switchMap(ids =>\n this.dataService.facet\n .getFacetValues({ filter: { id: { in: ids } } })\n .mapSingle(({ facetValues }) => facetValues.items),\n ),\n shareReplay(1),\n );\n this.facetValues$ = concat(\n facetValues$.pipe(take(1)),\n facetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\n );\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n addPriceInCurrency(currencyCode: CurrencyCode) {\n this.pricesForm.push(\n this.formBuilder.group({\n currencyCode,\n price: 0,\n delete: false as boolean,\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customPriceFields)),\n }),\n );\n }\n\n toggleDeletePrice(deleteFormControl: FormControl) {\n deleteFormControl.setValue(!deleteFormControl.value);\n deleteFormControl.markAsDirty();\n }\n\n addStockLocation(stockLocation: ItemOf<GetProductVariantDetailQuery, 'stockLocations'>) {\n this.stockLevelsForm.push(\n this.formBuilder.group({\n stockLocationId: stockLocation.id,\n stockLocationName: stockLocation.name,\n stockOnHand: 0,\n stockAllocated: 0,\n }),\n );\n }\n\n save() {\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([variant, languageCode]) => {\n const input = pick(\n this.getUpdatedVariant(\n variant,\n this.detailForm,\n languageCode,\n ) as UpdateProductVariantInput,\n [\n 'id',\n 'enabled',\n 'translations',\n 'sku',\n 'taxCategoryId',\n 'facetValueIds',\n 'featuredAssetId',\n 'assetIds',\n 'trackInventory',\n 'outOfStockThreshold',\n 'useGlobalOutOfStockThreshold',\n 'customFields',\n ],\n ) as UpdateProductVariantInput;\n if (this.stockLevelsForm.dirty) {\n input.stockLevels = this.stockLevelsForm.controls\n .filter(control => control.dirty)\n .map(control => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n stockLocationId: control.value.stockLocationId!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n stockOnHand: control.value.stockOnHand!,\n }));\n }\n if (this.pricesForm.dirty) {\n input.prices = this.pricesForm.controls\n .filter(control => control.dirty)\n .map(control => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n price: control.value.price!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n currencyCode: control.value.currencyCode!,\n delete: control.value.delete === true,\n customFields: control.get('customFields')?.value,\n }));\n }\n return this.dataService.mutate(ProductVariantUpdateMutationDocument, {\n input: [input],\n });\n }),\n )\n .subscribe(\n result => {\n this.detailForm.markAsPristine();\n this.stockLevelsForm.markAsPristine();\n this.pricesForm.markAsPristine();\n this.assetChanges = {};\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductVariant',\n });\n this.changeDetector.markForCheck();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductVariant',\n });\n },\n );\n }\n\n assetsChanged(): boolean {\n return !!Object.values(this.assetChanges).length;\n }\n\n inventoryIsNotTracked(formGroup: UntypedFormGroup): boolean {\n const trackInventory = formGroup.get('trackInventory')?.value;\n return (\n trackInventory === GlobalFlag.FALSE ||\n (trackInventory === GlobalFlag.INHERIT && this.globalTrackInventory === false)\n );\n }\n\n optionGroupCode(optionGroupId: string): string | undefined {\n const group = this.entity?.product.optionGroups.find(g => g.id === optionGroupId);\n return group?.code;\n }\n\n optionName(option: ProductOptionFragment) {\n const translation =\n option.translations.find(t => t.languageCode === this.languageCode) ?? option.translations[0];\n return translation.name;\n }\n\n removeFacetValue(facetValueId: string) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(currentFacetValueIds.filter(id => id !== facetValueId));\n facetValueIdsControl.markAsDirty();\n }\n\n selectFacetValue() {\n this.displayFacetValueModal().subscribe(facetValueIds => {\n if (facetValueIds) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(unique([...currentFacetValueIds, ...facetValueIds]));\n facetValueIdsControl.markAsDirty();\n }\n });\n }\n\n private displayFacetValueModal(): Observable<string[] | undefined> {\n return this.modalService\n .fromComponent(ApplyFacetDialogComponent, {\n size: 'md',\n closable: true,\n })\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\n }\n\n protected setFormValues(\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\n languageCode: LanguageCode,\n ): void {\n const variantTranslation = findTranslation(variant, languageCode);\n const facetValueIds = variant.facetValues.map(fv => fv.id);\n this.detailForm.patchValue({\n id: variant.id,\n enabled: variant.enabled,\n sku: variant.sku,\n name: variantTranslation ? variantTranslation.name : '',\n taxCategoryId: variant.taxCategory.id,\n stockOnHand: variant.stockLevels[0]?.stockOnHand ?? 0,\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\n outOfStockThreshold: variant.outOfStockThreshold,\n trackInventory: variant.trackInventory,\n facetValueIds,\n });\n this.stockLevelsForm.clear();\n for (const stockLevel of variant.stockLevels) {\n this.stockLevelsForm.push(\n this.formBuilder.group({\n stockLocationId: stockLevel.stockLocation.id,\n stockLocationName: stockLevel.stockLocation.name,\n stockOnHand: stockLevel.stockOnHand,\n stockAllocated: stockLevel.stockAllocated,\n }),\n );\n }\n this.pricesForm.clear();\n for (const price of variant.prices) {\n const priceForm = this.formBuilder.group({\n price: price.price,\n currencyCode: price.currencyCode,\n delete: false as boolean,\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customPriceFields)),\n });\n if (this.customPriceFields.length) {\n this.setCustomFieldFormValues(this.customPriceFields, priceForm.get(['customFields']), price);\n }\n this.pricesForm.push(priceForm);\n }\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get('customFields'),\n variant,\n variantTranslation,\n );\n }\n }\n\n /**\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\n * can then be persisted to the API.\n */\n private getUpdatedVariant(\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\n variantFormGroup: typeof this.detailForm,\n languageCode: LanguageCode,\n ): UpdateProductVariantInput | CreateProductVariantInput {\n const updatedProduct = createUpdatedTranslatable({\n translatable: variant,\n updatedFields: variantFormGroup.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: variant.name || '',\n },\n });\n return {\n ...updatedProduct,\n assetIds: this.assetChanges.assets?.map(a => a.id),\n featuredAssetId: this.assetChanges.featuredAsset?.id,\n facetValueIds: variantFormGroup.controls.facetValueIds.dirty\n ? variantFormGroup.value.facetValueIds\n : undefined,\n taxCategoryId: variantFormGroup.controls.taxCategoryId.dirty\n ? variantFormGroup.value.taxCategoryId\n : undefined,\n } as UpdateProductVariantInput | CreateProductVariantInput;\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left [grow]=\"true\">\n <div class=\"flex center\">\n <ng-container *ngIf=\"availableLanguages$ | async as availableLanguages\">\n <vdr-language-selector\n *ngIf=\"availableLanguages.length > 1\"\n class=\"mr-2\"\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </ng-container>\n <vdr-product-variant-quick-jump [productId]=\"entity?.product.id\" />\n </div>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"product-variant-detail\"></vdr-action-bar-items>\n <button\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n (detailForm.invalid ||\n stockLevelsForm.invalid ||\n pricesForm.invalid ||\n (detailForm.pristine && stockLevelsForm.pristine && pricesForm.pristine)) &&\n !assetsChanged()\n \"\n >\n {{ 'common.update' | translate }}\n </button>\n <vdr-action-bar-dropdown-menu locationId=\"product-variant-detail\"></vdr-action-bar-dropdown-menu>\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as variant\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar\n ><vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\">\n <input\n type=\"checkbox\"\n clrToggle\n name=\"enabled\"\n [formControl]=\"detailForm.get(['enabled'])\"\n />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <vdr-card *ngIf=\"variant.options.length\" [title]=\"'catalog.product-options' | translate\">\n <div class=\"options\">\n <vdr-chip\n *ngFor=\"let option of variant.options | sort : 'groupId'\"\n [colorFrom]=\"optionGroupCode(option.groupId)\"\n [invert]=\"true\"\n >\n <span>{{ optionGroupCode(option.groupId) }}:</span>\n {{ optionName(option) }}\n </vdr-chip>\n </div>\n <div>\n <a\n [routerLink]=\"['../../', 'options']\"\n class=\"button-small mt-2\"\n *vdrIfPermissions=\"updatePermissions\"\n >\n <clr-icon shape=\"pencil\"></clr-icon>\n {{ 'catalog.edit-options' | translate }}\n </a>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'catalog.facets' | translate\">\n <div class=\"facets\">\n <vdr-facet-value-chip\n *ngFor=\"let facetValue of facetValues$ | async\"\n [facetValue]=\"facetValue\"\n [removable]=\"updatePermissions | hasPermission\"\n (remove)=\"removeFacetValue(facetValue.id)\"\n ></vdr-facet-value-chip>\n </div>\n <div>\n <button\n class=\"button-small mt-2\"\n *vdrIfPermissions=\"updatePermissions\"\n (click)=\"selectFacetValue()\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-facets' | translate }}\n </button>\n </div>\n </vdr-card>\n\n <vdr-card>\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n\n <vdr-page-block>\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.sku' | translate\" for=\"sku\">\n <input\n id=\"sku\"\n type=\"text\"\n formControlName=\"sku\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"ProductVariant\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-card>\n <vdr-custom-detail-component-host\n locationId=\"product-variant-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n />\n <vdr-card [title]=\"'catalog.assets' | translate\">\n <vdr-assets\n [assets]=\"assetChanges.assets || variant.assets\"\n [featuredAsset]=\"assetChanges.featuredAsset || variant.featuredAsset\"\n [updatePermissions]=\"updatePermissions\"\n (change)=\"assetChanges = $event\"\n />\n </vdr-card>\n <vdr-card [title]=\"'catalog.price-and-tax' | translate\">\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'catalog.tax-category' | translate\" for=\"taxCategory\">\n <select name=\"taxCategory\" formControlName=\"taxCategoryId\">\n <option\n *ngFor=\"let taxCategory of taxCategories$ | async\"\n [value]=\"taxCategory.id\"\n >\n {{ taxCategory.name }}\n </option>\n </select>\n </vdr-form-field>\n </div>\n <div class=\"form-grid prices\" *ngFor=\"let price of pricesForm.controls\" [formGroup]=\"price\">\n <vdr-form-field\n [label]=\"\n ('catalog.price' | translate) +\n (1 < pricesForm.length ? ' (' + price.value.currencyCode + ')' : '')\n \"\n [tooltip]=\"\n 1 < pricesForm.length && price.value.currencyCode === channelDefaultCurrencyCode\n ? ('catalog.default-currency' | translate)\n : undefined\n \"\n for=\"price\"\n >\n <div class=\"price-wrapper\" [class.pending-deletion]=\"price.value.delete === true\">\n <vdr-currency-input\n name=\"price\"\n [currencyCode]=\"price.value.currencyCode\"\n [readonly]=\"\n !(updatePermissions | hasPermission) || price.value.delete === true\n \"\n formControlName=\"price\"\n />\n <div *ngIf=\"1 < pricesForm.controls.length\">\n <button\n class=\"button-small delete-button\"\n [disabled]=\"price.value.currencyCode === channelDefaultCurrencyCode\"\n (click)=\"toggleDeletePrice(price.get('delete'))\"\n >\n <clr-icon shape=\"trash\"></clr-icon>\n </button>\n </div>\n </div>\n </vdr-form-field>\n <vdr-variant-price-detail\n [price]=\"price.value.price\"\n [currencyCode]=\"price.value.currencyCode\"\n [priceIncludesTax]=\"channelPriceIncludesTax$ | async\"\n [taxCategoryId]=\"detailForm.get('taxCategoryId')!.value\"\n />\n\n <div class=\"form-grid-span\" *ngIf=\"customPriceFields.length\">\n <div class=\"title-row\">\n <span class=\"title\">{{ 'common.custom-fields' | translate }}</span>\n </div>\n <vdr-tabbed-custom-fields\n entityName=\"ProductVariantPrice\"\n [customFields]=\"customPriceFields\"\n [customFieldsFormGroup]=\"price.get(['customFields'])\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </div>\n </div>\n\n <vdr-variant-price-strategy-detail\n [channelPriceIncludesTax]=\"channelPriceIncludesTax$ | async\"\n [channelDefaultCurrencyCode]=\"channelDefaultCurrencyCode\"\n [variant]=\"variant\"\n />\n\n <ng-container *ngIf=\"unusedCurrencyCodes$ | async as unusedCurrencyCodes\">\n <div *ngIf=\"unusedCurrencyCodes.length\">\n <vdr-dropdown>\n <button class=\"button mt-2\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-price-in-another-currency' | translate }}\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu>\n <button\n vdrDropdownItem\n *ngFor=\"let currencyCode of unusedCurrencyCodes\"\n (click)=\"addPriceInCurrency(currencyCode)\"\n >\n {{ currencyCode | localeCurrencyName }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </ng-container>\n </vdr-card>\n <vdr-card [title]=\"'catalog.stock-levels' | translate\">\n <div class=\"form-grid\">\n <vdr-form-field\n for=\"track-inventory\"\n [label]=\"'catalog.track-inventory' | translate\"\n [tooltip]=\"'catalog.track-inventory-tooltip' | translate\"\n >\n <select\n name=\"track-inventory\"\n formControlName=\"trackInventory\"\n [disabled]=\"!(updatePermissions | hasPermission)\"\n >\n <option [value]=\"GlobalFlag.TRUE\">\n {{ 'catalog.track-inventory-true' | translate }}\n </option>\n <option [value]=\"GlobalFlag.FALSE\">\n {{ 'catalog.track-inventory-false' | translate }}\n </option>\n <option [value]=\"GlobalFlag.INHERIT\">\n {{ 'catalog.track-inventory-inherit' | translate }}\n </option>\n </select>\n </vdr-form-field>\n\n <vdr-form-item\n [label]=\"'catalog.out-of-stock-threshold' | translate\"\n [tooltip]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\n >\n <input\n type=\"number\"\n formControlName=\"outOfStockThreshold\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n [vdrDisabled]=\"\n detailForm.get('useGlobalOutOfStockThreshold')?.value !== false ||\n inventoryIsNotTracked(detailForm)\n \"\n />\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n name=\"useGlobalOutOfStockThreshold\"\n formControlName=\"useGlobalOutOfStockThreshold\"\n [vdrDisabled]=\"\n !(updatePermissions | hasPermission) || inventoryIsNotTracked(detailForm)\n \"\n />\n <label\n >{{ 'catalog.use-global-value' | translate }} ({{\n globalOutOfStockThreshold\n }})</label\n >\n </clr-toggle-wrapper>\n </vdr-form-item>\n </div>\n <div\n class=\"form-grid stock-levels\"\n *ngFor=\"let stockLevel of stockLevelsForm.controls\"\n [formGroup]=\"stockLevel\"\n >\n <vdr-form-field\n [label]=\"\n stockLevel.get('stockLocationName')?.value +\n ': ' +\n ('catalog.stock-on-hand' | translate)\n \"\n [for]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\n >\n <input\n [id]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\n type=\"number\"\n formControlName=\"stockOnHand\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-item\n [label]=\"\n stockLevel.get('stockLocationName')?.value +\n ': ' +\n ('catalog.stock-allocated' | translate)\n \"\n >\n {{ stockLevel.get('stockAllocated')?.value }}\n </vdr-form-item>\n </div>\n <ng-container *ngIf=\"unusedStockLocation$ | async as unusedStockLocations\">\n <div *ngIf=\"unusedStockLocations.length\">\n <vdr-dropdown>\n <button class=\"button mt-2\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-stock-location' | translate }}\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu>\n <button\n vdrDropdownItem\n *ngFor=\"let stockLocation of unusedStockLocations\"\n (click)=\"addStockLocation(stockLocation)\"\n >\n <clr-icon shape=\"map-marker\"></clr-icon> {{ stockLocation.name }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </ng-container>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { DataService } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-variant-price-detail',\n templateUrl: './variant-price-detail.component.html',\n styleUrls: ['./variant-price-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class VariantPriceDetailComponent implements OnInit, OnChanges {\n @Input() priceIncludesTax: boolean;\n @Input() price: number;\n @Input() currencyCode: string;\n @Input() taxCategoryId: string;\n\n grossPrice$: Observable<number>;\n taxRate$: Observable<number>;\n\n private priceChange$ = new BehaviorSubject<number>(0);\n private taxCategoryIdChange$ = new BehaviorSubject<string>('');\n\n constructor(private dataService: DataService) {}\n\n ngOnInit() {\n const taxRates$ = this.dataService.settings\n .getTaxRatesSimple(999, 0, 'cache-first')\n .mapStream(data => data.taxRates.items);\n const activeChannel$ = this.dataService.settings\n .getActiveChannel('cache-first')\n .refetchOnChannelChange()\n .mapStream(data => data.activeChannel);\n\n this.taxRate$ = combineLatest(activeChannel$, taxRates$, this.taxCategoryIdChange$).pipe(\n map(([channel, taxRates, taxCategoryId]) => {\n const defaultTaxZone = channel.defaultTaxZone;\n if (!defaultTaxZone) {\n return 0;\n }\n const applicableRate = taxRates.find(\n taxRate => taxRate.zone.id === defaultTaxZone.id && taxRate.category.id === taxCategoryId,\n );\n\n if (!applicableRate) {\n return 0;\n }\n return applicableRate.value;\n }),\n );\n\n this.grossPrice$ = combineLatest(this.taxRate$, this.priceChange$).pipe(\n map(([taxRate, price]) => Math.round(price * ((100 + taxRate) / 100))),\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ('price' in changes) {\n this.priceChange$.next(changes.price.currentValue);\n }\n if ('taxCategoryId' in changes) {\n this.taxCategoryIdChange$.next(changes.taxCategoryId.currentValue);\n }\n }\n}\n", "<label class=\"clr-control-label\">{{ 'catalog.taxes' | translate }}</label>\n<div *ngIf=\"priceIncludesTax\" class=\"value\">\n {{ 'catalog.price-includes-tax-at' | translate: { rate: taxRate$ | async } }}\n</div>\n<div *ngIf=\"!priceIncludesTax\" class=\"value\">\n {{\n 'catalog.price-with-tax-in-default-zone'\n | translate: { price: grossPrice$ | async | localeCurrency: currencyCode, rate: taxRate$ | async }\n }}\n</div>\n", "import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport {\n CurrencyCode,\n ProductVariantDetailQueryProductVariantFragmentFragment,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-variant-price-strategy-detail',\n templateUrl: './variant-price-strategy-detail.component.html',\n styleUrls: ['./variant-price-strategy-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class VariantPriceStrategyDetailComponent {\n @Input() channelPriceIncludesTax: boolean;\n @Input() variant: ProductVariantDetailQueryProductVariantFragmentFragment;\n @Input() channelDefaultCurrencyCode: CurrencyCode;\n\n calculatedPriceDiffersFromInputPrice(): boolean {\n const defaultPrice =\n this.variant.prices.find(p => p.currencyCode === this.channelDefaultCurrencyCode) ??\n this.variant.prices[0];\n if (!defaultPrice) {\n return false;\n }\n if (this.channelPriceIncludesTax) {\n return this.variant.priceWithTax !== defaultPrice.price;\n } else {\n return this.variant.price !== defaultPrice.price;\n }\n }\n}\n", "<div *ngIf=\"calculatedPriceDiffersFromInputPrice()\" class=\"price-strategy-detail\">\n <vdr-form-item\n [label]=\"'catalog.calculated-price' | translate\"\n [tooltip]=\"'catalog.calculated-price-tooltip' | translate\"\n for=\"price\"\n >\n </vdr-form-item>\n <div class=\"form-grid mt-2\">\n <vdr-form-item [label]=\"'common.price' | translate\">\n {{ variant.price | localeCurrency : variant.currencyCode }}\n </vdr-form-item>\n <vdr-form-item [label]=\"'common.price-with-tax' | translate\">\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\n </vdr-form-item>\n </div>\n</div>\n", "import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n DataService,\n GetProductVariantsQuickJumpDocument,\n GetProductVariantsQuickJumpQuery,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\nimport { Observable } from 'rxjs';\n\nconst GET_PRODUCT_VARIANTS_QUICK_JUMP = gql`\n query GetProductVariantsQuickJump($id: ID!) {\n product(id: $id) {\n id\n variants {\n id\n name\n sku\n }\n }\n }\n`;\n\n@Component({\n selector: 'vdr-product-variant-quick-jump',\n templateUrl: './product-variant-quick-jump.component.html',\n styleUrls: ['./product-variant-quick-jump.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductVariantQuickJumpComponent implements OnInit {\n @Input() productId: string;\n selectedVariantId: string | undefined;\n variants$: Observable<NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants']>;\n constructor(\n private dataService: DataService,\n private router: Router,\n ) {}\n\n ngOnInit() {\n this.variants$ = this.dataService\n .query(GetProductVariantsQuickJumpDocument, {\n id: this.productId,\n })\n .mapStream(data => data.product?.variants ?? []);\n }\n\n searchFn = (\n term: string,\n item: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number],\n ) =>\n item.name.toLowerCase().includes(term.toLowerCase()) ||\n item.sku.toLowerCase().includes(term.toLowerCase());\n\n onSelect(item?: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number]) {\n if (item) {\n this.router\n .navigate(['catalog', 'products', this.productId, 'variants', item.id])\n .then(() => (this.selectedVariantId = undefined));\n }\n }\n}\n", "<ng-select\n *ngIf=\"(variants$ | async)?.length > 1\"\n [items]=\"variants$ | async\"\n appendTo=\"body\"\n bindValue=\"id\"\n [(ngModel)]=\"selectedVariantId\"\n [searchFn]=\"searchFn\"\n [clearable]=\"false\"\n [placeholder]=\"'catalog.quick-jump-placeholder' | translate\"\n (change)=\"onSelect($event)\"\n>\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\n {{ item.name }} ({{ item.sku }})\n </ng-template>\n</ng-select>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkRemoveFromChannelAction,\n DataService,\n DeletionResult,\n GetProductVariantListQuery,\n isMultiChannel,\n ItemOf,\n ModalService,\n NotificationService,\n Permission,\n ProductVariant,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { BulkAddFacetValuesDialogComponent } from '../bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\nimport { ProductVariantListComponent } from './product-variant-list.component';\n\nexport const assignProductVariantsToChannelBulkAction: BulkAction<\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\n ProductVariantListComponent\n> = {\n location: 'product-variant-list',\n label: _('common.assign-to-channel'),\n icon: 'layers',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\n onClick: ({ injector, selection, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productVariantIds: unique(selection.map(p => p.id)),\n currentChannelIds: [],\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n }\n });\n },\n};\n\nexport const removeProductVariantsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetProductVariantListQuery, 'productVariants'>\n>({\n location: 'product-variant-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, ids, channelId) =>\n dataService.product\n .removeVariantsFromChannel({\n channelId: channelId,\n productVariantIds: ids,\n })\n .pipe(map(res => res.removeProductVariantsFromChannel)),\n});\n\nexport const deleteProductVariantsBulkAction: BulkAction<ProductVariant, ProductVariantListComponent> = {\n location: 'product-variant-list',\n label: _('common.delete'),\n icon: 'trash',\n iconClass: 'is-danger',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteProduct) ||\n userPermissions.includes(Permission.DeleteCatalog),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n modalService\n .dialog({\n title: _('common.confirm-bulk-delete'),\n translationVars: {\n count: selection.length,\n },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response =>\n response\n ? dataService.product.deleteProductVariants(unique(selection.map(p => p.id)))\n : EMPTY,\n ),\n )\n .subscribe(result => {\n let deleted = 0;\n const errors: string[] = [];\n for (const item of result.deleteProductVariants) {\n if (item.result === DeletionResult.DELETED) {\n deleted++;\n } else if (item.message) {\n errors.push(item.message);\n }\n }\n if (0 < deleted) {\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\n count: deleted,\n });\n }\n if (0 < errors.length) {\n notificationService.error(errors.join('\\n'));\n }\n hostComponent.refresh();\n clearSelection();\n });\n },\n};\n\nexport const assignFacetValuesToProductVariantsBulkAction: BulkAction<\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\n ProductVariantListComponent\n> = {\n location: 'product-variant-list',\n label: _('catalog.edit-facet-values'),\n icon: 'tag',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n onClick: ({ injector, selection, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const notificationService = injector.get(NotificationService);\n const mode = 'variant';\n const ids = unique(selection.map(p => p.id));\n return modalService\n .fromComponent(BulkAddFacetValuesDialogComponent, {\n size: 'xl',\n locals: {\n mode,\n ids,\n },\n })\n .subscribe(result => {\n if (result) {\n notificationService.success(_('common.notify-bulk-update-success'), {\n count: selection.length,\n entity: mode === 'variant' ? 'Products' : 'ProductVariants',\n });\n clearSelection();\n }\n });\n },\n};\n", "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { UntypedFormArray, UntypedFormGroup } from '@angular/forms';\nimport { Asset, Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\n\ninterface SelectedAssets {\n assets?: Asset[];\n featuredAsset?: Asset;\n}\n\ninterface PaginationConfig {\n totalItems: number;\n currentPage: number;\n itemsPerPage: number;\n}\n\n@Component({\n selector: 'vdr-product-variants-table',\n templateUrl: './product-variants-table.component.html',\n styleUrls: ['./product-variants-table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductVariantsTableComponent implements OnInit, OnDestroy {\n @Input('productVariantsFormArray') formArray: UntypedFormArray;\n @Input() variants: ProductVariantFragment[];\n @Input() paginationConfig: PaginationConfig;\n @Input() channelPriceIncludesTax: boolean;\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\n formGroupMap = new Map<string, UntypedFormGroup>();\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n private subscription: Subscription;\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n\n ngOnInit() {\n this.subscription = this.formArray.valueChanges\n .pipe(\n map(value => value.length),\n debounceTime(1),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n this.buildFormGroupMap();\n });\n\n this.buildFormGroupMap();\n }\n\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n trackByFn(index: number, item: any) {\n if ((item as any).id != null) {\n return (item as any).id;\n } else {\n return index;\n }\n }\n\n getFeaturedAsset(variant: ProductVariantFragment) {\n return this.pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset;\n }\n\n optionGroupName(optionGroupId: string): string | undefined {\n const group = this.optionGroups.find(g => g.id === optionGroupId);\n return group && group.name;\n }\n\n private buildFormGroupMap() {\n this.formGroupMap.clear();\n for (const controlGroup of this.formArray.controls) {\n this.formGroupMap.set(controlGroup.value.id, controlGroup as UntypedFormGroup);\n }\n this.changeDetector.markForCheck();\n }\n}\n", "<table class=\"table\">\n <thead>\n <tr>\n <th></th>\n <th>{{ 'common.name' | translate }}</th>\n <th>{{ 'catalog.sku' | translate }}</th>\n <ng-container *ngFor=\"let optionGroup of optionGroups | sort: 'id'\">\n <th>{{ optionGroup.name }}</th>\n </ng-container>\n <th>{{ 'catalog.price' | translate }}</th>\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\n <th>{{ 'common.enabled' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let variant of variants | paginate: paginationConfig; index as i; trackBy: trackByFn\">\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <div class=\"card-img\">\n <div class=\"featured-asset\">\n <img\n *ngIf=\"getFeaturedAsset(variant) as featuredAsset; else placeholder\"\n [src]=\"featuredAsset | assetPreview: 'tiny'\"\n />\n <ng-template #placeholder>\n <div class=\"placeholder\">\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\n </div>\n </ng-template>\n </div>\n </div>\n </td>\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <input\n clrInput\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n [placeholder]=\"'common.name' | translate\"\n />\n </clr-input-container>\n </td>\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <input\n clrInput\n type=\"text\"\n formControlName=\"sku\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n [placeholder]=\"'catalog.sku' | translate\"\n />\n </clr-input-container>\n </td>\n <ng-container *ngFor=\"let option of variant.options | sort: 'groupId'\">\n <td\n class=\"left align-middle\"\n [class.disabled]=\"!formGroup.get('enabled')!.value\"\n [style.color]=\"optionGroupName(option.groupId) | stringToColor\"\n >\n {{ option.name }}\n </td>\n </ng-container>\n <td class=\"left align-middle price\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <vdr-currency-input\n *ngIf=\"!channelPriceIncludesTax\"\n clrInput\n [currencyCode]=\"variant.currencyCode\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"price\"\n ></vdr-currency-input>\n <vdr-currency-input\n *ngIf=\"channelPriceIncludesTax\"\n clrInput\n [currencyCode]=\"variant.currencyCode\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"priceWithTax\"\n ></vdr-currency-input>\n </clr-input-container>\n </td>\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <input\n clrInput\n type=\"number\"\n min=\"0\"\n step=\"1\"\n formControlName=\"stockOnHand\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </clr-input-container>\n </td>\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n name=\"enabled\"\n formControlName=\"enabled\"\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n />\n </clr-toggle-wrapper>\n </td>\n </ng-container>\n </tr>\n </tbody>\n</table>\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport {\n CustomFieldConfig,\n LanguageCode,\n ProductVariantFragment,\n UpdateProductOptionInput,\n createUpdatedTranslatable,\n Dialog,\n} from '@vendure/admin-ui/core';\n\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\n\n@Component({\n selector: 'vdr-update-product-option-dialog',\n templateUrl: './update-product-option-dialog.component.html',\n styleUrls: ['./update-product-option-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class UpdateProductOptionDialogComponent\n implements Dialog<UpdateProductOptionInput & { autoUpdate: boolean }>, OnInit\n{\n resolveWith: (result?: UpdateProductOptionInput & { autoUpdate: boolean }) => void;\n updateVariantName = true;\n // Provided by caller\n productOption: ProductVariantFragment['options'][number];\n activeLanguage: LanguageCode;\n name: string;\n code: string;\n customFields: CustomFieldConfig[];\n codeInputTouched = false;\n customFieldsForm: UntypedFormGroup;\n\n ngOnInit(): void {\n const currentTranslation = this.productOption.translations.find(\n t => t.languageCode === this.activeLanguage,\n );\n this.name = currentTranslation?.name ?? '';\n this.code = this.productOption.code;\n this.customFieldsForm = new UntypedFormGroup({});\n if (this.customFields) {\n const cfCurrentTranslation =\n (currentTranslation && (currentTranslation as any).customFields) || {};\n\n for (const fieldDef of this.customFields) {\n const key = fieldDef.name;\n const value =\n fieldDef.type === 'localeString'\n ? cfCurrentTranslation[key]\n : (this.productOption as any).customFields[key];\n this.customFieldsForm.addControl(fieldDef.name, new UntypedFormControl(value));\n }\n }\n }\n\n update() {\n const result = createUpdatedTranslatable({\n translatable: this.productOption,\n languageCode: this.activeLanguage,\n updatedFields: {\n code: this.code,\n name: this.name,\n customFields: this.customFieldsForm.value,\n },\n customFieldConfig: this.customFields,\n defaultTranslation: {\n languageCode: this.activeLanguage,\n name: '',\n },\n });\n this.resolveWith({ ...result, autoUpdate: this.updateVariantName });\n }\n\n cancel() {\n this.resolveWith();\n }\n\n updateCode(nameValue: string) {\n if (!this.codeInputTouched && !this.productOption.code) {\n this.code = normalizeString(nameValue, '-');\n }\n }\n}\n", "<ng-template vdrDialogTitle>{{ 'catalog.update-product-option' | translate }}</ng-template>\n<vdr-form-field [label]=\"'catalog.option-name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n #nameInput=\"ngModel\"\n [(ngModel)]=\"name\"\n required\n (input)=\"updateCode($event.target.value)\"\n />\n</vdr-form-field>\n<vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\n <input id=\"code\" type=\"text\" #codeInput=\"ngModel\" required [(ngModel)]=\"code\" pattern=\"[a-z0-9_-]+\" />\n</vdr-form-field>\n<clr-checkbox-wrapper>\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"updateVariantName\" />\n <label>{{ 'catalog.auto-update-option-variant-name' | translate }}</label>\n</clr-checkbox-wrapper>\n<section *ngIf=\"customFields.length\">\n <label>{{ 'common.custom-fields' | translate }}</label>\n <vdr-tabbed-custom-fields\n entityName=\"ProductOption\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"customFieldsForm\"\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n</section>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button\n type=\"submit\"\n (click)=\"update()\"\n [disabled]=\"\n nameInput.invalid ||\n codeInput.invalid ||\n (nameInput.pristine && codeInput.pristine && customFieldsForm.pristine)\n \"\n class=\"btn btn-primary\"\n >\n {{ 'catalog.update-product-option' | translate }}\n </button>\n</ng-template>\n", "import { gql } from 'apollo-angular';\n\nconst PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT = gql`\n fragment ProductListQueryProductFragment on Product {\n id\n createdAt\n updatedAt\n enabled\n languageCode\n name\n slug\n featuredAsset {\n id\n createdAt\n updatedAt\n preview\n focalPoint {\n x\n y\n }\n }\n variantList {\n totalItems\n }\n }\n`;\n\nexport const PRODUCT_LIST_QUERY = gql`\n query ProductListQuery($options: ProductListOptions) {\n products(options: $options) {\n items {\n ...ProductListQueryProductFragment\n }\n totalItems\n }\n }\n ${PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT}\n`;\n", "import {\n ASSET_FRAGMENT,\n PRODUCT_OPTION_FRAGMENT,\n PRODUCT_VARIANT_PRICE_FRAGMENT,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nexport const PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\n fragment ProductVariantDetailQueryProductVariantFragment on ProductVariant {\n id\n createdAt\n updatedAt\n enabled\n languageCode\n name\n price\n currencyCode\n prices {\n ...ProductVariantPrice\n }\n priceWithTax\n stockOnHand\n stockAllocated\n trackInventory\n outOfStockThreshold\n useGlobalOutOfStockThreshold\n taxRateApplied {\n id\n name\n value\n }\n taxCategory {\n id\n name\n }\n sku\n options {\n ...ProductOption\n }\n stockLevels {\n id\n createdAt\n updatedAt\n stockOnHand\n stockAllocated\n stockLocationId\n stockLocation {\n id\n createdAt\n updatedAt\n name\n }\n }\n facetValues {\n id\n code\n name\n facet {\n id\n name\n }\n }\n featuredAsset {\n ...Asset\n }\n assets {\n ...Asset\n }\n translations {\n id\n languageCode\n name\n }\n channels {\n id\n code\n }\n product {\n id\n name\n optionGroups {\n id\n name\n code\n translations {\n id\n languageCode\n name\n }\n }\n }\n }\n ${PRODUCT_VARIANT_PRICE_FRAGMENT}\n`;\n\nexport const PRODUCT_VARIANT_DETAIL_QUERY = gql`\n query GetProductVariantDetail($id: ID!) {\n productVariant(id: $id) {\n ...ProductVariantDetailQueryProductVariantFragment\n }\n stockLocations(options: { take: 100 }) {\n items {\n id\n createdAt\n updatedAt\n name\n description\n }\n }\n taxCategories(options: { take: 100 }) {\n items {\n id\n createdAt\n updatedAt\n name\n isDefault\n }\n totalItems\n }\n activeChannel {\n id\n availableCurrencyCodes\n defaultCurrencyCode\n }\n }\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\n`;\n\nexport const PRODUCT_VARIANT_UPDATE_MUTATION = gql`\n mutation ProductVariantUpdateMutation($input: [UpdateProductVariantInput!]!) {\n updateProductVariants(input: $input) {\n ...ProductVariantDetailQueryProductVariantFragment\n }\n }\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\n`;\n", "import { ASSET_FRAGMENT } from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nconst PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\n fragment ProductVariantListQueryProductVariantFragment on ProductVariant {\n id\n createdAt\n updatedAt\n productId\n enabled\n languageCode\n name\n price\n currencyCode\n priceWithTax\n trackInventory\n outOfStockThreshold\n stockLevels {\n id\n createdAt\n updatedAt\n stockLocationId\n stockOnHand\n stockAllocated\n stockLocation {\n id\n createdAt\n updatedAt\n name\n }\n }\n useGlobalOutOfStockThreshold\n sku\n featuredAsset {\n ...Asset\n }\n }\n\n ${ASSET_FRAGMENT}\n`;\n\nexport const PRODUCT_VARIANT_LIST_QUERY = gql`\n query ProductVariantListQuery($options: ProductVariantListOptions!) {\n productVariants(options: $options) {\n items {\n ...ProductVariantListQueryProductVariantFragment\n }\n totalItems\n }\n }\n ${PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT}\n`;\n"],
4
+ "sourcesContent": ["/* eslint-disable */\nexport type Maybe<T> = T;\nexport type InputMaybe<T> = T;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: { input: string | number; output: string | number; }\n String: { input: string; output: string; }\n Boolean: { input: boolean; output: boolean; }\n Int: { input: number; output: number; }\n Float: { input: number; output: number; }\n DateTime: { input: any; output: any; }\n JSON: { input: any; output: any; }\n Money: { input: number; output: number; }\n Upload: { input: any; output: any; }\n};\n\nexport type AddFulfillmentToOrderResult = CreateFulfillmentError | EmptyOrderLineSelectionError | Fulfillment | FulfillmentStateTransitionError | InsufficientStockOnHandError | InvalidFulfillmentHandlerError | ItemsAlreadyFulfilledError;\n\nexport type AddItemInput = {\n productVariantId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type AddItemToDraftOrderInput = {\n productVariantId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type AddManualPaymentToOrderResult = ManualPaymentStateError | Order;\n\nexport type AddNoteToCustomerInput = {\n id: Scalars['ID']['input'];\n isPublic: Scalars['Boolean']['input'];\n note: Scalars['String']['input'];\n};\n\nexport type AddNoteToOrderInput = {\n id: Scalars['ID']['input'];\n isPublic: Scalars['Boolean']['input'];\n note: Scalars['String']['input'];\n};\n\nexport type Address = Node & {\n __typename?: 'Address';\n city?: Maybe<Scalars['String']['output']>;\n company?: Maybe<Scalars['String']['output']>;\n country: Country;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n defaultBillingAddress?: Maybe<Scalars['Boolean']['output']>;\n defaultShippingAddress?: Maybe<Scalars['Boolean']['output']>;\n fullName?: Maybe<Scalars['String']['output']>;\n id: Scalars['ID']['output'];\n phoneNumber?: Maybe<Scalars['String']['output']>;\n postalCode?: Maybe<Scalars['String']['output']>;\n province?: Maybe<Scalars['String']['output']>;\n streetLine1: Scalars['String']['output'];\n streetLine2?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type AdjustDraftOrderLineInput = {\n orderLineId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type Adjustment = {\n __typename?: 'Adjustment';\n adjustmentSource: Scalars['String']['output'];\n amount: Scalars['Money']['output'];\n data?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n type: AdjustmentType;\n};\n\nexport enum AdjustmentType {\n DISTRIBUTED_ORDER_PROMOTION = 'DISTRIBUTED_ORDER_PROMOTION',\n OTHER = 'OTHER',\n PROMOTION = 'PROMOTION'\n}\n\nexport type Administrator = Node & {\n __typename?: 'Administrator';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n emailAddress: Scalars['String']['output'];\n firstName: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n lastName: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n user: User;\n};\n\nexport type AdministratorFilterParameter = {\n _and?: InputMaybe<Array<AdministratorFilterParameter>>;\n _or?: InputMaybe<Array<AdministratorFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n emailAddress?: InputMaybe<StringOperators>;\n firstName?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n lastName?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type AdministratorList = PaginatedList & {\n __typename?: 'AdministratorList';\n items: Array<Administrator>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type AdministratorListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<AdministratorFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<AdministratorSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type AdministratorPaymentInput = {\n metadata?: InputMaybe<Scalars['JSON']['input']>;\n paymentMethod?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type AdministratorRefundInput = {\n /**\n * The amount to be refunded to this particular Payment. This was introduced in\n * v2.2.0 as the preferred way to specify the refund amount. The `lines`, `shipping` and `adjustment`\n * fields will be removed in a future version.\n */\n amount?: InputMaybe<Scalars['Money']['input']>;\n paymentId: Scalars['ID']['input'];\n reason?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type AdministratorSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n emailAddress?: InputMaybe<SortOrder>;\n firstName?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n lastName?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type Allocation = Node & StockMovement & {\n __typename?: 'Allocation';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n orderLine: OrderLine;\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned if an attempting to refund an OrderItem which has already been refunded */\nexport type AlreadyRefundedError = ErrorResult & {\n __typename?: 'AlreadyRefundedError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n refundId: Scalars['ID']['output'];\n};\n\nexport type ApplyCouponCodeResult = CouponCodeExpiredError | CouponCodeInvalidError | CouponCodeLimitError | Order;\n\nexport type Asset = Node & {\n __typename?: 'Asset';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n fileSize: Scalars['Int']['output'];\n focalPoint?: Maybe<Coordinate>;\n height: Scalars['Int']['output'];\n id: Scalars['ID']['output'];\n mimeType: Scalars['String']['output'];\n name: Scalars['String']['output'];\n preview: Scalars['String']['output'];\n source: Scalars['String']['output'];\n tags: Array<Tag>;\n type: AssetType;\n updatedAt: Scalars['DateTime']['output'];\n width: Scalars['Int']['output'];\n};\n\nexport type AssetFilterParameter = {\n _and?: InputMaybe<Array<AssetFilterParameter>>;\n _or?: InputMaybe<Array<AssetFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n fileSize?: InputMaybe<NumberOperators>;\n height?: InputMaybe<NumberOperators>;\n id?: InputMaybe<IdOperators>;\n mimeType?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n preview?: InputMaybe<StringOperators>;\n source?: InputMaybe<StringOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n width?: InputMaybe<NumberOperators>;\n};\n\nexport type AssetList = PaginatedList & {\n __typename?: 'AssetList';\n items: Array<Asset>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type AssetListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<AssetFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<AssetSortParameter>;\n tags?: InputMaybe<Array<Scalars['String']['input']>>;\n tagsOperator?: InputMaybe<LogicalOperator>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type AssetSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n fileSize?: InputMaybe<SortOrder>;\n height?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n mimeType?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n preview?: InputMaybe<SortOrder>;\n source?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n width?: InputMaybe<SortOrder>;\n};\n\nexport enum AssetType {\n BINARY = 'BINARY',\n IMAGE = 'IMAGE',\n VIDEO = 'VIDEO'\n}\n\nexport type AssignAssetsToChannelInput = {\n assetIds: Array<Scalars['ID']['input']>;\n channelId: Scalars['ID']['input'];\n};\n\nexport type AssignCollectionsToChannelInput = {\n channelId: Scalars['ID']['input'];\n collectionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignFacetsToChannelInput = {\n channelId: Scalars['ID']['input'];\n facetIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignPaymentMethodsToChannelInput = {\n channelId: Scalars['ID']['input'];\n paymentMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignProductVariantsToChannelInput = {\n channelId: Scalars['ID']['input'];\n priceFactor?: InputMaybe<Scalars['Float']['input']>;\n productVariantIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignProductsToChannelInput = {\n channelId: Scalars['ID']['input'];\n priceFactor?: InputMaybe<Scalars['Float']['input']>;\n productIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignPromotionsToChannelInput = {\n channelId: Scalars['ID']['input'];\n promotionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignShippingMethodsToChannelInput = {\n channelId: Scalars['ID']['input'];\n shippingMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AssignStockLocationsToChannelInput = {\n channelId: Scalars['ID']['input'];\n stockLocationIds: Array<Scalars['ID']['input']>;\n};\n\nexport type AuthenticationInput = {\n native?: InputMaybe<NativeAuthInput>;\n};\n\nexport type AuthenticationMethod = Node & {\n __typename?: 'AuthenticationMethod';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n strategy: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type AuthenticationResult = CurrentUser | InvalidCredentialsError;\n\nexport type BooleanCustomFieldConfig = CustomField & {\n __typename?: 'BooleanCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/** Operators for filtering on a list of Boolean fields */\nexport type BooleanListOperators = {\n inList: Scalars['Boolean']['input'];\n};\n\n/** Operators for filtering on a Boolean field */\nexport type BooleanOperators = {\n eq?: InputMaybe<Scalars['Boolean']['input']>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type BooleanStructFieldConfig = StructField & {\n __typename?: 'BooleanStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/** Returned if an attempting to cancel lines from an Order which is still active */\nexport type CancelActiveOrderError = ErrorResult & {\n __typename?: 'CancelActiveOrderError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n orderState: Scalars['String']['output'];\n};\n\nexport type CancelOrderInput = {\n /** Specify whether the shipping charges should also be cancelled. Defaults to false */\n cancelShipping?: InputMaybe<Scalars['Boolean']['input']>;\n /** Optionally specify which OrderLines to cancel. If not provided, all OrderLines will be cancelled */\n lines?: InputMaybe<Array<OrderLineInput>>;\n /** The id of the order to be cancelled */\n orderId: Scalars['ID']['input'];\n reason?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type CancelOrderResult = CancelActiveOrderError | EmptyOrderLineSelectionError | MultipleOrderError | Order | OrderStateTransitionError | QuantityTooGreatError;\n\n/** Returned if the Payment cancellation fails */\nexport type CancelPaymentError = ErrorResult & {\n __typename?: 'CancelPaymentError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n paymentErrorMessage: Scalars['String']['output'];\n};\n\nexport type CancelPaymentResult = CancelPaymentError | Payment | PaymentStateTransitionError;\n\nexport type Cancellation = Node & StockMovement & {\n __typename?: 'Cancellation';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n orderLine: OrderLine;\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type Channel = Node & {\n __typename?: 'Channel';\n availableCurrencyCodes: Array<CurrencyCode>;\n availableLanguageCodes?: Maybe<Array<LanguageCode>>;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n /** @deprecated Use defaultCurrencyCode instead */\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n defaultCurrencyCode: CurrencyCode;\n defaultLanguageCode: LanguageCode;\n defaultShippingZone?: Maybe<Zone>;\n defaultTaxZone?: Maybe<Zone>;\n id: Scalars['ID']['output'];\n /** Not yet used - will be implemented in a future release. */\n outOfStockThreshold?: Maybe<Scalars['Int']['output']>;\n pricesIncludeTax: Scalars['Boolean']['output'];\n seller?: Maybe<Seller>;\n token: Scalars['String']['output'];\n /** Not yet used - will be implemented in a future release. */\n trackInventory?: Maybe<Scalars['Boolean']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/**\n * Returned when the default LanguageCode of a Channel is no longer found in the `availableLanguages`\n * of the GlobalSettings\n */\nexport type ChannelDefaultLanguageError = ErrorResult & {\n __typename?: 'ChannelDefaultLanguageError';\n channelCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n language: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type ChannelFilterParameter = {\n _and?: InputMaybe<Array<ChannelFilterParameter>>;\n _or?: InputMaybe<Array<ChannelFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n currencyCode?: InputMaybe<StringOperators>;\n defaultCurrencyCode?: InputMaybe<StringOperators>;\n defaultLanguageCode?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n outOfStockThreshold?: InputMaybe<NumberOperators>;\n pricesIncludeTax?: InputMaybe<BooleanOperators>;\n token?: InputMaybe<StringOperators>;\n trackInventory?: InputMaybe<BooleanOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ChannelList = PaginatedList & {\n __typename?: 'ChannelList';\n items: Array<Channel>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ChannelListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ChannelFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ChannelSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ChannelSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n outOfStockThreshold?: InputMaybe<SortOrder>;\n token?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type Collection = Node & {\n __typename?: 'Collection';\n assets: Array<Asset>;\n breadcrumbs: Array<CollectionBreadcrumb>;\n children?: Maybe<Array<Collection>>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n featuredAsset?: Maybe<Asset>;\n filters: Array<ConfigurableOperation>;\n id: Scalars['ID']['output'];\n inheritFilters: Scalars['Boolean']['output'];\n isPrivate: Scalars['Boolean']['output'];\n languageCode?: Maybe<LanguageCode>;\n name: Scalars['String']['output'];\n parent?: Maybe<Collection>;\n parentId: Scalars['ID']['output'];\n position: Scalars['Int']['output'];\n productVariants: ProductVariantList;\n slug: Scalars['String']['output'];\n translations: Array<CollectionTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n\nexport type CollectionProductVariantsArgs = {\n options?: InputMaybe<ProductVariantListOptions>;\n};\n\nexport type CollectionBreadcrumb = {\n __typename?: 'CollectionBreadcrumb';\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n};\n\nexport type CollectionFilterParameter = {\n _and?: InputMaybe<Array<CollectionFilterParameter>>;\n _or?: InputMaybe<Array<CollectionFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n inheritFilters?: InputMaybe<BooleanOperators>;\n isPrivate?: InputMaybe<BooleanOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n parentId?: InputMaybe<IdOperators>;\n position?: InputMaybe<NumberOperators>;\n slug?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CollectionList = PaginatedList & {\n __typename?: 'CollectionList';\n items: Array<Collection>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CollectionListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CollectionFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CollectionSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n topLevelOnly?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\n/**\n * Which Collections are present in the products returned\n * by the search, and in what quantity.\n */\nexport type CollectionResult = {\n __typename?: 'CollectionResult';\n collection: Collection;\n count: Scalars['Int']['output'];\n};\n\nexport type CollectionSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n parentId?: InputMaybe<SortOrder>;\n position?: InputMaybe<SortOrder>;\n slug?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type CollectionTranslation = {\n __typename?: 'CollectionTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ConfigArg = {\n __typename?: 'ConfigArg';\n name: Scalars['String']['output'];\n value: Scalars['String']['output'];\n};\n\nexport type ConfigArgDefinition = {\n __typename?: 'ConfigArgDefinition';\n defaultValue?: Maybe<Scalars['JSON']['output']>;\n description?: Maybe<Scalars['String']['output']>;\n label?: Maybe<Scalars['String']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n required: Scalars['Boolean']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type ConfigArgInput = {\n name: Scalars['String']['input'];\n /** A JSON stringified representation of the actual value */\n value: Scalars['String']['input'];\n};\n\nexport type ConfigurableOperation = {\n __typename?: 'ConfigurableOperation';\n args: Array<ConfigArg>;\n code: Scalars['String']['output'];\n};\n\nexport type ConfigurableOperationDefinition = {\n __typename?: 'ConfigurableOperationDefinition';\n args: Array<ConfigArgDefinition>;\n code: Scalars['String']['output'];\n description: Scalars['String']['output'];\n};\n\nexport type ConfigurableOperationInput = {\n arguments: Array<ConfigArgInput>;\n code: Scalars['String']['input'];\n};\n\nexport type Coordinate = {\n __typename?: 'Coordinate';\n x: Scalars['Float']['output'];\n y: Scalars['Float']['output'];\n};\n\nexport type CoordinateInput = {\n x: Scalars['Float']['input'];\n y: Scalars['Float']['input'];\n};\n\n/**\n * A Country of the world which your shop operates in.\n *\n * The `code` field is typically a 2-character ISO code such as \"GB\", \"US\", \"DE\" etc. This code is used in certain inputs such as\n * `UpdateAddressInput` and `CreateAddressInput` to specify the country.\n */\nexport type Country = Node & Region & {\n __typename?: 'Country';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n parent?: Maybe<Region>;\n parentId?: Maybe<Scalars['ID']['output']>;\n translations: Array<RegionTranslation>;\n type: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type CountryFilterParameter = {\n _and?: InputMaybe<Array<CountryFilterParameter>>;\n _or?: InputMaybe<Array<CountryFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n parentId?: InputMaybe<IdOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CountryList = PaginatedList & {\n __typename?: 'CountryList';\n items: Array<Country>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CountryListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CountryFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CountrySortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CountrySortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n parentId?: InputMaybe<SortOrder>;\n type?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type CountryTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** Returned if the provided coupon code is invalid */\nexport type CouponCodeExpiredError = ErrorResult & {\n __typename?: 'CouponCodeExpiredError';\n couponCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the provided coupon code is invalid */\nexport type CouponCodeInvalidError = ErrorResult & {\n __typename?: 'CouponCodeInvalidError';\n couponCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the provided coupon code is invalid */\nexport type CouponCodeLimitError = ErrorResult & {\n __typename?: 'CouponCodeLimitError';\n couponCode: Scalars['String']['output'];\n errorCode: ErrorCode;\n limit: Scalars['Int']['output'];\n message: Scalars['String']['output'];\n};\n\n/**\n * Input used to create an Address.\n *\n * The countryCode must correspond to a `code` property of a Country that has been defined in the\n * Vendure server. The `code` property is typically a 2-character ISO code such as \"GB\", \"US\", \"DE\" etc.\n * If an invalid code is passed, the mutation will fail.\n */\nexport type CreateAddressInput = {\n city?: InputMaybe<Scalars['String']['input']>;\n company?: InputMaybe<Scalars['String']['input']>;\n countryCode: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultBillingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n defaultShippingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n fullName?: InputMaybe<Scalars['String']['input']>;\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n postalCode?: InputMaybe<Scalars['String']['input']>;\n province?: InputMaybe<Scalars['String']['input']>;\n streetLine1: Scalars['String']['input'];\n streetLine2?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type CreateAdministratorInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress: Scalars['String']['input'];\n firstName: Scalars['String']['input'];\n lastName: Scalars['String']['input'];\n password: Scalars['String']['input'];\n roleIds: Array<Scalars['ID']['input']>;\n};\n\nexport type CreateAssetInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n file: Scalars['Upload']['input'];\n tags?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type CreateAssetResult = Asset | MimeTypeError;\n\nexport type CreateChannelInput = {\n availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;\n availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;\n code: Scalars['String']['input'];\n /** @deprecated Use defaultCurrencyCode instead */\n currencyCode?: InputMaybe<CurrencyCode>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultCurrencyCode?: InputMaybe<CurrencyCode>;\n defaultLanguageCode: LanguageCode;\n defaultShippingZoneId: Scalars['ID']['input'];\n defaultTaxZoneId: Scalars['ID']['input'];\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n pricesIncludeTax: Scalars['Boolean']['input'];\n sellerId?: InputMaybe<Scalars['ID']['input']>;\n token: Scalars['String']['input'];\n trackInventory?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type CreateChannelResult = Channel | LanguageNotAvailableError;\n\nexport type CreateCollectionInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n filters: Array<ConfigurableOperationInput>;\n inheritFilters?: InputMaybe<Scalars['Boolean']['input']>;\n isPrivate?: InputMaybe<Scalars['Boolean']['input']>;\n parentId?: InputMaybe<Scalars['ID']['input']>;\n translations: Array<CreateCollectionTranslationInput>;\n};\n\nexport type CreateCollectionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description: Scalars['String']['input'];\n languageCode: LanguageCode;\n name: Scalars['String']['input'];\n slug: Scalars['String']['input'];\n};\n\nexport type CreateCountryInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n translations: Array<CountryTranslationInput>;\n};\n\nexport type CreateCustomerGroupInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n customerIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateCustomerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress: Scalars['String']['input'];\n firstName: Scalars['String']['input'];\n lastName: Scalars['String']['input'];\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n title?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type CreateCustomerResult = Customer | EmailAddressConflictError;\n\nexport type CreateFacetInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n isPrivate: Scalars['Boolean']['input'];\n translations: Array<FacetTranslationInput>;\n values?: InputMaybe<Array<CreateFacetValueWithFacetInput>>;\n};\n\nexport type CreateFacetValueInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n facetId: Scalars['ID']['input'];\n translations: Array<FacetValueTranslationInput>;\n};\n\nexport type CreateFacetValueWithFacetInput = {\n code: Scalars['String']['input'];\n translations: Array<FacetValueTranslationInput>;\n};\n\n/** Returned if an error is thrown in a FulfillmentHandler's createFulfillment method */\nexport type CreateFulfillmentError = ErrorResult & {\n __typename?: 'CreateFulfillmentError';\n errorCode: ErrorCode;\n fulfillmentHandlerError: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type CreateGroupOptionInput = {\n code: Scalars['String']['input'];\n translations: Array<ProductOptionGroupTranslationInput>;\n};\n\nexport type CreatePaymentMethodInput = {\n checker?: InputMaybe<ConfigurableOperationInput>;\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n handler: ConfigurableOperationInput;\n translations: Array<PaymentMethodTranslationInput>;\n};\n\nexport type CreateProductInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n translations: Array<ProductTranslationInput>;\n};\n\nexport type CreateProductOptionGroupInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n options: Array<CreateGroupOptionInput>;\n translations: Array<ProductOptionGroupTranslationInput>;\n};\n\nexport type CreateProductOptionInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n productOptionGroupId: Scalars['ID']['input'];\n translations: Array<ProductOptionGroupTranslationInput>;\n};\n\nexport type CreateProductVariantInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n optionIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n price?: InputMaybe<Scalars['Money']['input']>;\n prices?: InputMaybe<Array<InputMaybe<CreateProductVariantPriceInput>>>;\n productId: Scalars['ID']['input'];\n sku: Scalars['String']['input'];\n stockLevels?: InputMaybe<Array<StockLevelInput>>;\n stockOnHand?: InputMaybe<Scalars['Int']['input']>;\n taxCategoryId?: InputMaybe<Scalars['ID']['input']>;\n trackInventory?: InputMaybe<GlobalFlag>;\n translations: Array<ProductVariantTranslationInput>;\n useGlobalOutOfStockThreshold?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type CreateProductVariantOptionInput = {\n code: Scalars['String']['input'];\n optionGroupId: Scalars['ID']['input'];\n translations: Array<ProductOptionTranslationInput>;\n};\n\nexport type CreateProductVariantPriceInput = {\n currencyCode: CurrencyCode;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n price: Scalars['Money']['input'];\n};\n\nexport type CreatePromotionInput = {\n actions: Array<ConfigurableOperationInput>;\n conditions: Array<ConfigurableOperationInput>;\n couponCode?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n endsAt?: InputMaybe<Scalars['DateTime']['input']>;\n perCustomerUsageLimit?: InputMaybe<Scalars['Int']['input']>;\n startsAt?: InputMaybe<Scalars['DateTime']['input']>;\n translations: Array<PromotionTranslationInput>;\n usageLimit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CreatePromotionResult = MissingConditionsError | Promotion;\n\nexport type CreateProvinceInput = {\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled: Scalars['Boolean']['input'];\n translations: Array<ProvinceTranslationInput>;\n};\n\nexport type CreateRoleInput = {\n channelIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n code: Scalars['String']['input'];\n description: Scalars['String']['input'];\n permissions: Array<Permission>;\n};\n\nexport type CreateSellerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateShippingMethodInput = {\n calculator: ConfigurableOperationInput;\n checker: ConfigurableOperationInput;\n code: Scalars['String']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n fulfillmentHandler: Scalars['String']['input'];\n translations: Array<ShippingMethodTranslationInput>;\n};\n\nexport type CreateStockLocationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateTagInput = {\n value: Scalars['String']['input'];\n};\n\nexport type CreateTaxCategoryInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n isDefault?: InputMaybe<Scalars['Boolean']['input']>;\n name: Scalars['String']['input'];\n};\n\nexport type CreateTaxRateInput = {\n categoryId: Scalars['ID']['input'];\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n customerGroupId?: InputMaybe<Scalars['ID']['input']>;\n enabled: Scalars['Boolean']['input'];\n name: Scalars['String']['input'];\n value: Scalars['Float']['input'];\n zoneId: Scalars['ID']['input'];\n};\n\nexport type CreateZoneInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n memberIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n name: Scalars['String']['input'];\n};\n\n/**\n * @description\n * ISO 4217 currency code\n *\n * @docsCategory common\n */\nexport enum CurrencyCode {\n /** United Arab Emirates dirham */\n AED = 'AED',\n /** Afghan afghani */\n AFN = 'AFN',\n /** Albanian lek */\n ALL = 'ALL',\n /** Armenian dram */\n AMD = 'AMD',\n /** Netherlands Antillean guilder */\n ANG = 'ANG',\n /** Angolan kwanza */\n AOA = 'AOA',\n /** Argentine peso */\n ARS = 'ARS',\n /** Australian dollar */\n AUD = 'AUD',\n /** Aruban florin */\n AWG = 'AWG',\n /** Azerbaijani manat */\n AZN = 'AZN',\n /** Bosnia and Herzegovina convertible mark */\n BAM = 'BAM',\n /** Barbados dollar */\n BBD = 'BBD',\n /** Bangladeshi taka */\n BDT = 'BDT',\n /** Bulgarian lev */\n BGN = 'BGN',\n /** Bahraini dinar */\n BHD = 'BHD',\n /** Burundian franc */\n BIF = 'BIF',\n /** Bermudian dollar */\n BMD = 'BMD',\n /** Brunei dollar */\n BND = 'BND',\n /** Boliviano */\n BOB = 'BOB',\n /** Brazilian real */\n BRL = 'BRL',\n /** Bahamian dollar */\n BSD = 'BSD',\n /** Bhutanese ngultrum */\n BTN = 'BTN',\n /** Botswana pula */\n BWP = 'BWP',\n /** Belarusian ruble */\n BYN = 'BYN',\n /** Belize dollar */\n BZD = 'BZD',\n /** Canadian dollar */\n CAD = 'CAD',\n /** Congolese franc */\n CDF = 'CDF',\n /** Swiss franc */\n CHF = 'CHF',\n /** Chilean peso */\n CLP = 'CLP',\n /** Renminbi (Chinese) yuan */\n CNY = 'CNY',\n /** Colombian peso */\n COP = 'COP',\n /** Costa Rican colon */\n CRC = 'CRC',\n /** Cuban convertible peso */\n CUC = 'CUC',\n /** Cuban peso */\n CUP = 'CUP',\n /** Cape Verde escudo */\n CVE = 'CVE',\n /** Czech koruna */\n CZK = 'CZK',\n /** Djiboutian franc */\n DJF = 'DJF',\n /** Danish krone */\n DKK = 'DKK',\n /** Dominican peso */\n DOP = 'DOP',\n /** Algerian dinar */\n DZD = 'DZD',\n /** Egyptian pound */\n EGP = 'EGP',\n /** Eritrean nakfa */\n ERN = 'ERN',\n /** Ethiopian birr */\n ETB = 'ETB',\n /** Euro */\n EUR = 'EUR',\n /** Fiji dollar */\n FJD = 'FJD',\n /** Falkland Islands pound */\n FKP = 'FKP',\n /** Pound sterling */\n GBP = 'GBP',\n /** Georgian lari */\n GEL = 'GEL',\n /** Ghanaian cedi */\n GHS = 'GHS',\n /** Gibraltar pound */\n GIP = 'GIP',\n /** Gambian dalasi */\n GMD = 'GMD',\n /** Guinean franc */\n GNF = 'GNF',\n /** Guatemalan quetzal */\n GTQ = 'GTQ',\n /** Guyanese dollar */\n GYD = 'GYD',\n /** Hong Kong dollar */\n HKD = 'HKD',\n /** Honduran lempira */\n HNL = 'HNL',\n /** Croatian kuna */\n HRK = 'HRK',\n /** Haitian gourde */\n HTG = 'HTG',\n /** Hungarian forint */\n HUF = 'HUF',\n /** Indonesian rupiah */\n IDR = 'IDR',\n /** Israeli new shekel */\n ILS = 'ILS',\n /** Indian rupee */\n INR = 'INR',\n /** Iraqi dinar */\n IQD = 'IQD',\n /** Iranian rial */\n IRR = 'IRR',\n /** Icelandic kr\u00F3na */\n ISK = 'ISK',\n /** Jamaican dollar */\n JMD = 'JMD',\n /** Jordanian dinar */\n JOD = 'JOD',\n /** Japanese yen */\n JPY = 'JPY',\n /** Kenyan shilling */\n KES = 'KES',\n /** Kyrgyzstani som */\n KGS = 'KGS',\n /** Cambodian riel */\n KHR = 'KHR',\n /** Comoro franc */\n KMF = 'KMF',\n /** North Korean won */\n KPW = 'KPW',\n /** South Korean won */\n KRW = 'KRW',\n /** Kuwaiti dinar */\n KWD = 'KWD',\n /** Cayman Islands dollar */\n KYD = 'KYD',\n /** Kazakhstani tenge */\n KZT = 'KZT',\n /** Lao kip */\n LAK = 'LAK',\n /** Lebanese pound */\n LBP = 'LBP',\n /** Sri Lankan rupee */\n LKR = 'LKR',\n /** Liberian dollar */\n LRD = 'LRD',\n /** Lesotho loti */\n LSL = 'LSL',\n /** Libyan dinar */\n LYD = 'LYD',\n /** Moroccan dirham */\n MAD = 'MAD',\n /** Moldovan leu */\n MDL = 'MDL',\n /** Malagasy ariary */\n MGA = 'MGA',\n /** Macedonian denar */\n MKD = 'MKD',\n /** Myanmar kyat */\n MMK = 'MMK',\n /** Mongolian t\u00F6gr\u00F6g */\n MNT = 'MNT',\n /** Macanese pataca */\n MOP = 'MOP',\n /** Mauritanian ouguiya */\n MRU = 'MRU',\n /** Mauritian rupee */\n MUR = 'MUR',\n /** Maldivian rufiyaa */\n MVR = 'MVR',\n /** Malawian kwacha */\n MWK = 'MWK',\n /** Mexican peso */\n MXN = 'MXN',\n /** Malaysian ringgit */\n MYR = 'MYR',\n /** Mozambican metical */\n MZN = 'MZN',\n /** Namibian dollar */\n NAD = 'NAD',\n /** Nigerian naira */\n NGN = 'NGN',\n /** Nicaraguan c\u00F3rdoba */\n NIO = 'NIO',\n /** Norwegian krone */\n NOK = 'NOK',\n /** Nepalese rupee */\n NPR = 'NPR',\n /** New Zealand dollar */\n NZD = 'NZD',\n /** Omani rial */\n OMR = 'OMR',\n /** Panamanian balboa */\n PAB = 'PAB',\n /** Peruvian sol */\n PEN = 'PEN',\n /** Papua New Guinean kina */\n PGK = 'PGK',\n /** Philippine peso */\n PHP = 'PHP',\n /** Pakistani rupee */\n PKR = 'PKR',\n /** Polish z\u0142oty */\n PLN = 'PLN',\n /** Paraguayan guaran\u00ED */\n PYG = 'PYG',\n /** Qatari riyal */\n QAR = 'QAR',\n /** Romanian leu */\n RON = 'RON',\n /** Serbian dinar */\n RSD = 'RSD',\n /** Russian ruble */\n RUB = 'RUB',\n /** Rwandan franc */\n RWF = 'RWF',\n /** Saudi riyal */\n SAR = 'SAR',\n /** Solomon Islands dollar */\n SBD = 'SBD',\n /** Seychelles rupee */\n SCR = 'SCR',\n /** Sudanese pound */\n SDG = 'SDG',\n /** Swedish krona/kronor */\n SEK = 'SEK',\n /** Singapore dollar */\n SGD = 'SGD',\n /** Saint Helena pound */\n SHP = 'SHP',\n /** Sierra Leonean leone */\n SLL = 'SLL',\n /** Somali shilling */\n SOS = 'SOS',\n /** Surinamese dollar */\n SRD = 'SRD',\n /** South Sudanese pound */\n SSP = 'SSP',\n /** S\u00E3o Tom\u00E9 and Pr\u00EDncipe dobra */\n STN = 'STN',\n /** Salvadoran col\u00F3n */\n SVC = 'SVC',\n /** Syrian pound */\n SYP = 'SYP',\n /** Swazi lilangeni */\n SZL = 'SZL',\n /** Thai baht */\n THB = 'THB',\n /** Tajikistani somoni */\n TJS = 'TJS',\n /** Turkmenistan manat */\n TMT = 'TMT',\n /** Tunisian dinar */\n TND = 'TND',\n /** Tongan pa\u02BBanga */\n TOP = 'TOP',\n /** Turkish lira */\n TRY = 'TRY',\n /** Trinidad and Tobago dollar */\n TTD = 'TTD',\n /** New Taiwan dollar */\n TWD = 'TWD',\n /** Tanzanian shilling */\n TZS = 'TZS',\n /** Ukrainian hryvnia */\n UAH = 'UAH',\n /** Ugandan shilling */\n UGX = 'UGX',\n /** United States dollar */\n USD = 'USD',\n /** Uruguayan peso */\n UYU = 'UYU',\n /** Uzbekistan som */\n UZS = 'UZS',\n /** Venezuelan bol\u00EDvar soberano */\n VES = 'VES',\n /** Vietnamese \u0111\u1ED3ng */\n VND = 'VND',\n /** Vanuatu vatu */\n VUV = 'VUV',\n /** Samoan tala */\n WST = 'WST',\n /** CFA franc BEAC */\n XAF = 'XAF',\n /** East Caribbean dollar */\n XCD = 'XCD',\n /** CFA franc BCEAO */\n XOF = 'XOF',\n /** CFP franc (franc Pacifique) */\n XPF = 'XPF',\n /** Yemeni rial */\n YER = 'YER',\n /** South African rand */\n ZAR = 'ZAR',\n /** Zambian kwacha */\n ZMW = 'ZMW',\n /** Zimbabwean dollar */\n ZWL = 'ZWL'\n}\n\nexport type CurrentUser = {\n __typename?: 'CurrentUser';\n channels: Array<CurrentUserChannel>;\n id: Scalars['ID']['output'];\n identifier: Scalars['String']['output'];\n};\n\nexport type CurrentUserChannel = {\n __typename?: 'CurrentUserChannel';\n code: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n permissions: Array<Permission>;\n token: Scalars['String']['output'];\n};\n\nexport type CustomField = {\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type CustomFieldConfig = BooleanCustomFieldConfig | DateTimeCustomFieldConfig | FloatCustomFieldConfig | IntCustomFieldConfig | LocaleStringCustomFieldConfig | LocaleTextCustomFieldConfig | RelationCustomFieldConfig | StringCustomFieldConfig | StructCustomFieldConfig | TextCustomFieldConfig;\n\n/**\n * This type is deprecated in v2.2 in favor of the EntityCustomFields type,\n * which allows custom fields to be defined on user-supplied entities.\n */\nexport type CustomFields = {\n __typename?: 'CustomFields';\n Address: Array<CustomFieldConfig>;\n Administrator: Array<CustomFieldConfig>;\n Asset: Array<CustomFieldConfig>;\n Channel: Array<CustomFieldConfig>;\n Collection: Array<CustomFieldConfig>;\n Customer: Array<CustomFieldConfig>;\n CustomerGroup: Array<CustomFieldConfig>;\n Facet: Array<CustomFieldConfig>;\n FacetValue: Array<CustomFieldConfig>;\n Fulfillment: Array<CustomFieldConfig>;\n GlobalSettings: Array<CustomFieldConfig>;\n HistoryEntry: Array<CustomFieldConfig>;\n Order: Array<CustomFieldConfig>;\n OrderLine: Array<CustomFieldConfig>;\n Payment: Array<CustomFieldConfig>;\n PaymentMethod: Array<CustomFieldConfig>;\n Product: Array<CustomFieldConfig>;\n ProductOption: Array<CustomFieldConfig>;\n ProductOptionGroup: Array<CustomFieldConfig>;\n ProductVariant: Array<CustomFieldConfig>;\n ProductVariantPrice: Array<CustomFieldConfig>;\n Promotion: Array<CustomFieldConfig>;\n Refund: Array<CustomFieldConfig>;\n Region: Array<CustomFieldConfig>;\n Seller: Array<CustomFieldConfig>;\n Session: Array<CustomFieldConfig>;\n ShippingLine: Array<CustomFieldConfig>;\n ShippingMethod: Array<CustomFieldConfig>;\n StockLevel: Array<CustomFieldConfig>;\n StockLocation: Array<CustomFieldConfig>;\n StockMovement: Array<CustomFieldConfig>;\n TaxCategory: Array<CustomFieldConfig>;\n TaxRate: Array<CustomFieldConfig>;\n User: Array<CustomFieldConfig>;\n Zone: Array<CustomFieldConfig>;\n};\n\nexport type Customer = Node & {\n __typename?: 'Customer';\n addresses?: Maybe<Array<Address>>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n emailAddress: Scalars['String']['output'];\n firstName: Scalars['String']['output'];\n groups: Array<CustomerGroup>;\n history: HistoryEntryList;\n id: Scalars['ID']['output'];\n lastName: Scalars['String']['output'];\n orders: OrderList;\n phoneNumber?: Maybe<Scalars['String']['output']>;\n title?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n user?: Maybe<User>;\n};\n\n\nexport type CustomerHistoryArgs = {\n options?: InputMaybe<HistoryEntryListOptions>;\n};\n\n\nexport type CustomerOrdersArgs = {\n options?: InputMaybe<OrderListOptions>;\n};\n\nexport type CustomerFilterParameter = {\n _and?: InputMaybe<Array<CustomerFilterParameter>>;\n _or?: InputMaybe<Array<CustomerFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n emailAddress?: InputMaybe<StringOperators>;\n firstName?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n lastName?: InputMaybe<StringOperators>;\n phoneNumber?: InputMaybe<StringOperators>;\n postalCode?: InputMaybe<StringOperators>;\n title?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CustomerGroup = Node & {\n __typename?: 'CustomerGroup';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n customers: CustomerList;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\n\nexport type CustomerGroupCustomersArgs = {\n options?: InputMaybe<CustomerListOptions>;\n};\n\nexport type CustomerGroupFilterParameter = {\n _and?: InputMaybe<Array<CustomerGroupFilterParameter>>;\n _or?: InputMaybe<Array<CustomerGroupFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type CustomerGroupList = PaginatedList & {\n __typename?: 'CustomerGroupList';\n items: Array<CustomerGroup>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CustomerGroupListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CustomerGroupFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CustomerGroupSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CustomerGroupSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type CustomerList = PaginatedList & {\n __typename?: 'CustomerList';\n items: Array<Customer>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type CustomerListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<CustomerFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<CustomerSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type CustomerSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n emailAddress?: InputMaybe<SortOrder>;\n firstName?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n lastName?: InputMaybe<SortOrder>;\n phoneNumber?: InputMaybe<SortOrder>;\n title?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\n/** Operators for filtering on a list of Date fields */\nexport type DateListOperators = {\n inList: Scalars['DateTime']['input'];\n};\n\n/** Operators for filtering on a DateTime field */\nexport type DateOperators = {\n after?: InputMaybe<Scalars['DateTime']['input']>;\n before?: InputMaybe<Scalars['DateTime']['input']>;\n between?: InputMaybe<DateRange>;\n eq?: InputMaybe<Scalars['DateTime']['input']>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type DateRange = {\n end: Scalars['DateTime']['input'];\n start: Scalars['DateTime']['input'];\n};\n\n/**\n * Expects the same validation formats as the `<input type=\"datetime-local\">` HTML element.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes\n */\nexport type DateTimeCustomFieldConfig = CustomField & {\n __typename?: 'DateTimeCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['String']['output']>;\n min?: Maybe<Scalars['String']['output']>;\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/**\n * Expects the same validation formats as the `<input type=\"datetime-local\">` HTML element.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes\n */\nexport type DateTimeStructFieldConfig = StructField & {\n __typename?: 'DateTimeStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['String']['output']>;\n min?: Maybe<Scalars['String']['output']>;\n name: Scalars['String']['output'];\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type DeleteAssetInput = {\n assetId: Scalars['ID']['input'];\n deleteFromAllChannels?: InputMaybe<Scalars['Boolean']['input']>;\n force?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type DeleteAssetsInput = {\n assetIds: Array<Scalars['ID']['input']>;\n deleteFromAllChannels?: InputMaybe<Scalars['Boolean']['input']>;\n force?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type DeleteStockLocationInput = {\n id: Scalars['ID']['input'];\n transferToLocationId?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type DeletionResponse = {\n __typename?: 'DeletionResponse';\n message?: Maybe<Scalars['String']['output']>;\n result: DeletionResult;\n};\n\nexport enum DeletionResult {\n /** The entity was successfully deleted */\n DELETED = 'DELETED',\n /** Deletion did not take place, reason given in message */\n NOT_DELETED = 'NOT_DELETED'\n}\n\nexport type Discount = {\n __typename?: 'Discount';\n adjustmentSource: Scalars['String']['output'];\n amount: Scalars['Money']['output'];\n amountWithTax: Scalars['Money']['output'];\n description: Scalars['String']['output'];\n type: AdjustmentType;\n};\n\nexport type DuplicateEntityError = ErrorResult & {\n __typename?: 'DuplicateEntityError';\n duplicationError: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type DuplicateEntityInput = {\n duplicatorInput: ConfigurableOperationInput;\n entityId: Scalars['ID']['input'];\n entityName: Scalars['String']['input'];\n};\n\nexport type DuplicateEntityResult = DuplicateEntityError | DuplicateEntitySuccess;\n\nexport type DuplicateEntitySuccess = {\n __typename?: 'DuplicateEntitySuccess';\n newEntityId: Scalars['ID']['output'];\n};\n\n/** Returned when attempting to create a Customer with an email address already registered to an existing User. */\nexport type EmailAddressConflictError = ErrorResult & {\n __typename?: 'EmailAddressConflictError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if no OrderLines have been specified for the operation */\nexport type EmptyOrderLineSelectionError = ErrorResult & {\n __typename?: 'EmptyOrderLineSelectionError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type EntityCustomFields = {\n __typename?: 'EntityCustomFields';\n customFields: Array<CustomFieldConfig>;\n entityName: Scalars['String']['output'];\n};\n\nexport type EntityDuplicatorDefinition = {\n __typename?: 'EntityDuplicatorDefinition';\n args: Array<ConfigArgDefinition>;\n code: Scalars['String']['output'];\n description: Scalars['String']['output'];\n forEntities: Array<Scalars['String']['output']>;\n requiresPermission: Array<Permission>;\n};\n\nexport enum ErrorCode {\n ALREADY_REFUNDED_ERROR = 'ALREADY_REFUNDED_ERROR',\n CANCEL_ACTIVE_ORDER_ERROR = 'CANCEL_ACTIVE_ORDER_ERROR',\n CANCEL_PAYMENT_ERROR = 'CANCEL_PAYMENT_ERROR',\n CHANNEL_DEFAULT_LANGUAGE_ERROR = 'CHANNEL_DEFAULT_LANGUAGE_ERROR',\n COUPON_CODE_EXPIRED_ERROR = 'COUPON_CODE_EXPIRED_ERROR',\n COUPON_CODE_INVALID_ERROR = 'COUPON_CODE_INVALID_ERROR',\n COUPON_CODE_LIMIT_ERROR = 'COUPON_CODE_LIMIT_ERROR',\n CREATE_FULFILLMENT_ERROR = 'CREATE_FULFILLMENT_ERROR',\n DUPLICATE_ENTITY_ERROR = 'DUPLICATE_ENTITY_ERROR',\n EMAIL_ADDRESS_CONFLICT_ERROR = 'EMAIL_ADDRESS_CONFLICT_ERROR',\n EMPTY_ORDER_LINE_SELECTION_ERROR = 'EMPTY_ORDER_LINE_SELECTION_ERROR',\n FACET_IN_USE_ERROR = 'FACET_IN_USE_ERROR',\n FULFILLMENT_STATE_TRANSITION_ERROR = 'FULFILLMENT_STATE_TRANSITION_ERROR',\n GUEST_CHECKOUT_ERROR = 'GUEST_CHECKOUT_ERROR',\n INELIGIBLE_SHIPPING_METHOD_ERROR = 'INELIGIBLE_SHIPPING_METHOD_ERROR',\n INSUFFICIENT_STOCK_ERROR = 'INSUFFICIENT_STOCK_ERROR',\n INSUFFICIENT_STOCK_ON_HAND_ERROR = 'INSUFFICIENT_STOCK_ON_HAND_ERROR',\n INVALID_CREDENTIALS_ERROR = 'INVALID_CREDENTIALS_ERROR',\n INVALID_FULFILLMENT_HANDLER_ERROR = 'INVALID_FULFILLMENT_HANDLER_ERROR',\n ITEMS_ALREADY_FULFILLED_ERROR = 'ITEMS_ALREADY_FULFILLED_ERROR',\n LANGUAGE_NOT_AVAILABLE_ERROR = 'LANGUAGE_NOT_AVAILABLE_ERROR',\n MANUAL_PAYMENT_STATE_ERROR = 'MANUAL_PAYMENT_STATE_ERROR',\n MIME_TYPE_ERROR = 'MIME_TYPE_ERROR',\n MISSING_CONDITIONS_ERROR = 'MISSING_CONDITIONS_ERROR',\n MULTIPLE_ORDER_ERROR = 'MULTIPLE_ORDER_ERROR',\n NATIVE_AUTH_STRATEGY_ERROR = 'NATIVE_AUTH_STRATEGY_ERROR',\n NEGATIVE_QUANTITY_ERROR = 'NEGATIVE_QUANTITY_ERROR',\n NOTHING_TO_REFUND_ERROR = 'NOTHING_TO_REFUND_ERROR',\n NO_ACTIVE_ORDER_ERROR = 'NO_ACTIVE_ORDER_ERROR',\n NO_CHANGES_SPECIFIED_ERROR = 'NO_CHANGES_SPECIFIED_ERROR',\n ORDER_INTERCEPTOR_ERROR = 'ORDER_INTERCEPTOR_ERROR',\n ORDER_LIMIT_ERROR = 'ORDER_LIMIT_ERROR',\n ORDER_MODIFICATION_ERROR = 'ORDER_MODIFICATION_ERROR',\n ORDER_MODIFICATION_STATE_ERROR = 'ORDER_MODIFICATION_STATE_ERROR',\n ORDER_STATE_TRANSITION_ERROR = 'ORDER_STATE_TRANSITION_ERROR',\n PAYMENT_METHOD_MISSING_ERROR = 'PAYMENT_METHOD_MISSING_ERROR',\n PAYMENT_ORDER_MISMATCH_ERROR = 'PAYMENT_ORDER_MISMATCH_ERROR',\n PAYMENT_STATE_TRANSITION_ERROR = 'PAYMENT_STATE_TRANSITION_ERROR',\n PRODUCT_OPTION_IN_USE_ERROR = 'PRODUCT_OPTION_IN_USE_ERROR',\n QUANTITY_TOO_GREAT_ERROR = 'QUANTITY_TOO_GREAT_ERROR',\n REFUND_AMOUNT_ERROR = 'REFUND_AMOUNT_ERROR',\n REFUND_ORDER_STATE_ERROR = 'REFUND_ORDER_STATE_ERROR',\n REFUND_PAYMENT_ID_MISSING_ERROR = 'REFUND_PAYMENT_ID_MISSING_ERROR',\n REFUND_STATE_TRANSITION_ERROR = 'REFUND_STATE_TRANSITION_ERROR',\n SETTLE_PAYMENT_ERROR = 'SETTLE_PAYMENT_ERROR',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR'\n}\n\nexport type ErrorResult = {\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Facet = Node & {\n __typename?: 'Facet';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n isPrivate: Scalars['Boolean']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<FacetTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n /** Returns a paginated, sortable, filterable list of the Facet's values. Added in v2.1.0. */\n valueList: FacetValueList;\n values: Array<FacetValue>;\n};\n\n\nexport type FacetValueListArgs = {\n options?: InputMaybe<FacetValueListOptions>;\n};\n\nexport type FacetFilterParameter = {\n _and?: InputMaybe<Array<FacetFilterParameter>>;\n _or?: InputMaybe<Array<FacetFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n isPrivate?: InputMaybe<BooleanOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type FacetInUseError = ErrorResult & {\n __typename?: 'FacetInUseError';\n errorCode: ErrorCode;\n facetCode: Scalars['String']['output'];\n message: Scalars['String']['output'];\n productCount: Scalars['Int']['output'];\n variantCount: Scalars['Int']['output'];\n};\n\nexport type FacetList = PaginatedList & {\n __typename?: 'FacetList';\n items: Array<Facet>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type FacetListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<FacetFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<FacetSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type FacetSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type FacetTranslation = {\n __typename?: 'FacetTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type FacetTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type FacetValue = Node & {\n __typename?: 'FacetValue';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n facet: Facet;\n facetId: Scalars['ID']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<FacetValueTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/**\n * Used to construct boolean expressions for filtering search results\n * by FacetValue ID. Examples:\n *\n * * ID=1 OR ID=2: `{ facetValueFilters: [{ or: [1,2] }] }`\n * * ID=1 AND ID=2: `{ facetValueFilters: [{ and: 1 }, { and: 2 }] }`\n * * ID=1 AND (ID=2 OR ID=3): `{ facetValueFilters: [{ and: 1 }, { or: [2,3] }] }`\n */\nexport type FacetValueFilterInput = {\n and?: InputMaybe<Scalars['ID']['input']>;\n or?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type FacetValueFilterParameter = {\n _and?: InputMaybe<Array<FacetValueFilterParameter>>;\n _or?: InputMaybe<Array<FacetValueFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n facetId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type FacetValueList = PaginatedList & {\n __typename?: 'FacetValueList';\n items: Array<FacetValue>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type FacetValueListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<FacetValueFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<FacetValueSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * Which FacetValues are present in the products returned\n * by the search, and in what quantity.\n */\nexport type FacetValueResult = {\n __typename?: 'FacetValueResult';\n count: Scalars['Int']['output'];\n facetValue: FacetValue;\n};\n\nexport type FacetValueSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n facetId?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type FacetValueTranslation = {\n __typename?: 'FacetValueTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type FacetValueTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type FloatCustomFieldConfig = CustomField & {\n __typename?: 'FloatCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Float']['output']>;\n min?: Maybe<Scalars['Float']['output']>;\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n step?: Maybe<Scalars['Float']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type FloatStructFieldConfig = StructField & {\n __typename?: 'FloatStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Float']['output']>;\n min?: Maybe<Scalars['Float']['output']>;\n name: Scalars['String']['output'];\n step?: Maybe<Scalars['Float']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type FulfillOrderInput = {\n handler: ConfigurableOperationInput;\n lines: Array<OrderLineInput>;\n};\n\nexport type Fulfillment = Node & {\n __typename?: 'Fulfillment';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n lines: Array<FulfillmentLine>;\n method: Scalars['String']['output'];\n nextStates: Array<Scalars['String']['output']>;\n state: Scalars['String']['output'];\n /** @deprecated Use the `lines` field instead */\n summary: Array<FulfillmentLine>;\n trackingCode?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type FulfillmentLine = {\n __typename?: 'FulfillmentLine';\n fulfillment: Fulfillment;\n fulfillmentId: Scalars['ID']['output'];\n orderLine: OrderLine;\n orderLineId: Scalars['ID']['output'];\n quantity: Scalars['Int']['output'];\n};\n\n/** Returned when there is an error in transitioning the Fulfillment state */\nexport type FulfillmentStateTransitionError = ErrorResult & {\n __typename?: 'FulfillmentStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\nexport enum GlobalFlag {\n FALSE = 'FALSE',\n INHERIT = 'INHERIT',\n TRUE = 'TRUE'\n}\n\nexport type GlobalSettings = {\n __typename?: 'GlobalSettings';\n availableLanguages: Array<LanguageCode>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n outOfStockThreshold: Scalars['Int']['output'];\n serverConfig: ServerConfig;\n trackInventory: Scalars['Boolean']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned when attempting to set the Customer on a guest checkout when the configured GuestCheckoutStrategy does not allow it. */\nexport type GuestCheckoutError = ErrorResult & {\n __typename?: 'GuestCheckoutError';\n errorCode: ErrorCode;\n errorDetail: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type HistoryEntry = Node & {\n __typename?: 'HistoryEntry';\n administrator?: Maybe<Administrator>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n data: Scalars['JSON']['output'];\n id: Scalars['ID']['output'];\n isPublic: Scalars['Boolean']['output'];\n type: HistoryEntryType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type HistoryEntryFilterParameter = {\n _and?: InputMaybe<Array<HistoryEntryFilterParameter>>;\n _or?: InputMaybe<Array<HistoryEntryFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n isPublic?: InputMaybe<BooleanOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type HistoryEntryList = PaginatedList & {\n __typename?: 'HistoryEntryList';\n items: Array<HistoryEntry>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type HistoryEntryListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<HistoryEntryFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<HistoryEntrySortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type HistoryEntrySortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport enum HistoryEntryType {\n CUSTOMER_ADDED_TO_GROUP = 'CUSTOMER_ADDED_TO_GROUP',\n CUSTOMER_ADDRESS_CREATED = 'CUSTOMER_ADDRESS_CREATED',\n CUSTOMER_ADDRESS_DELETED = 'CUSTOMER_ADDRESS_DELETED',\n CUSTOMER_ADDRESS_UPDATED = 'CUSTOMER_ADDRESS_UPDATED',\n CUSTOMER_DETAIL_UPDATED = 'CUSTOMER_DETAIL_UPDATED',\n CUSTOMER_EMAIL_UPDATE_REQUESTED = 'CUSTOMER_EMAIL_UPDATE_REQUESTED',\n CUSTOMER_EMAIL_UPDATE_VERIFIED = 'CUSTOMER_EMAIL_UPDATE_VERIFIED',\n CUSTOMER_NOTE = 'CUSTOMER_NOTE',\n CUSTOMER_PASSWORD_RESET_REQUESTED = 'CUSTOMER_PASSWORD_RESET_REQUESTED',\n CUSTOMER_PASSWORD_RESET_VERIFIED = 'CUSTOMER_PASSWORD_RESET_VERIFIED',\n CUSTOMER_PASSWORD_UPDATED = 'CUSTOMER_PASSWORD_UPDATED',\n CUSTOMER_REGISTERED = 'CUSTOMER_REGISTERED',\n CUSTOMER_REMOVED_FROM_GROUP = 'CUSTOMER_REMOVED_FROM_GROUP',\n CUSTOMER_VERIFIED = 'CUSTOMER_VERIFIED',\n ORDER_CANCELLATION = 'ORDER_CANCELLATION',\n ORDER_COUPON_APPLIED = 'ORDER_COUPON_APPLIED',\n ORDER_COUPON_REMOVED = 'ORDER_COUPON_REMOVED',\n ORDER_CUSTOMER_UPDATED = 'ORDER_CUSTOMER_UPDATED',\n ORDER_FULFILLMENT = 'ORDER_FULFILLMENT',\n ORDER_FULFILLMENT_TRANSITION = 'ORDER_FULFILLMENT_TRANSITION',\n ORDER_MODIFIED = 'ORDER_MODIFIED',\n ORDER_NOTE = 'ORDER_NOTE',\n ORDER_PAYMENT_TRANSITION = 'ORDER_PAYMENT_TRANSITION',\n ORDER_REFUND_TRANSITION = 'ORDER_REFUND_TRANSITION',\n ORDER_STATE_TRANSITION = 'ORDER_STATE_TRANSITION'\n}\n\n/** Operators for filtering on a list of ID fields */\nexport type IdListOperators = {\n inList: Scalars['ID']['input'];\n};\n\n/** Operators for filtering on an ID field */\nexport type IdOperators = {\n eq?: InputMaybe<Scalars['String']['input']>;\n in?: InputMaybe<Array<Scalars['String']['input']>>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n notEq?: InputMaybe<Scalars['String']['input']>;\n notIn?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type ImportInfo = {\n __typename?: 'ImportInfo';\n errors?: Maybe<Array<Scalars['String']['output']>>;\n imported: Scalars['Int']['output'];\n processed: Scalars['Int']['output'];\n};\n\n/** Returned when attempting to set a ShippingMethod for which the Order is not eligible */\nexport type IneligibleShippingMethodError = ErrorResult & {\n __typename?: 'IneligibleShippingMethodError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when attempting to add more items to the Order than are available */\nexport type InsufficientStockError = ErrorResult & {\n __typename?: 'InsufficientStockError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n order: Order;\n quantityAvailable: Scalars['Int']['output'];\n};\n\n/**\n * Returned if attempting to create a Fulfillment when there is insufficient\n * stockOnHand of a ProductVariant to satisfy the requested quantity.\n */\nexport type InsufficientStockOnHandError = ErrorResult & {\n __typename?: 'InsufficientStockOnHandError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n productVariantId: Scalars['ID']['output'];\n productVariantName: Scalars['String']['output'];\n stockOnHand: Scalars['Int']['output'];\n};\n\nexport type IntCustomFieldConfig = CustomField & {\n __typename?: 'IntCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Int']['output']>;\n min?: Maybe<Scalars['Int']['output']>;\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type IntStructFieldConfig = StructField & {\n __typename?: 'IntStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n max?: Maybe<Scalars['Int']['output']>;\n min?: Maybe<Scalars['Int']['output']>;\n name: Scalars['String']['output'];\n step?: Maybe<Scalars['Int']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\n/** Returned if the user authentication credentials are not valid */\nexport type InvalidCredentialsError = ErrorResult & {\n __typename?: 'InvalidCredentialsError';\n authenticationError: Scalars['String']['output'];\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the specified FulfillmentHandler code is not valid */\nexport type InvalidFulfillmentHandlerError = ErrorResult & {\n __typename?: 'InvalidFulfillmentHandlerError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned if the specified items are already part of a Fulfillment */\nexport type ItemsAlreadyFulfilledError = ErrorResult & {\n __typename?: 'ItemsAlreadyFulfilledError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Job = Node & {\n __typename?: 'Job';\n attempts: Scalars['Int']['output'];\n createdAt: Scalars['DateTime']['output'];\n data?: Maybe<Scalars['JSON']['output']>;\n duration: Scalars['Int']['output'];\n error?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n isSettled: Scalars['Boolean']['output'];\n progress: Scalars['Float']['output'];\n queueName: Scalars['String']['output'];\n result?: Maybe<Scalars['JSON']['output']>;\n retries: Scalars['Int']['output'];\n settledAt?: Maybe<Scalars['DateTime']['output']>;\n startedAt?: Maybe<Scalars['DateTime']['output']>;\n state: JobState;\n};\n\nexport type JobBufferSize = {\n __typename?: 'JobBufferSize';\n bufferId: Scalars['String']['output'];\n size: Scalars['Int']['output'];\n};\n\nexport type JobFilterParameter = {\n _and?: InputMaybe<Array<JobFilterParameter>>;\n _or?: InputMaybe<Array<JobFilterParameter>>;\n attempts?: InputMaybe<NumberOperators>;\n createdAt?: InputMaybe<DateOperators>;\n duration?: InputMaybe<NumberOperators>;\n id?: InputMaybe<IdOperators>;\n isSettled?: InputMaybe<BooleanOperators>;\n progress?: InputMaybe<NumberOperators>;\n queueName?: InputMaybe<StringOperators>;\n retries?: InputMaybe<NumberOperators>;\n settledAt?: InputMaybe<DateOperators>;\n startedAt?: InputMaybe<DateOperators>;\n state?: InputMaybe<StringOperators>;\n};\n\nexport type JobList = PaginatedList & {\n __typename?: 'JobList';\n items: Array<Job>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type JobListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<JobFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<JobSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type JobQueue = {\n __typename?: 'JobQueue';\n name: Scalars['String']['output'];\n running: Scalars['Boolean']['output'];\n};\n\nexport type JobSortParameter = {\n attempts?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n duration?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n progress?: InputMaybe<SortOrder>;\n queueName?: InputMaybe<SortOrder>;\n retries?: InputMaybe<SortOrder>;\n settledAt?: InputMaybe<SortOrder>;\n startedAt?: InputMaybe<SortOrder>;\n};\n\n/**\n * @description\n * The state of a Job in the JobQueue\n *\n * @docsCategory common\n */\nexport enum JobState {\n CANCELLED = 'CANCELLED',\n COMPLETED = 'COMPLETED',\n FAILED = 'FAILED',\n PENDING = 'PENDING',\n RETRYING = 'RETRYING',\n RUNNING = 'RUNNING'\n}\n\n/**\n * @description\n * Languages in the form of a ISO 639-1 language code with optional\n * region or script modifier (e.g. de_AT). The selection available is based\n * on the [Unicode CLDR summary list](https://unicode-org.github.io/cldr-staging/charts/37/summary/root.html)\n * and includes the major spoken languages of the world and any widely-used variants.\n *\n * @docsCategory common\n */\nexport enum LanguageCode {\n /** Afrikaans */\n af = 'af',\n /** Akan */\n ak = 'ak',\n /** Amharic */\n am = 'am',\n /** Arabic */\n ar = 'ar',\n /** Assamese */\n as = 'as',\n /** Azerbaijani */\n az = 'az',\n /** Belarusian */\n be = 'be',\n /** Bulgarian */\n bg = 'bg',\n /** Bambara */\n bm = 'bm',\n /** Bangla */\n bn = 'bn',\n /** Tibetan */\n bo = 'bo',\n /** Breton */\n br = 'br',\n /** Bosnian */\n bs = 'bs',\n /** Catalan */\n ca = 'ca',\n /** Chechen */\n ce = 'ce',\n /** Corsican */\n co = 'co',\n /** Czech */\n cs = 'cs',\n /** Church Slavic */\n cu = 'cu',\n /** Welsh */\n cy = 'cy',\n /** Danish */\n da = 'da',\n /** German */\n de = 'de',\n /** Austrian German */\n de_AT = 'de_AT',\n /** Swiss High German */\n de_CH = 'de_CH',\n /** Dzongkha */\n dz = 'dz',\n /** Ewe */\n ee = 'ee',\n /** Greek */\n el = 'el',\n /** English */\n en = 'en',\n /** Australian English */\n en_AU = 'en_AU',\n /** Canadian English */\n en_CA = 'en_CA',\n /** British English */\n en_GB = 'en_GB',\n /** American English */\n en_US = 'en_US',\n /** Esperanto */\n eo = 'eo',\n /** Spanish */\n es = 'es',\n /** European Spanish */\n es_ES = 'es_ES',\n /** Mexican Spanish */\n es_MX = 'es_MX',\n /** Estonian */\n et = 'et',\n /** Basque */\n eu = 'eu',\n /** Persian */\n fa = 'fa',\n /** Dari */\n fa_AF = 'fa_AF',\n /** Fulah */\n ff = 'ff',\n /** Finnish */\n fi = 'fi',\n /** Faroese */\n fo = 'fo',\n /** French */\n fr = 'fr',\n /** Canadian French */\n fr_CA = 'fr_CA',\n /** Swiss French */\n fr_CH = 'fr_CH',\n /** Western Frisian */\n fy = 'fy',\n /** Irish */\n ga = 'ga',\n /** Scottish Gaelic */\n gd = 'gd',\n /** Galician */\n gl = 'gl',\n /** Gujarati */\n gu = 'gu',\n /** Manx */\n gv = 'gv',\n /** Hausa */\n ha = 'ha',\n /** Hebrew */\n he = 'he',\n /** Hindi */\n hi = 'hi',\n /** Croatian */\n hr = 'hr',\n /** Haitian Creole */\n ht = 'ht',\n /** Hungarian */\n hu = 'hu',\n /** Armenian */\n hy = 'hy',\n /** Interlingua */\n ia = 'ia',\n /** Indonesian */\n id = 'id',\n /** Igbo */\n ig = 'ig',\n /** Sichuan Yi */\n ii = 'ii',\n /** Icelandic */\n is = 'is',\n /** Italian */\n it = 'it',\n /** Japanese */\n ja = 'ja',\n /** Javanese */\n jv = 'jv',\n /** Georgian */\n ka = 'ka',\n /** Kikuyu */\n ki = 'ki',\n /** Kazakh */\n kk = 'kk',\n /** Kalaallisut */\n kl = 'kl',\n /** Khmer */\n km = 'km',\n /** Kannada */\n kn = 'kn',\n /** Korean */\n ko = 'ko',\n /** Kashmiri */\n ks = 'ks',\n /** Kurdish */\n ku = 'ku',\n /** Cornish */\n kw = 'kw',\n /** Kyrgyz */\n ky = 'ky',\n /** Latin */\n la = 'la',\n /** Luxembourgish */\n lb = 'lb',\n /** Ganda */\n lg = 'lg',\n /** Lingala */\n ln = 'ln',\n /** Lao */\n lo = 'lo',\n /** Lithuanian */\n lt = 'lt',\n /** Luba-Katanga */\n lu = 'lu',\n /** Latvian */\n lv = 'lv',\n /** Malagasy */\n mg = 'mg',\n /** Maori */\n mi = 'mi',\n /** Macedonian */\n mk = 'mk',\n /** Malayalam */\n ml = 'ml',\n /** Mongolian */\n mn = 'mn',\n /** Marathi */\n mr = 'mr',\n /** Malay */\n ms = 'ms',\n /** Maltese */\n mt = 'mt',\n /** Burmese */\n my = 'my',\n /** Norwegian Bokm\u00E5l */\n nb = 'nb',\n /** North Ndebele */\n nd = 'nd',\n /** Nepali */\n ne = 'ne',\n /** Dutch */\n nl = 'nl',\n /** Flemish */\n nl_BE = 'nl_BE',\n /** Norwegian Nynorsk */\n nn = 'nn',\n /** Nyanja */\n ny = 'ny',\n /** Oromo */\n om = 'om',\n /** Odia */\n or = 'or',\n /** Ossetic */\n os = 'os',\n /** Punjabi */\n pa = 'pa',\n /** Polish */\n pl = 'pl',\n /** Pashto */\n ps = 'ps',\n /** Portuguese */\n pt = 'pt',\n /** Brazilian Portuguese */\n pt_BR = 'pt_BR',\n /** European Portuguese */\n pt_PT = 'pt_PT',\n /** Quechua */\n qu = 'qu',\n /** Romansh */\n rm = 'rm',\n /** Rundi */\n rn = 'rn',\n /** Romanian */\n ro = 'ro',\n /** Moldavian */\n ro_MD = 'ro_MD',\n /** Russian */\n ru = 'ru',\n /** Kinyarwanda */\n rw = 'rw',\n /** Sanskrit */\n sa = 'sa',\n /** Sindhi */\n sd = 'sd',\n /** Northern Sami */\n se = 'se',\n /** Sango */\n sg = 'sg',\n /** Sinhala */\n si = 'si',\n /** Slovak */\n sk = 'sk',\n /** Slovenian */\n sl = 'sl',\n /** Samoan */\n sm = 'sm',\n /** Shona */\n sn = 'sn',\n /** Somali */\n so = 'so',\n /** Albanian */\n sq = 'sq',\n /** Serbian */\n sr = 'sr',\n /** Southern Sotho */\n st = 'st',\n /** Sundanese */\n su = 'su',\n /** Swedish */\n sv = 'sv',\n /** Swahili */\n sw = 'sw',\n /** Congo Swahili */\n sw_CD = 'sw_CD',\n /** Tamil */\n ta = 'ta',\n /** Telugu */\n te = 'te',\n /** Tajik */\n tg = 'tg',\n /** Thai */\n th = 'th',\n /** Tigrinya */\n ti = 'ti',\n /** Turkmen */\n tk = 'tk',\n /** Tongan */\n to = 'to',\n /** Turkish */\n tr = 'tr',\n /** Tatar */\n tt = 'tt',\n /** Uyghur */\n ug = 'ug',\n /** Ukrainian */\n uk = 'uk',\n /** Urdu */\n ur = 'ur',\n /** Uzbek */\n uz = 'uz',\n /** Vietnamese */\n vi = 'vi',\n /** Volap\u00FCk */\n vo = 'vo',\n /** Wolof */\n wo = 'wo',\n /** Xhosa */\n xh = 'xh',\n /** Yiddish */\n yi = 'yi',\n /** Yoruba */\n yo = 'yo',\n /** Chinese */\n zh = 'zh',\n /** Simplified Chinese */\n zh_Hans = 'zh_Hans',\n /** Traditional Chinese */\n zh_Hant = 'zh_Hant',\n /** Zulu */\n zu = 'zu'\n}\n\n/** Returned if attempting to set a Channel's defaultLanguageCode to a language which is not enabled in GlobalSettings */\nexport type LanguageNotAvailableError = ErrorResult & {\n __typename?: 'LanguageNotAvailableError';\n errorCode: ErrorCode;\n languageCode: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type LocaleStringCustomFieldConfig = CustomField & {\n __typename?: 'LocaleStringCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n length?: Maybe<Scalars['Int']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n pattern?: Maybe<Scalars['String']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type LocaleTextCustomFieldConfig = CustomField & {\n __typename?: 'LocaleTextCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type LocalizedString = {\n __typename?: 'LocalizedString';\n languageCode: LanguageCode;\n value: Scalars['String']['output'];\n};\n\nexport enum LogicalOperator {\n AND = 'AND',\n OR = 'OR'\n}\n\nexport type ManualPaymentInput = {\n metadata?: InputMaybe<Scalars['JSON']['input']>;\n method: Scalars['String']['input'];\n orderId: Scalars['ID']['input'];\n transactionId?: InputMaybe<Scalars['String']['input']>;\n};\n\n/**\n * Returned when a call to addManualPaymentToOrder is made but the Order\n * is not in the required state.\n */\nexport type ManualPaymentStateError = ErrorResult & {\n __typename?: 'ManualPaymentStateError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport enum MetricInterval {\n Daily = 'Daily'\n}\n\nexport type MetricSummary = {\n __typename?: 'MetricSummary';\n entries: Array<MetricSummaryEntry>;\n interval: MetricInterval;\n title: Scalars['String']['output'];\n type: MetricType;\n};\n\nexport type MetricSummaryEntry = {\n __typename?: 'MetricSummaryEntry';\n label: Scalars['String']['output'];\n value: Scalars['Float']['output'];\n};\n\nexport type MetricSummaryInput = {\n interval: MetricInterval;\n refresh?: InputMaybe<Scalars['Boolean']['input']>;\n types: Array<MetricType>;\n};\n\nexport enum MetricType {\n AverageOrderValue = 'AverageOrderValue',\n OrderCount = 'OrderCount',\n OrderTotal = 'OrderTotal'\n}\n\nexport type MimeTypeError = ErrorResult & {\n __typename?: 'MimeTypeError';\n errorCode: ErrorCode;\n fileName: Scalars['String']['output'];\n message: Scalars['String']['output'];\n mimeType: Scalars['String']['output'];\n};\n\n/** Returned if a PromotionCondition has neither a couponCode nor any conditions set */\nexport type MissingConditionsError = ErrorResult & {\n __typename?: 'MissingConditionsError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type ModifyOrderInput = {\n addItems?: InputMaybe<Array<AddItemInput>>;\n adjustOrderLines?: InputMaybe<Array<OrderLineInput>>;\n couponCodes?: InputMaybe<Array<Scalars['String']['input']>>;\n dryRun: Scalars['Boolean']['input'];\n note?: InputMaybe<Scalars['String']['input']>;\n options?: InputMaybe<ModifyOrderOptions>;\n orderId: Scalars['ID']['input'];\n /**\n * Deprecated in v2.2.0. Use `refunds` instead to allow multiple refunds to be\n * applied in the case that multiple payment methods have been used on the order.\n */\n refund?: InputMaybe<AdministratorRefundInput>;\n refunds?: InputMaybe<Array<AdministratorRefundInput>>;\n /** Added in v2.2 */\n shippingMethodIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n surcharges?: InputMaybe<Array<SurchargeInput>>;\n updateBillingAddress?: InputMaybe<UpdateOrderAddressInput>;\n updateShippingAddress?: InputMaybe<UpdateOrderAddressInput>;\n};\n\nexport type ModifyOrderOptions = {\n freezePromotions?: InputMaybe<Scalars['Boolean']['input']>;\n recalculateShipping?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type ModifyOrderResult = CouponCodeExpiredError | CouponCodeInvalidError | CouponCodeLimitError | IneligibleShippingMethodError | InsufficientStockError | NegativeQuantityError | NoChangesSpecifiedError | Order | OrderLimitError | OrderModificationStateError | PaymentMethodMissingError | RefundPaymentIdMissingError;\n\nexport type MoveCollectionInput = {\n collectionId: Scalars['ID']['input'];\n index: Scalars['Int']['input'];\n parentId: Scalars['ID']['input'];\n};\n\n/** Returned if an operation has specified OrderLines from multiple Orders */\nexport type MultipleOrderError = ErrorResult & {\n __typename?: 'MultipleOrderError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Mutation = {\n __typename?: 'Mutation';\n /** Add Customers to a CustomerGroup */\n addCustomersToGroup: CustomerGroup;\n addFulfillmentToOrder: AddFulfillmentToOrderResult;\n /** Adds an item to the draft Order. */\n addItemToDraftOrder: UpdateOrderItemsResult;\n /**\n * Used to manually create a new Payment against an Order.\n * This can be used by an Administrator when an Order is in the ArrangingPayment state.\n *\n * It is also used when a completed Order\n * has been modified (using `modifyOrder`) and the price has increased. The extra payment\n * can then be manually arranged by the administrator, and the details used to create a new\n * Payment.\n */\n addManualPaymentToOrder: AddManualPaymentToOrderResult;\n /** Add members to a Zone */\n addMembersToZone: Zone;\n addNoteToCustomer: Customer;\n addNoteToOrder: Order;\n /** Add an OptionGroup to a Product */\n addOptionGroupToProduct: Product;\n /** Adjusts a draft OrderLine. If custom fields are defined on the OrderLine entity, a third argument 'customFields' of type `OrderLineCustomFieldsInput` will be available. */\n adjustDraftOrderLine: UpdateOrderItemsResult;\n /** Applies the given coupon code to the draft Order */\n applyCouponCodeToDraftOrder: ApplyCouponCodeResult;\n /** Assign assets to channel */\n assignAssetsToChannel: Array<Asset>;\n /** Assigns Collections to the specified Channel */\n assignCollectionsToChannel: Array<Collection>;\n /** Assigns Facets to the specified Channel */\n assignFacetsToChannel: Array<Facet>;\n /** Assigns PaymentMethods to the specified Channel */\n assignPaymentMethodsToChannel: Array<PaymentMethod>;\n /** Assigns ProductVariants to the specified Channel */\n assignProductVariantsToChannel: Array<ProductVariant>;\n /** Assigns all ProductVariants of Product to the specified Channel */\n assignProductsToChannel: Array<Product>;\n /** Assigns Promotions to the specified Channel */\n assignPromotionsToChannel: Array<Promotion>;\n /** Assign a Role to an Administrator */\n assignRoleToAdministrator: Administrator;\n /** Assigns ShippingMethods to the specified Channel */\n assignShippingMethodsToChannel: Array<ShippingMethod>;\n /** Assigns StockLocations to the specified Channel */\n assignStockLocationsToChannel: Array<StockLocation>;\n /** Authenticates the user using a named authentication strategy */\n authenticate: AuthenticationResult;\n cancelJob: Job;\n cancelOrder: CancelOrderResult;\n cancelPayment: CancelPaymentResult;\n /** Create a new Administrator */\n createAdministrator: Administrator;\n /** Create a new Asset */\n createAssets: Array<CreateAssetResult>;\n /** Create a new Channel */\n createChannel: CreateChannelResult;\n /** Create a new Collection */\n createCollection: Collection;\n /** Create a new Country */\n createCountry: Country;\n /** Create a new Customer. If a password is provided, a new User will also be created an linked to the Customer. */\n createCustomer: CreateCustomerResult;\n /** Create a new Address and associate it with the Customer specified by customerId */\n createCustomerAddress: Address;\n /** Create a new CustomerGroup */\n createCustomerGroup: CustomerGroup;\n /** Creates a draft Order */\n createDraftOrder: Order;\n /** Create a new Facet */\n createFacet: Facet;\n /** Create a single FacetValue */\n createFacetValue: FacetValue;\n /** Create one or more FacetValues */\n createFacetValues: Array<FacetValue>;\n /** Create existing PaymentMethod */\n createPaymentMethod: PaymentMethod;\n /** Create a new Product */\n createProduct: Product;\n /** Create a new ProductOption within a ProductOptionGroup */\n createProductOption: ProductOption;\n /** Create a new ProductOptionGroup */\n createProductOptionGroup: ProductOptionGroup;\n /** Create a set of ProductVariants based on the OptionGroups assigned to the given Product */\n createProductVariants: Array<Maybe<ProductVariant>>;\n createPromotion: CreatePromotionResult;\n /** Create a new Province */\n createProvince: Province;\n /** Create a new Role */\n createRole: Role;\n /** Create a new Seller */\n createSeller: Seller;\n /** Create a new ShippingMethod */\n createShippingMethod: ShippingMethod;\n createStockLocation: StockLocation;\n /** Create a new Tag */\n createTag: Tag;\n /** Create a new TaxCategory */\n createTaxCategory: TaxCategory;\n /** Create a new TaxRate */\n createTaxRate: TaxRate;\n /** Create a new Zone */\n createZone: Zone;\n /** Delete an Administrator */\n deleteAdministrator: DeletionResponse;\n /** Delete multiple Administrators */\n deleteAdministrators: Array<DeletionResponse>;\n /** Delete an Asset */\n deleteAsset: DeletionResponse;\n /** Delete multiple Assets */\n deleteAssets: DeletionResponse;\n /** Delete a Channel */\n deleteChannel: DeletionResponse;\n /** Delete multiple Channels */\n deleteChannels: Array<DeletionResponse>;\n /** Delete a Collection and all of its descendants */\n deleteCollection: DeletionResponse;\n /** Delete multiple Collections and all of their descendants */\n deleteCollections: Array<DeletionResponse>;\n /** Delete multiple Countries */\n deleteCountries: Array<DeletionResponse>;\n /** Delete a Country */\n deleteCountry: DeletionResponse;\n /** Delete a Customer */\n deleteCustomer: DeletionResponse;\n /** Update an existing Address */\n deleteCustomerAddress: Success;\n /** Delete a CustomerGroup */\n deleteCustomerGroup: DeletionResponse;\n /** Delete multiple CustomerGroups */\n deleteCustomerGroups: Array<DeletionResponse>;\n deleteCustomerNote: DeletionResponse;\n /** Deletes Customers */\n deleteCustomers: Array<DeletionResponse>;\n /** Deletes a draft Order */\n deleteDraftOrder: DeletionResponse;\n /** Delete an existing Facet */\n deleteFacet: DeletionResponse;\n /** Delete one or more FacetValues */\n deleteFacetValues: Array<DeletionResponse>;\n /** Delete multiple existing Facets */\n deleteFacets: Array<DeletionResponse>;\n deleteOrderNote: DeletionResponse;\n /** Delete a PaymentMethod */\n deletePaymentMethod: DeletionResponse;\n /** Delete multiple PaymentMethods */\n deletePaymentMethods: Array<DeletionResponse>;\n /** Delete a Product */\n deleteProduct: DeletionResponse;\n /** Delete a ProductOption */\n deleteProductOption: DeletionResponse;\n /** Delete a ProductVariant */\n deleteProductVariant: DeletionResponse;\n /** Delete multiple ProductVariants */\n deleteProductVariants: Array<DeletionResponse>;\n /** Delete multiple Products */\n deleteProducts: Array<DeletionResponse>;\n deletePromotion: DeletionResponse;\n deletePromotions: Array<DeletionResponse>;\n /** Delete a Province */\n deleteProvince: DeletionResponse;\n /** Delete an existing Role */\n deleteRole: DeletionResponse;\n /** Delete multiple Roles */\n deleteRoles: Array<DeletionResponse>;\n /** Delete a Seller */\n deleteSeller: DeletionResponse;\n /** Delete multiple Sellers */\n deleteSellers: Array<DeletionResponse>;\n /** Delete a ShippingMethod */\n deleteShippingMethod: DeletionResponse;\n /** Delete multiple ShippingMethods */\n deleteShippingMethods: Array<DeletionResponse>;\n deleteStockLocation: DeletionResponse;\n deleteStockLocations: Array<DeletionResponse>;\n /** Delete an existing Tag */\n deleteTag: DeletionResponse;\n /** Deletes multiple TaxCategories */\n deleteTaxCategories: Array<DeletionResponse>;\n /** Deletes a TaxCategory */\n deleteTaxCategory: DeletionResponse;\n /** Delete a TaxRate */\n deleteTaxRate: DeletionResponse;\n /** Delete multiple TaxRates */\n deleteTaxRates: Array<DeletionResponse>;\n /** Delete a Zone */\n deleteZone: DeletionResponse;\n /** Delete a Zone */\n deleteZones: Array<DeletionResponse>;\n /**\n * Duplicate an existing entity using a specific EntityDuplicator.\n * Since v2.2.0.\n */\n duplicateEntity: DuplicateEntityResult;\n flushBufferedJobs: Success;\n importProducts?: Maybe<ImportInfo>;\n /**\n * Authenticates the user using the native authentication strategy. This mutation is an alias for authenticate({ native: { ... }})\n *\n * The `rememberMe` option applies when using cookie-based sessions, and if `true` it will set the maxAge of the session cookie\n * to 1 year.\n */\n login: NativeAuthenticationResult;\n logout: Success;\n /**\n * Allows an Order to be modified after it has been completed by the Customer. The Order must first\n * be in the `Modifying` state.\n */\n modifyOrder: ModifyOrderResult;\n /** Move a Collection to a different parent or index */\n moveCollection: Collection;\n refundOrder: RefundOrderResult;\n reindex: Job;\n /** Removes Collections from the specified Channel */\n removeCollectionsFromChannel: Array<Collection>;\n /** Removes the given coupon code from the draft Order */\n removeCouponCodeFromDraftOrder?: Maybe<Order>;\n /** Remove Customers from a CustomerGroup */\n removeCustomersFromGroup: CustomerGroup;\n /** Remove an OrderLine from the draft Order */\n removeDraftOrderLine: RemoveOrderItemsResult;\n /** Removes Facets from the specified Channel */\n removeFacetsFromChannel: Array<RemoveFacetFromChannelResult>;\n /** Remove members from a Zone */\n removeMembersFromZone: Zone;\n /**\n * Remove an OptionGroup from a Product. If the OptionGroup is in use by any ProductVariants\n * the mutation will return a ProductOptionInUseError, and the OptionGroup will not be removed.\n * Setting the `force` argument to `true` will override this and remove the OptionGroup anyway,\n * as well as removing any of the group's options from the Product's ProductVariants.\n */\n removeOptionGroupFromProduct: RemoveOptionGroupFromProductResult;\n /** Removes PaymentMethods from the specified Channel */\n removePaymentMethodsFromChannel: Array<PaymentMethod>;\n /** Removes ProductVariants from the specified Channel */\n removeProductVariantsFromChannel: Array<ProductVariant>;\n /** Removes all ProductVariants of Product from the specified Channel */\n removeProductsFromChannel: Array<Product>;\n /** Removes Promotions from the specified Channel */\n removePromotionsFromChannel: Array<Promotion>;\n /** Remove all settled jobs in the given queues older than the given date. Returns the number of jobs deleted. */\n removeSettledJobs: Scalars['Int']['output'];\n /** Removes ShippingMethods from the specified Channel */\n removeShippingMethodsFromChannel: Array<ShippingMethod>;\n /** Removes StockLocations from the specified Channel */\n removeStockLocationsFromChannel: Array<StockLocation>;\n runPendingSearchIndexUpdates: Success;\n runScheduledTask: Success;\n setCustomerForDraftOrder: SetCustomerForDraftOrderResult;\n /** Sets the billing address for a draft Order */\n setDraftOrderBillingAddress: Order;\n /** Allows any custom fields to be set for the active order */\n setDraftOrderCustomFields: Order;\n /** Sets the shipping address for a draft Order */\n setDraftOrderShippingAddress: Order;\n /** Sets the shipping method by id, which can be obtained with the `eligibleShippingMethodsForDraftOrder` query */\n setDraftOrderShippingMethod: SetOrderShippingMethodResult;\n setOrderCustomFields?: Maybe<Order>;\n /** Allows a different Customer to be assigned to an Order. Added in v2.2.0. */\n setOrderCustomer?: Maybe<Order>;\n /** Set a single key-value pair (automatically scoped based on field configuration) */\n setSettingsStoreValue: SetSettingsStoreValueResult;\n /** Set multiple key-value pairs in a transaction (each automatically scoped) */\n setSettingsStoreValues: Array<SetSettingsStoreValueResult>;\n settlePayment: SettlePaymentResult;\n settleRefund: SettleRefundResult;\n transitionFulfillmentToState: TransitionFulfillmentToStateResult;\n transitionOrderToState?: Maybe<TransitionOrderToStateResult>;\n transitionPaymentToState: TransitionPaymentToStateResult;\n /** Unsets the billing address for a draft Order */\n unsetDraftOrderBillingAddress: Order;\n /** Unsets the shipping address for a draft Order */\n unsetDraftOrderShippingAddress: Order;\n /** Update the active (currently logged-in) Administrator */\n updateActiveAdministrator: Administrator;\n /** Update an existing Administrator */\n updateAdministrator: Administrator;\n /** Update an existing Asset */\n updateAsset: Asset;\n /** Update an existing Channel */\n updateChannel: UpdateChannelResult;\n /** Update an existing Collection */\n updateCollection: Collection;\n /** Update an existing Country */\n updateCountry: Country;\n /** Update an existing Customer */\n updateCustomer: UpdateCustomerResult;\n /** Update an existing Address */\n updateCustomerAddress: Address;\n /** Update an existing CustomerGroup */\n updateCustomerGroup: CustomerGroup;\n updateCustomerNote: HistoryEntry;\n /** Update an existing Facet */\n updateFacet: Facet;\n /** Update a single FacetValue */\n updateFacetValue: FacetValue;\n /** Update one or more FacetValues */\n updateFacetValues: Array<FacetValue>;\n updateGlobalSettings: UpdateGlobalSettingsResult;\n updateOrderNote: HistoryEntry;\n /** Update an existing PaymentMethod */\n updatePaymentMethod: PaymentMethod;\n /** Update an existing Product */\n updateProduct: Product;\n /** Create a new ProductOption within a ProductOptionGroup */\n updateProductOption: ProductOption;\n /** Update an existing ProductOptionGroup */\n updateProductOptionGroup: ProductOptionGroup;\n /** Update an existing ProductVariant */\n updateProductVariant: ProductVariant;\n /** Update existing ProductVariants */\n updateProductVariants: Array<Maybe<ProductVariant>>;\n /** Update multiple existing Products */\n updateProducts: Array<Product>;\n updatePromotion: UpdatePromotionResult;\n /** Update an existing Province */\n updateProvince: Province;\n /** Update an existing Role */\n updateRole: Role;\n updateScheduledTask: ScheduledTask;\n /** Update an existing Seller */\n updateSeller: Seller;\n /** Update an existing ShippingMethod */\n updateShippingMethod: ShippingMethod;\n updateStockLocation: StockLocation;\n /** Update an existing Tag */\n updateTag: Tag;\n /** Update an existing TaxCategory */\n updateTaxCategory: TaxCategory;\n /** Update an existing TaxRate */\n updateTaxRate: TaxRate;\n /** Update an existing Zone */\n updateZone: Zone;\n};\n\n\nexport type MutationAddCustomersToGroupArgs = {\n customerGroupId: Scalars['ID']['input'];\n customerIds: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationAddFulfillmentToOrderArgs = {\n input: FulfillOrderInput;\n};\n\n\nexport type MutationAddItemToDraftOrderArgs = {\n input: AddItemToDraftOrderInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAddManualPaymentToOrderArgs = {\n input: ManualPaymentInput;\n};\n\n\nexport type MutationAddMembersToZoneArgs = {\n memberIds: Array<Scalars['ID']['input']>;\n zoneId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAddNoteToCustomerArgs = {\n input: AddNoteToCustomerInput;\n};\n\n\nexport type MutationAddNoteToOrderArgs = {\n input: AddNoteToOrderInput;\n};\n\n\nexport type MutationAddOptionGroupToProductArgs = {\n optionGroupId: Scalars['ID']['input'];\n productId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAdjustDraftOrderLineArgs = {\n input: AdjustDraftOrderLineInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationApplyCouponCodeToDraftOrderArgs = {\n couponCode: Scalars['String']['input'];\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAssignAssetsToChannelArgs = {\n input: AssignAssetsToChannelInput;\n};\n\n\nexport type MutationAssignCollectionsToChannelArgs = {\n input: AssignCollectionsToChannelInput;\n};\n\n\nexport type MutationAssignFacetsToChannelArgs = {\n input: AssignFacetsToChannelInput;\n};\n\n\nexport type MutationAssignPaymentMethodsToChannelArgs = {\n input: AssignPaymentMethodsToChannelInput;\n};\n\n\nexport type MutationAssignProductVariantsToChannelArgs = {\n input: AssignProductVariantsToChannelInput;\n};\n\n\nexport type MutationAssignProductsToChannelArgs = {\n input: AssignProductsToChannelInput;\n};\n\n\nexport type MutationAssignPromotionsToChannelArgs = {\n input: AssignPromotionsToChannelInput;\n};\n\n\nexport type MutationAssignRoleToAdministratorArgs = {\n administratorId: Scalars['ID']['input'];\n roleId: Scalars['ID']['input'];\n};\n\n\nexport type MutationAssignShippingMethodsToChannelArgs = {\n input: AssignShippingMethodsToChannelInput;\n};\n\n\nexport type MutationAssignStockLocationsToChannelArgs = {\n input: AssignStockLocationsToChannelInput;\n};\n\n\nexport type MutationAuthenticateArgs = {\n input: AuthenticationInput;\n rememberMe?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\n\nexport type MutationCancelJobArgs = {\n jobId: Scalars['ID']['input'];\n};\n\n\nexport type MutationCancelOrderArgs = {\n input: CancelOrderInput;\n};\n\n\nexport type MutationCancelPaymentArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationCreateAdministratorArgs = {\n input: CreateAdministratorInput;\n};\n\n\nexport type MutationCreateAssetsArgs = {\n input: Array<CreateAssetInput>;\n};\n\n\nexport type MutationCreateChannelArgs = {\n input: CreateChannelInput;\n};\n\n\nexport type MutationCreateCollectionArgs = {\n input: CreateCollectionInput;\n};\n\n\nexport type MutationCreateCountryArgs = {\n input: CreateCountryInput;\n};\n\n\nexport type MutationCreateCustomerArgs = {\n input: CreateCustomerInput;\n password?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type MutationCreateCustomerAddressArgs = {\n customerId: Scalars['ID']['input'];\n input: CreateAddressInput;\n};\n\n\nexport type MutationCreateCustomerGroupArgs = {\n input: CreateCustomerGroupInput;\n};\n\n\nexport type MutationCreateFacetArgs = {\n input: CreateFacetInput;\n};\n\n\nexport type MutationCreateFacetValueArgs = {\n input: CreateFacetValueInput;\n};\n\n\nexport type MutationCreateFacetValuesArgs = {\n input: Array<CreateFacetValueInput>;\n};\n\n\nexport type MutationCreatePaymentMethodArgs = {\n input: CreatePaymentMethodInput;\n};\n\n\nexport type MutationCreateProductArgs = {\n input: CreateProductInput;\n};\n\n\nexport type MutationCreateProductOptionArgs = {\n input: CreateProductOptionInput;\n};\n\n\nexport type MutationCreateProductOptionGroupArgs = {\n input: CreateProductOptionGroupInput;\n};\n\n\nexport type MutationCreateProductVariantsArgs = {\n input: Array<CreateProductVariantInput>;\n};\n\n\nexport type MutationCreatePromotionArgs = {\n input: CreatePromotionInput;\n};\n\n\nexport type MutationCreateProvinceArgs = {\n input: CreateProvinceInput;\n};\n\n\nexport type MutationCreateRoleArgs = {\n input: CreateRoleInput;\n};\n\n\nexport type MutationCreateSellerArgs = {\n input: CreateSellerInput;\n};\n\n\nexport type MutationCreateShippingMethodArgs = {\n input: CreateShippingMethodInput;\n};\n\n\nexport type MutationCreateStockLocationArgs = {\n input: CreateStockLocationInput;\n};\n\n\nexport type MutationCreateTagArgs = {\n input: CreateTagInput;\n};\n\n\nexport type MutationCreateTaxCategoryArgs = {\n input: CreateTaxCategoryInput;\n};\n\n\nexport type MutationCreateTaxRateArgs = {\n input: CreateTaxRateInput;\n};\n\n\nexport type MutationCreateZoneArgs = {\n input: CreateZoneInput;\n};\n\n\nexport type MutationDeleteAdministratorArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteAdministratorsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteAssetArgs = {\n input: DeleteAssetInput;\n};\n\n\nexport type MutationDeleteAssetsArgs = {\n input: DeleteAssetsInput;\n};\n\n\nexport type MutationDeleteChannelArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteChannelsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCollectionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCollectionsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCountriesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCountryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerAddressArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerGroupArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomerGroupsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteCustomerNoteArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteCustomersArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteDraftOrderArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteFacetArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteFacetValuesArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteFacetsArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteOrderNoteArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeletePaymentMethodArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeletePaymentMethodsArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteProductArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteProductOptionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteProductVariantArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteProductVariantsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteProductsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeletePromotionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeletePromotionsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteProvinceArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteRoleArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteRolesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteSellerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteSellersArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteShippingMethodArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteShippingMethodsArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteStockLocationArgs = {\n input: DeleteStockLocationInput;\n};\n\n\nexport type MutationDeleteStockLocationsArgs = {\n input: Array<DeleteStockLocationInput>;\n};\n\n\nexport type MutationDeleteTagArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteTaxCategoriesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteTaxCategoryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteTaxRateArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteTaxRatesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDeleteZoneArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteZonesArgs = {\n ids: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationDuplicateEntityArgs = {\n input: DuplicateEntityInput;\n};\n\n\nexport type MutationFlushBufferedJobsArgs = {\n bufferIds?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n\nexport type MutationImportProductsArgs = {\n csvFile: Scalars['Upload']['input'];\n};\n\n\nexport type MutationLoginArgs = {\n password: Scalars['String']['input'];\n rememberMe?: InputMaybe<Scalars['Boolean']['input']>;\n username: Scalars['String']['input'];\n};\n\n\nexport type MutationModifyOrderArgs = {\n input: ModifyOrderInput;\n};\n\n\nexport type MutationMoveCollectionArgs = {\n input: MoveCollectionInput;\n};\n\n\nexport type MutationRefundOrderArgs = {\n input: RefundOrderInput;\n};\n\n\nexport type MutationRemoveCollectionsFromChannelArgs = {\n input: RemoveCollectionsFromChannelInput;\n};\n\n\nexport type MutationRemoveCouponCodeFromDraftOrderArgs = {\n couponCode: Scalars['String']['input'];\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemoveCustomersFromGroupArgs = {\n customerGroupId: Scalars['ID']['input'];\n customerIds: Array<Scalars['ID']['input']>;\n};\n\n\nexport type MutationRemoveDraftOrderLineArgs = {\n orderId: Scalars['ID']['input'];\n orderLineId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemoveFacetsFromChannelArgs = {\n input: RemoveFacetsFromChannelInput;\n};\n\n\nexport type MutationRemoveMembersFromZoneArgs = {\n memberIds: Array<Scalars['ID']['input']>;\n zoneId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemoveOptionGroupFromProductArgs = {\n force?: InputMaybe<Scalars['Boolean']['input']>;\n optionGroupId: Scalars['ID']['input'];\n productId: Scalars['ID']['input'];\n};\n\n\nexport type MutationRemovePaymentMethodsFromChannelArgs = {\n input: RemovePaymentMethodsFromChannelInput;\n};\n\n\nexport type MutationRemoveProductVariantsFromChannelArgs = {\n input: RemoveProductVariantsFromChannelInput;\n};\n\n\nexport type MutationRemoveProductsFromChannelArgs = {\n input: RemoveProductsFromChannelInput;\n};\n\n\nexport type MutationRemovePromotionsFromChannelArgs = {\n input: RemovePromotionsFromChannelInput;\n};\n\n\nexport type MutationRemoveSettledJobsArgs = {\n olderThan?: InputMaybe<Scalars['DateTime']['input']>;\n queueNames?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n\nexport type MutationRemoveShippingMethodsFromChannelArgs = {\n input: RemoveShippingMethodsFromChannelInput;\n};\n\n\nexport type MutationRemoveStockLocationsFromChannelArgs = {\n input: RemoveStockLocationsFromChannelInput;\n};\n\n\nexport type MutationRunScheduledTaskArgs = {\n id: Scalars['String']['input'];\n};\n\n\nexport type MutationSetCustomerForDraftOrderArgs = {\n customerId?: InputMaybe<Scalars['ID']['input']>;\n input?: InputMaybe<CreateCustomerInput>;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderBillingAddressArgs = {\n input: CreateAddressInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderCustomFieldsArgs = {\n input: UpdateOrderInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderShippingAddressArgs = {\n input: CreateAddressInput;\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetDraftOrderShippingMethodArgs = {\n orderId: Scalars['ID']['input'];\n shippingMethodId: Scalars['ID']['input'];\n};\n\n\nexport type MutationSetOrderCustomFieldsArgs = {\n input: UpdateOrderInput;\n};\n\n\nexport type MutationSetOrderCustomerArgs = {\n input: SetOrderCustomerInput;\n};\n\n\nexport type MutationSetSettingsStoreValueArgs = {\n input: SettingsStoreInput;\n};\n\n\nexport type MutationSetSettingsStoreValuesArgs = {\n inputs: Array<SettingsStoreInput>;\n};\n\n\nexport type MutationSettlePaymentArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type MutationSettleRefundArgs = {\n input: SettleRefundInput;\n};\n\n\nexport type MutationTransitionFulfillmentToStateArgs = {\n id: Scalars['ID']['input'];\n state: Scalars['String']['input'];\n};\n\n\nexport type MutationTransitionOrderToStateArgs = {\n id: Scalars['ID']['input'];\n state: Scalars['String']['input'];\n};\n\n\nexport type MutationTransitionPaymentToStateArgs = {\n id: Scalars['ID']['input'];\n state: Scalars['String']['input'];\n};\n\n\nexport type MutationUnsetDraftOrderBillingAddressArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationUnsetDraftOrderShippingAddressArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type MutationUpdateActiveAdministratorArgs = {\n input: UpdateActiveAdministratorInput;\n};\n\n\nexport type MutationUpdateAdministratorArgs = {\n input: UpdateAdministratorInput;\n};\n\n\nexport type MutationUpdateAssetArgs = {\n input: UpdateAssetInput;\n};\n\n\nexport type MutationUpdateChannelArgs = {\n input: UpdateChannelInput;\n};\n\n\nexport type MutationUpdateCollectionArgs = {\n input: UpdateCollectionInput;\n};\n\n\nexport type MutationUpdateCountryArgs = {\n input: UpdateCountryInput;\n};\n\n\nexport type MutationUpdateCustomerArgs = {\n input: UpdateCustomerInput;\n};\n\n\nexport type MutationUpdateCustomerAddressArgs = {\n input: UpdateAddressInput;\n};\n\n\nexport type MutationUpdateCustomerGroupArgs = {\n input: UpdateCustomerGroupInput;\n};\n\n\nexport type MutationUpdateCustomerNoteArgs = {\n input: UpdateCustomerNoteInput;\n};\n\n\nexport type MutationUpdateFacetArgs = {\n input: UpdateFacetInput;\n};\n\n\nexport type MutationUpdateFacetValueArgs = {\n input: UpdateFacetValueInput;\n};\n\n\nexport type MutationUpdateFacetValuesArgs = {\n input: Array<UpdateFacetValueInput>;\n};\n\n\nexport type MutationUpdateGlobalSettingsArgs = {\n input: UpdateGlobalSettingsInput;\n};\n\n\nexport type MutationUpdateOrderNoteArgs = {\n input: UpdateOrderNoteInput;\n};\n\n\nexport type MutationUpdatePaymentMethodArgs = {\n input: UpdatePaymentMethodInput;\n};\n\n\nexport type MutationUpdateProductArgs = {\n input: UpdateProductInput;\n};\n\n\nexport type MutationUpdateProductOptionArgs = {\n input: UpdateProductOptionInput;\n};\n\n\nexport type MutationUpdateProductOptionGroupArgs = {\n input: UpdateProductOptionGroupInput;\n};\n\n\nexport type MutationUpdateProductVariantArgs = {\n input: UpdateProductVariantInput;\n};\n\n\nexport type MutationUpdateProductVariantsArgs = {\n input: Array<UpdateProductVariantInput>;\n};\n\n\nexport type MutationUpdateProductsArgs = {\n input: Array<UpdateProductInput>;\n};\n\n\nexport type MutationUpdatePromotionArgs = {\n input: UpdatePromotionInput;\n};\n\n\nexport type MutationUpdateProvinceArgs = {\n input: UpdateProvinceInput;\n};\n\n\nexport type MutationUpdateRoleArgs = {\n input: UpdateRoleInput;\n};\n\n\nexport type MutationUpdateScheduledTaskArgs = {\n input: UpdateScheduledTaskInput;\n};\n\n\nexport type MutationUpdateSellerArgs = {\n input: UpdateSellerInput;\n};\n\n\nexport type MutationUpdateShippingMethodArgs = {\n input: UpdateShippingMethodInput;\n};\n\n\nexport type MutationUpdateStockLocationArgs = {\n input: UpdateStockLocationInput;\n};\n\n\nexport type MutationUpdateTagArgs = {\n input: UpdateTagInput;\n};\n\n\nexport type MutationUpdateTaxCategoryArgs = {\n input: UpdateTaxCategoryInput;\n};\n\n\nexport type MutationUpdateTaxRateArgs = {\n input: UpdateTaxRateInput;\n};\n\n\nexport type MutationUpdateZoneArgs = {\n input: UpdateZoneInput;\n};\n\nexport type NativeAuthInput = {\n password: Scalars['String']['input'];\n username: Scalars['String']['input'];\n};\n\n/** Returned when attempting an operation that relies on the NativeAuthStrategy, if that strategy is not configured. */\nexport type NativeAuthStrategyError = ErrorResult & {\n __typename?: 'NativeAuthStrategyError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type NativeAuthenticationResult = CurrentUser | InvalidCredentialsError | NativeAuthStrategyError;\n\n/** Returned when attempting to set a negative OrderLine quantity. */\nexport type NegativeQuantityError = ErrorResult & {\n __typename?: 'NegativeQuantityError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/**\n * Returned when invoking a mutation which depends on there being an active Order on the\n * current session.\n */\nexport type NoActiveOrderError = ErrorResult & {\n __typename?: 'NoActiveOrderError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when a call to modifyOrder fails to specify any changes */\nexport type NoChangesSpecifiedError = ErrorResult & {\n __typename?: 'NoChangesSpecifiedError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Node = {\n id: Scalars['ID']['output'];\n};\n\n/** Returned if an attempting to refund an Order but neither items nor shipping refund was specified */\nexport type NothingToRefundError = ErrorResult & {\n __typename?: 'NothingToRefundError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Operators for filtering on a list of Number fields */\nexport type NumberListOperators = {\n inList: Scalars['Float']['input'];\n};\n\n/** Operators for filtering on a Int or Float field */\nexport type NumberOperators = {\n between?: InputMaybe<NumberRange>;\n eq?: InputMaybe<Scalars['Float']['input']>;\n gt?: InputMaybe<Scalars['Float']['input']>;\n gte?: InputMaybe<Scalars['Float']['input']>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n lt?: InputMaybe<Scalars['Float']['input']>;\n lte?: InputMaybe<Scalars['Float']['input']>;\n};\n\nexport type NumberRange = {\n end: Scalars['Float']['input'];\n start: Scalars['Float']['input'];\n};\n\nexport type Order = Node & {\n __typename?: 'Order';\n /** An order is active as long as the payment process has not been completed */\n active: Scalars['Boolean']['output'];\n aggregateOrder?: Maybe<Order>;\n aggregateOrderId?: Maybe<Scalars['ID']['output']>;\n billingAddress?: Maybe<OrderAddress>;\n channels: Array<Channel>;\n /** A unique code for the Order */\n code: Scalars['String']['output'];\n /** An array of all coupon codes applied to the Order */\n couponCodes: Array<Scalars['String']['output']>;\n createdAt: Scalars['DateTime']['output'];\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n customer?: Maybe<Customer>;\n discounts: Array<Discount>;\n fulfillments?: Maybe<Array<Fulfillment>>;\n history: HistoryEntryList;\n id: Scalars['ID']['output'];\n lines: Array<OrderLine>;\n modifications: Array<OrderModification>;\n nextStates: Array<Scalars['String']['output']>;\n /**\n * The date & time that the Order was placed, i.e. the Customer\n * completed the checkout and the Order is no longer \"active\"\n */\n orderPlacedAt?: Maybe<Scalars['DateTime']['output']>;\n payments?: Maybe<Array<Payment>>;\n /** Promotions applied to the order. Only gets populated after the payment process has completed. */\n promotions: Array<Promotion>;\n sellerOrders?: Maybe<Array<Order>>;\n shipping: Scalars['Money']['output'];\n shippingAddress?: Maybe<OrderAddress>;\n shippingLines: Array<ShippingLine>;\n shippingWithTax: Scalars['Money']['output'];\n state: Scalars['String']['output'];\n /**\n * The subTotal is the total of all OrderLines in the Order. This figure also includes any Order-level\n * discounts which have been prorated (proportionally distributed) amongst the items of each OrderLine.\n * To get a total of all OrderLines which does not account for prorated discounts, use the\n * sum of `OrderLine.discountedLinePrice` values.\n */\n subTotal: Scalars['Money']['output'];\n /** Same as subTotal, but inclusive of tax */\n subTotalWithTax: Scalars['Money']['output'];\n /**\n * Surcharges are arbitrary modifications to the Order total which are neither\n * ProductVariants nor discounts resulting from applied Promotions. For example,\n * one-off discounts based on customer interaction, or surcharges based on payment\n * methods.\n */\n surcharges: Array<Surcharge>;\n /** A summary of the taxes being applied to this Order */\n taxSummary: Array<OrderTaxSummary>;\n /** Equal to subTotal plus shipping */\n total: Scalars['Money']['output'];\n totalQuantity: Scalars['Int']['output'];\n /** The final payable amount. Equal to subTotalWithTax plus shippingWithTax */\n totalWithTax: Scalars['Money']['output'];\n type: OrderType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n\nexport type OrderHistoryArgs = {\n options?: InputMaybe<HistoryEntryListOptions>;\n};\n\nexport type OrderAddress = {\n __typename?: 'OrderAddress';\n city?: Maybe<Scalars['String']['output']>;\n company?: Maybe<Scalars['String']['output']>;\n country?: Maybe<Scalars['String']['output']>;\n countryCode?: Maybe<Scalars['String']['output']>;\n customFields?: Maybe<Scalars['JSON']['output']>;\n fullName?: Maybe<Scalars['String']['output']>;\n phoneNumber?: Maybe<Scalars['String']['output']>;\n postalCode?: Maybe<Scalars['String']['output']>;\n province?: Maybe<Scalars['String']['output']>;\n streetLine1?: Maybe<Scalars['String']['output']>;\n streetLine2?: Maybe<Scalars['String']['output']>;\n};\n\nexport type OrderFilterParameter = {\n _and?: InputMaybe<Array<OrderFilterParameter>>;\n _or?: InputMaybe<Array<OrderFilterParameter>>;\n active?: InputMaybe<BooleanOperators>;\n aggregateOrderId?: InputMaybe<IdOperators>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n currencyCode?: InputMaybe<StringOperators>;\n customerLastName?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n orderPlacedAt?: InputMaybe<DateOperators>;\n shipping?: InputMaybe<NumberOperators>;\n shippingWithTax?: InputMaybe<NumberOperators>;\n state?: InputMaybe<StringOperators>;\n subTotal?: InputMaybe<NumberOperators>;\n subTotalWithTax?: InputMaybe<NumberOperators>;\n total?: InputMaybe<NumberOperators>;\n totalQuantity?: InputMaybe<NumberOperators>;\n totalWithTax?: InputMaybe<NumberOperators>;\n transactionId?: InputMaybe<StringOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\n/** Returned when an order operation is rejected by an OrderInterceptor method. */\nexport type OrderInterceptorError = ErrorResult & {\n __typename?: 'OrderInterceptorError';\n errorCode: ErrorCode;\n interceptorError: Scalars['String']['output'];\n message: Scalars['String']['output'];\n};\n\n/** Returned when the maximum order size limit has been reached. */\nexport type OrderLimitError = ErrorResult & {\n __typename?: 'OrderLimitError';\n errorCode: ErrorCode;\n maxItems: Scalars['Int']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type OrderLine = Node & {\n __typename?: 'OrderLine';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n /** The price of the line including discounts, excluding tax */\n discountedLinePrice: Scalars['Money']['output'];\n /** The price of the line including discounts and tax */\n discountedLinePriceWithTax: Scalars['Money']['output'];\n /**\n * The price of a single unit including discounts, excluding tax.\n *\n * If Order-level discounts have been applied, this will not be the\n * actual taxable unit price (see `proratedUnitPrice`), but is generally the\n * correct price to display to customers to avoid confusion\n * about the internal handling of distributed Order-level discounts.\n */\n discountedUnitPrice: Scalars['Money']['output'];\n /** The price of a single unit including discounts and tax */\n discountedUnitPriceWithTax: Scalars['Money']['output'];\n discounts: Array<Discount>;\n featuredAsset?: Maybe<Asset>;\n fulfillmentLines?: Maybe<Array<FulfillmentLine>>;\n id: Scalars['ID']['output'];\n /** The total price of the line excluding tax and discounts. */\n linePrice: Scalars['Money']['output'];\n /** The total price of the line including tax but excluding discounts. */\n linePriceWithTax: Scalars['Money']['output'];\n /** The total tax on this line */\n lineTax: Scalars['Money']['output'];\n order: Order;\n /** The quantity at the time the Order was placed */\n orderPlacedQuantity: Scalars['Int']['output'];\n productVariant: ProductVariant;\n /**\n * The actual line price, taking into account both item discounts _and_ prorated (proportionally-distributed)\n * Order-level discounts. This value is the true economic value of the OrderLine, and is used in tax\n * and refund calculations.\n */\n proratedLinePrice: Scalars['Money']['output'];\n /** The proratedLinePrice including tax */\n proratedLinePriceWithTax: Scalars['Money']['output'];\n /**\n * The actual unit price, taking into account both item discounts _and_ prorated (proportionally-distributed)\n * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax\n * and refund calculations.\n */\n proratedUnitPrice: Scalars['Money']['output'];\n /** The proratedUnitPrice including tax */\n proratedUnitPriceWithTax: Scalars['Money']['output'];\n /** The quantity of items purchased */\n quantity: Scalars['Int']['output'];\n taxLines: Array<TaxLine>;\n taxRate: Scalars['Float']['output'];\n /** The price of a single unit, excluding tax and discounts */\n unitPrice: Scalars['Money']['output'];\n /** Non-zero if the unitPrice has changed since it was initially added to Order */\n unitPriceChangeSinceAdded: Scalars['Money']['output'];\n /** The price of a single unit, including tax but excluding discounts */\n unitPriceWithTax: Scalars['Money']['output'];\n /** Non-zero if the unitPriceWithTax has changed since it was initially added to Order */\n unitPriceWithTaxChangeSinceAdded: Scalars['Money']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type OrderLineInput = {\n orderLineId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type OrderList = PaginatedList & {\n __typename?: 'OrderList';\n items: Array<Order>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type OrderListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<OrderFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<OrderSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type OrderModification = Node & {\n __typename?: 'OrderModification';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n isSettled: Scalars['Boolean']['output'];\n lines: Array<OrderModificationLine>;\n note: Scalars['String']['output'];\n payment?: Maybe<Payment>;\n priceChange: Scalars['Money']['output'];\n refund?: Maybe<Refund>;\n surcharges?: Maybe<Array<Surcharge>>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned when attempting to modify the contents of an Order that is not in the `AddingItems` state. */\nexport type OrderModificationError = ErrorResult & {\n __typename?: 'OrderModificationError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type OrderModificationLine = {\n __typename?: 'OrderModificationLine';\n modification: OrderModification;\n modificationId: Scalars['ID']['output'];\n orderLine: OrderLine;\n orderLineId: Scalars['ID']['output'];\n quantity: Scalars['Int']['output'];\n};\n\n/** Returned when attempting to modify the contents of an Order that is not in the `Modifying` state. */\nexport type OrderModificationStateError = ErrorResult & {\n __typename?: 'OrderModificationStateError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type OrderProcessState = {\n __typename?: 'OrderProcessState';\n name: Scalars['String']['output'];\n to: Array<Scalars['String']['output']>;\n};\n\nexport type OrderSortParameter = {\n aggregateOrderId?: InputMaybe<SortOrder>;\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n customerLastName?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n orderPlacedAt?: InputMaybe<SortOrder>;\n shipping?: InputMaybe<SortOrder>;\n shippingWithTax?: InputMaybe<SortOrder>;\n state?: InputMaybe<SortOrder>;\n subTotal?: InputMaybe<SortOrder>;\n subTotalWithTax?: InputMaybe<SortOrder>;\n total?: InputMaybe<SortOrder>;\n totalQuantity?: InputMaybe<SortOrder>;\n totalWithTax?: InputMaybe<SortOrder>;\n transactionId?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\n/** Returned if there is an error in transitioning the Order state */\nexport type OrderStateTransitionError = ErrorResult & {\n __typename?: 'OrderStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\n/**\n * A summary of the taxes being applied to this order, grouped\n * by taxRate.\n */\nexport type OrderTaxSummary = {\n __typename?: 'OrderTaxSummary';\n /** A description of this tax */\n description: Scalars['String']['output'];\n /** The total net price of OrderLines to which this taxRate applies */\n taxBase: Scalars['Money']['output'];\n /** The taxRate as a percentage */\n taxRate: Scalars['Float']['output'];\n /** The total tax being applied to the Order at this taxRate */\n taxTotal: Scalars['Money']['output'];\n};\n\nexport enum OrderType {\n Aggregate = 'Aggregate',\n Regular = 'Regular',\n Seller = 'Seller'\n}\n\nexport type PaginatedList = {\n items: Array<Node>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type Payment = Node & {\n __typename?: 'Payment';\n amount: Scalars['Money']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n errorMessage?: Maybe<Scalars['String']['output']>;\n id: Scalars['ID']['output'];\n metadata?: Maybe<Scalars['JSON']['output']>;\n method: Scalars['String']['output'];\n nextStates: Array<Scalars['String']['output']>;\n refunds: Array<Refund>;\n state: Scalars['String']['output'];\n transactionId?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PaymentMethod = Node & {\n __typename?: 'PaymentMethod';\n checker?: Maybe<ConfigurableOperation>;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n handler: ConfigurableOperation;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n translations: Array<PaymentMethodTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PaymentMethodFilterParameter = {\n _and?: InputMaybe<Array<PaymentMethodFilterParameter>>;\n _or?: InputMaybe<Array<PaymentMethodFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type PaymentMethodList = PaginatedList & {\n __typename?: 'PaymentMethodList';\n items: Array<PaymentMethod>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type PaymentMethodListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<PaymentMethodFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<PaymentMethodSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * Returned when a call to modifyOrder fails to include a paymentMethod even\n * though the price has increased as a result of the changes.\n */\nexport type PaymentMethodMissingError = ErrorResult & {\n __typename?: 'PaymentMethodMissingError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type PaymentMethodQuote = {\n __typename?: 'PaymentMethodQuote';\n code: Scalars['String']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n eligibilityMessage?: Maybe<Scalars['String']['output']>;\n id: Scalars['ID']['output'];\n isEligible: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n};\n\nexport type PaymentMethodSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type PaymentMethodTranslation = {\n __typename?: 'PaymentMethodTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PaymentMethodTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** Returned if an attempting to refund a Payment against OrderLines from a different Order */\nexport type PaymentOrderMismatchError = ErrorResult & {\n __typename?: 'PaymentOrderMismatchError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when there is an error in transitioning the Payment state */\nexport type PaymentStateTransitionError = ErrorResult & {\n __typename?: 'PaymentStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\n/**\n * @description\n * Permissions for administrators and customers. Used to control access to\n * GraphQL resolvers via the {@link Allow} decorator.\n *\n * ## Understanding Permission.Owner\n *\n * `Permission.Owner` is a special permission which is used in some Vendure resolvers to indicate that that resolver should only\n * be accessible to the \"owner\" of that resource.\n *\n * For example, the Shop API `activeCustomer` query resolver should only return the Customer object for the \"owner\" of that Customer, i.e.\n * based on the activeUserId of the current session. As a result, the resolver code looks like this:\n *\n * @example\n * ```TypeScript\n * \\@Query()\n * \\@Allow(Permission.Owner)\n * async activeCustomer(\\@Ctx() ctx: RequestContext): Promise<Customer | undefined> {\n * const userId = ctx.activeUserId;\n * if (userId) {\n * return this.customerService.findOneByUserId(ctx, userId);\n * }\n * }\n * ```\n *\n * Here we can see that the \"ownership\" must be enforced by custom logic inside the resolver. Since \"ownership\" cannot be defined generally\n * nor statically encoded at build-time, any resolvers using `Permission.Owner` **must** include logic to enforce that only the owner\n * of the resource has access. If not, then it is the equivalent of using `Permission.Public`.\n *\n *\n * @docsCategory common\n */\nexport enum Permission {\n /** Authenticated means simply that the user is logged in */\n Authenticated = 'Authenticated',\n /** Grants permission to create Administrator */\n CreateAdministrator = 'CreateAdministrator',\n /** Grants permission to create Asset */\n CreateAsset = 'CreateAsset',\n /** Grants permission to create Products, Facets, Assets, Collections */\n CreateCatalog = 'CreateCatalog',\n /** Grants permission to create Channel */\n CreateChannel = 'CreateChannel',\n /** Grants permission to create Collection */\n CreateCollection = 'CreateCollection',\n /** Grants permission to create Country */\n CreateCountry = 'CreateCountry',\n /** Grants permission to create Customer */\n CreateCustomer = 'CreateCustomer',\n /** Grants permission to create CustomerGroup */\n CreateCustomerGroup = 'CreateCustomerGroup',\n /** Grants permission to create Facet */\n CreateFacet = 'CreateFacet',\n /** Grants permission to create Order */\n CreateOrder = 'CreateOrder',\n /** Grants permission to create PaymentMethod */\n CreatePaymentMethod = 'CreatePaymentMethod',\n /** Grants permission to create Product */\n CreateProduct = 'CreateProduct',\n /** Grants permission to create Promotion */\n CreatePromotion = 'CreatePromotion',\n /** Grants permission to create Seller */\n CreateSeller = 'CreateSeller',\n /** Grants permission to create PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n CreateSettings = 'CreateSettings',\n /** Grants permission to create ShippingMethod */\n CreateShippingMethod = 'CreateShippingMethod',\n /** Grants permission to create StockLocation */\n CreateStockLocation = 'CreateStockLocation',\n /** Grants permission to create System */\n CreateSystem = 'CreateSystem',\n /** Grants permission to create Tag */\n CreateTag = 'CreateTag',\n /** Grants permission to create TaxCategory */\n CreateTaxCategory = 'CreateTaxCategory',\n /** Grants permission to create TaxRate */\n CreateTaxRate = 'CreateTaxRate',\n /** Grants permission to create Zone */\n CreateZone = 'CreateZone',\n /** Grants permission to delete Administrator */\n DeleteAdministrator = 'DeleteAdministrator',\n /** Grants permission to delete Asset */\n DeleteAsset = 'DeleteAsset',\n /** Grants permission to delete Products, Facets, Assets, Collections */\n DeleteCatalog = 'DeleteCatalog',\n /** Grants permission to delete Channel */\n DeleteChannel = 'DeleteChannel',\n /** Grants permission to delete Collection */\n DeleteCollection = 'DeleteCollection',\n /** Grants permission to delete Country */\n DeleteCountry = 'DeleteCountry',\n /** Grants permission to delete Customer */\n DeleteCustomer = 'DeleteCustomer',\n /** Grants permission to delete CustomerGroup */\n DeleteCustomerGroup = 'DeleteCustomerGroup',\n /** Grants permission to delete Facet */\n DeleteFacet = 'DeleteFacet',\n /** Grants permission to delete Order */\n DeleteOrder = 'DeleteOrder',\n /** Grants permission to delete PaymentMethod */\n DeletePaymentMethod = 'DeletePaymentMethod',\n /** Grants permission to delete Product */\n DeleteProduct = 'DeleteProduct',\n /** Grants permission to delete Promotion */\n DeletePromotion = 'DeletePromotion',\n /** Grants permission to delete Seller */\n DeleteSeller = 'DeleteSeller',\n /** Grants permission to delete PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n DeleteSettings = 'DeleteSettings',\n /** Grants permission to delete ShippingMethod */\n DeleteShippingMethod = 'DeleteShippingMethod',\n /** Grants permission to delete StockLocation */\n DeleteStockLocation = 'DeleteStockLocation',\n /** Grants permission to delete System */\n DeleteSystem = 'DeleteSystem',\n /** Grants permission to delete Tag */\n DeleteTag = 'DeleteTag',\n /** Grants permission to delete TaxCategory */\n DeleteTaxCategory = 'DeleteTaxCategory',\n /** Grants permission to delete TaxRate */\n DeleteTaxRate = 'DeleteTaxRate',\n /** Grants permission to delete Zone */\n DeleteZone = 'DeleteZone',\n /** Owner means the user owns this entity, e.g. a Customer's own Order */\n Owner = 'Owner',\n /** Public means any unauthenticated user may perform the operation */\n Public = 'Public',\n /** Grants permission to read Administrator */\n ReadAdministrator = 'ReadAdministrator',\n /** Grants permission to read Asset */\n ReadAsset = 'ReadAsset',\n /** Grants permission to read Products, Facets, Assets, Collections */\n ReadCatalog = 'ReadCatalog',\n /** Grants permission to read Channel */\n ReadChannel = 'ReadChannel',\n /** Grants permission to read Collection */\n ReadCollection = 'ReadCollection',\n /** Grants permission to read Country */\n ReadCountry = 'ReadCountry',\n /** Grants permission to read Customer */\n ReadCustomer = 'ReadCustomer',\n /** Grants permission to read CustomerGroup */\n ReadCustomerGroup = 'ReadCustomerGroup',\n /** Grants permission to read Facet */\n ReadFacet = 'ReadFacet',\n /** Grants permission to read Order */\n ReadOrder = 'ReadOrder',\n /** Grants permission to read PaymentMethod */\n ReadPaymentMethod = 'ReadPaymentMethod',\n /** Grants permission to read Product */\n ReadProduct = 'ReadProduct',\n /** Grants permission to read Promotion */\n ReadPromotion = 'ReadPromotion',\n /** Grants permission to read Seller */\n ReadSeller = 'ReadSeller',\n /** Grants permission to read PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n ReadSettings = 'ReadSettings',\n /** Grants permission to read ShippingMethod */\n ReadShippingMethod = 'ReadShippingMethod',\n /** Grants permission to read StockLocation */\n ReadStockLocation = 'ReadStockLocation',\n /** Grants permission to read System */\n ReadSystem = 'ReadSystem',\n /** Grants permission to read Tag */\n ReadTag = 'ReadTag',\n /** Grants permission to read TaxCategory */\n ReadTaxCategory = 'ReadTaxCategory',\n /** Grants permission to read TaxRate */\n ReadTaxRate = 'ReadTaxRate',\n /** Grants permission to read Zone */\n ReadZone = 'ReadZone',\n /** SuperAdmin has unrestricted access to all operations */\n SuperAdmin = 'SuperAdmin',\n /** Grants permission to update Administrator */\n UpdateAdministrator = 'UpdateAdministrator',\n /** Grants permission to update Asset */\n UpdateAsset = 'UpdateAsset',\n /** Grants permission to update Products, Facets, Assets, Collections */\n UpdateCatalog = 'UpdateCatalog',\n /** Grants permission to update Channel */\n UpdateChannel = 'UpdateChannel',\n /** Grants permission to update Collection */\n UpdateCollection = 'UpdateCollection',\n /** Grants permission to update Country */\n UpdateCountry = 'UpdateCountry',\n /** Grants permission to update Customer */\n UpdateCustomer = 'UpdateCustomer',\n /** Grants permission to update CustomerGroup */\n UpdateCustomerGroup = 'UpdateCustomerGroup',\n /** Grants permission to update Facet */\n UpdateFacet = 'UpdateFacet',\n /** Grants permission to update GlobalSettings */\n UpdateGlobalSettings = 'UpdateGlobalSettings',\n /** Grants permission to update Order */\n UpdateOrder = 'UpdateOrder',\n /** Grants permission to update PaymentMethod */\n UpdatePaymentMethod = 'UpdatePaymentMethod',\n /** Grants permission to update Product */\n UpdateProduct = 'UpdateProduct',\n /** Grants permission to update Promotion */\n UpdatePromotion = 'UpdatePromotion',\n /** Grants permission to update Seller */\n UpdateSeller = 'UpdateSeller',\n /** Grants permission to update PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */\n UpdateSettings = 'UpdateSettings',\n /** Grants permission to update ShippingMethod */\n UpdateShippingMethod = 'UpdateShippingMethod',\n /** Grants permission to update StockLocation */\n UpdateStockLocation = 'UpdateStockLocation',\n /** Grants permission to update System */\n UpdateSystem = 'UpdateSystem',\n /** Grants permission to update Tag */\n UpdateTag = 'UpdateTag',\n /** Grants permission to update TaxCategory */\n UpdateTaxCategory = 'UpdateTaxCategory',\n /** Grants permission to update TaxRate */\n UpdateTaxRate = 'UpdateTaxRate',\n /** Grants permission to update Zone */\n UpdateZone = 'UpdateZone'\n}\n\nexport type PermissionDefinition = {\n __typename?: 'PermissionDefinition';\n assignable: Scalars['Boolean']['output'];\n description: Scalars['String']['output'];\n name: Scalars['String']['output'];\n};\n\nexport type PreviewCollectionVariantsInput = {\n filters: Array<ConfigurableOperationInput>;\n inheritFilters: Scalars['Boolean']['input'];\n parentId?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** The price range where the result has more than one price */\nexport type PriceRange = {\n __typename?: 'PriceRange';\n max: Scalars['Money']['output'];\n min: Scalars['Money']['output'];\n};\n\nexport type Product = Node & {\n __typename?: 'Product';\n assets: Array<Asset>;\n channels: Array<Channel>;\n collections: Array<Collection>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n facetValues: Array<FacetValue>;\n featuredAsset?: Maybe<Asset>;\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n optionGroups: Array<ProductOptionGroup>;\n slug: Scalars['String']['output'];\n translations: Array<ProductTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n /** Returns a paginated, sortable, filterable list of ProductVariants */\n variantList: ProductVariantList;\n /** Returns all ProductVariants */\n variants: Array<ProductVariant>;\n};\n\n\nexport type ProductVariantListArgs = {\n options?: InputMaybe<ProductVariantListOptions>;\n};\n\nexport type ProductFilterParameter = {\n _and?: InputMaybe<Array<ProductFilterParameter>>;\n _or?: InputMaybe<Array<ProductFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n facetValueId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n sku?: InputMaybe<StringOperators>;\n slug?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ProductList = PaginatedList & {\n __typename?: 'ProductList';\n items: Array<Product>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProductListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProductFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProductSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProductOption = Node & {\n __typename?: 'ProductOption';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n group: ProductOptionGroup;\n groupId: Scalars['ID']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<ProductOptionTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionFilterParameter = {\n _and?: InputMaybe<Array<ProductOptionFilterParameter>>;\n _or?: InputMaybe<Array<ProductOptionFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n groupId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ProductOptionGroup = Node & {\n __typename?: 'ProductOptionGroup';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n options: Array<ProductOption>;\n translations: Array<ProductOptionGroupTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionGroupTranslation = {\n __typename?: 'ProductOptionGroupTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionGroupTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ProductOptionInUseError = ErrorResult & {\n __typename?: 'ProductOptionInUseError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n optionGroupCode: Scalars['String']['output'];\n productVariantCount: Scalars['Int']['output'];\n};\n\nexport type ProductOptionList = PaginatedList & {\n __typename?: 'ProductOptionList';\n items: Array<ProductOption>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProductOptionListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProductOptionFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProductOptionSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProductOptionSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n groupId?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProductOptionTranslation = {\n __typename?: 'ProductOptionTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductOptionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ProductSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n slug?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProductTranslation = {\n __typename?: 'ProductTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ProductVariant = Node & {\n __typename?: 'ProductVariant';\n assets: Array<Asset>;\n channels: Array<Channel>;\n createdAt: Scalars['DateTime']['output'];\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n enabled: Scalars['Boolean']['output'];\n facetValues: Array<FacetValue>;\n featuredAsset?: Maybe<Asset>;\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n options: Array<ProductOption>;\n outOfStockThreshold: Scalars['Int']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n prices: Array<ProductVariantPrice>;\n product: Product;\n productId: Scalars['ID']['output'];\n sku: Scalars['String']['output'];\n /** @deprecated use stockLevels */\n stockAllocated: Scalars['Int']['output'];\n stockLevel: Scalars['String']['output'];\n stockLevels: Array<StockLevel>;\n stockMovements: StockMovementList;\n /** @deprecated use stockLevels */\n stockOnHand: Scalars['Int']['output'];\n taxCategory: TaxCategory;\n taxRateApplied: TaxRate;\n trackInventory: GlobalFlag;\n translations: Array<ProductVariantTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n useGlobalOutOfStockThreshold: Scalars['Boolean']['output'];\n};\n\n\nexport type ProductVariantStockMovementsArgs = {\n options?: InputMaybe<StockMovementListOptions>;\n};\n\nexport type ProductVariantFilterParameter = {\n _and?: InputMaybe<Array<ProductVariantFilterParameter>>;\n _or?: InputMaybe<Array<ProductVariantFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n currencyCode?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n facetValueId?: InputMaybe<IdOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n outOfStockThreshold?: InputMaybe<NumberOperators>;\n price?: InputMaybe<NumberOperators>;\n priceWithTax?: InputMaybe<NumberOperators>;\n productId?: InputMaybe<IdOperators>;\n sku?: InputMaybe<StringOperators>;\n stockAllocated?: InputMaybe<NumberOperators>;\n stockLevel?: InputMaybe<StringOperators>;\n stockOnHand?: InputMaybe<NumberOperators>;\n trackInventory?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n useGlobalOutOfStockThreshold?: InputMaybe<BooleanOperators>;\n};\n\nexport type ProductVariantList = PaginatedList & {\n __typename?: 'ProductVariantList';\n items: Array<ProductVariant>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProductVariantListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProductVariantFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProductVariantSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProductVariantPrice = {\n __typename?: 'ProductVariantPrice';\n currencyCode: CurrencyCode;\n customFields?: Maybe<Scalars['JSON']['output']>;\n price: Scalars['Money']['output'];\n};\n\nexport type ProductVariantSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n outOfStockThreshold?: InputMaybe<SortOrder>;\n price?: InputMaybe<SortOrder>;\n priceWithTax?: InputMaybe<SortOrder>;\n productId?: InputMaybe<SortOrder>;\n sku?: InputMaybe<SortOrder>;\n stockAllocated?: InputMaybe<SortOrder>;\n stockLevel?: InputMaybe<SortOrder>;\n stockOnHand?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProductVariantTranslation = {\n __typename?: 'ProductVariantTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProductVariantTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type Promotion = Node & {\n __typename?: 'Promotion';\n actions: Array<ConfigurableOperation>;\n conditions: Array<ConfigurableOperation>;\n couponCode?: Maybe<Scalars['String']['output']>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n endsAt?: Maybe<Scalars['DateTime']['output']>;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n perCustomerUsageLimit?: Maybe<Scalars['Int']['output']>;\n startsAt?: Maybe<Scalars['DateTime']['output']>;\n translations: Array<PromotionTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n usageLimit?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type PromotionFilterParameter = {\n _and?: InputMaybe<Array<PromotionFilterParameter>>;\n _or?: InputMaybe<Array<PromotionFilterParameter>>;\n couponCode?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n endsAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n perCustomerUsageLimit?: InputMaybe<NumberOperators>;\n startsAt?: InputMaybe<DateOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n usageLimit?: InputMaybe<NumberOperators>;\n};\n\nexport type PromotionList = PaginatedList & {\n __typename?: 'PromotionList';\n items: Array<Promotion>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type PromotionListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<PromotionFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<PromotionSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type PromotionSortParameter = {\n couponCode?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n endsAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n perCustomerUsageLimit?: InputMaybe<SortOrder>;\n startsAt?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n usageLimit?: InputMaybe<SortOrder>;\n};\n\nexport type PromotionTranslation = {\n __typename?: 'PromotionTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type PromotionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type Province = Node & Region & {\n __typename?: 'Province';\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n parent?: Maybe<Region>;\n parentId?: Maybe<Scalars['ID']['output']>;\n translations: Array<RegionTranslation>;\n type: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ProvinceFilterParameter = {\n _and?: InputMaybe<Array<ProvinceFilterParameter>>;\n _or?: InputMaybe<Array<ProvinceFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n parentId?: InputMaybe<IdOperators>;\n type?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ProvinceList = PaginatedList & {\n __typename?: 'ProvinceList';\n items: Array<Province>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ProvinceListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ProvinceFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ProvinceSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ProvinceSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n parentId?: InputMaybe<SortOrder>;\n type?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ProvinceTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** Returned if the specified quantity of an OrderLine is greater than the number of items in that line */\nexport type QuantityTooGreatError = ErrorResult & {\n __typename?: 'QuantityTooGreatError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\nexport type Query = {\n __typename?: 'Query';\n activeAdministrator?: Maybe<Administrator>;\n activeChannel: Channel;\n administrator?: Maybe<Administrator>;\n administrators: AdministratorList;\n /** Get a single Asset by id */\n asset?: Maybe<Asset>;\n /** Get a list of Assets */\n assets: AssetList;\n channel?: Maybe<Channel>;\n channels: ChannelList;\n /** Get a Collection either by id or slug. If neither id nor slug is specified, an error will result. */\n collection?: Maybe<Collection>;\n collectionFilters: Array<ConfigurableOperationDefinition>;\n collections: CollectionList;\n countries: CountryList;\n country?: Maybe<Country>;\n customer?: Maybe<Customer>;\n customerGroup?: Maybe<CustomerGroup>;\n customerGroups: CustomerGroupList;\n customers: CustomerList;\n /** Returns a list of eligible shipping methods for the draft Order */\n eligibleShippingMethodsForDraftOrder: Array<ShippingMethodQuote>;\n /** Returns all configured EntityDuplicators. */\n entityDuplicators: Array<EntityDuplicatorDefinition>;\n facet?: Maybe<Facet>;\n facetValue?: Maybe<FacetValue>;\n facetValues: FacetValueList;\n facets: FacetList;\n fulfillmentHandlers: Array<ConfigurableOperationDefinition>;\n /** Get value for a specific key (automatically scoped based on field configuration) */\n getSettingsStoreValue?: Maybe<Scalars['JSON']['output']>;\n /** Get multiple key-value pairs (each automatically scoped) */\n getSettingsStoreValues?: Maybe<Scalars['JSON']['output']>;\n globalSettings: GlobalSettings;\n job?: Maybe<Job>;\n jobBufferSize: Array<JobBufferSize>;\n jobQueues: Array<JobQueue>;\n jobs: JobList;\n jobsById: Array<Job>;\n me?: Maybe<CurrentUser>;\n /** Get metrics for the given interval and metric types. */\n metricSummary: Array<MetricSummary>;\n order?: Maybe<Order>;\n orders: OrderList;\n paymentMethod?: Maybe<PaymentMethod>;\n paymentMethodEligibilityCheckers: Array<ConfigurableOperationDefinition>;\n paymentMethodHandlers: Array<ConfigurableOperationDefinition>;\n paymentMethods: PaymentMethodList;\n pendingSearchIndexUpdates: Scalars['Int']['output'];\n /** Used for real-time previews of the contents of a Collection */\n previewCollectionVariants: ProductVariantList;\n /** Get a Product either by id or slug. If neither id nor slug is specified, an error will result. */\n product?: Maybe<Product>;\n productOption?: Maybe<ProductOption>;\n productOptionGroup?: Maybe<ProductOptionGroup>;\n productOptionGroups: Array<ProductOptionGroup>;\n productOptions: ProductOptionList;\n /** Get a ProductVariant by id */\n productVariant?: Maybe<ProductVariant>;\n /** List ProductVariants either all or for the specific product. */\n productVariants: ProductVariantList;\n /** List Products */\n products: ProductList;\n promotion?: Maybe<Promotion>;\n promotionActions: Array<ConfigurableOperationDefinition>;\n promotionConditions: Array<ConfigurableOperationDefinition>;\n promotions: PromotionList;\n province?: Maybe<Province>;\n provinces: ProvinceList;\n role?: Maybe<Role>;\n roles: RoleList;\n scheduledTasks: Array<ScheduledTask>;\n search: SearchResponse;\n seller?: Maybe<Seller>;\n sellers: SellerList;\n shippingCalculators: Array<ConfigurableOperationDefinition>;\n shippingEligibilityCheckers: Array<ConfigurableOperationDefinition>;\n shippingMethod?: Maybe<ShippingMethod>;\n shippingMethods: ShippingMethodList;\n /** Generate slug for entity */\n slugForEntity: Scalars['String']['output'];\n stockLocation?: Maybe<StockLocation>;\n stockLocations: StockLocationList;\n tag: Tag;\n tags: TagList;\n taxCategories: TaxCategoryList;\n taxCategory?: Maybe<TaxCategory>;\n taxRate?: Maybe<TaxRate>;\n taxRates: TaxRateList;\n testEligibleShippingMethods: Array<ShippingMethodQuote>;\n testShippingMethod: TestShippingMethodResult;\n zone?: Maybe<Zone>;\n zones: ZoneList;\n};\n\n\nexport type QueryAdministratorArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryAdministratorsArgs = {\n options?: InputMaybe<AdministratorListOptions>;\n};\n\n\nexport type QueryAssetArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryAssetsArgs = {\n options?: InputMaybe<AssetListOptions>;\n};\n\n\nexport type QueryChannelArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryChannelsArgs = {\n options?: InputMaybe<ChannelListOptions>;\n};\n\n\nexport type QueryCollectionArgs = {\n id?: InputMaybe<Scalars['ID']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryCollectionsArgs = {\n options?: InputMaybe<CollectionListOptions>;\n};\n\n\nexport type QueryCountriesArgs = {\n options?: InputMaybe<CountryListOptions>;\n};\n\n\nexport type QueryCountryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryCustomerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryCustomerGroupArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryCustomerGroupsArgs = {\n options?: InputMaybe<CustomerGroupListOptions>;\n};\n\n\nexport type QueryCustomersArgs = {\n options?: InputMaybe<CustomerListOptions>;\n};\n\n\nexport type QueryEligibleShippingMethodsForDraftOrderArgs = {\n orderId: Scalars['ID']['input'];\n};\n\n\nexport type QueryFacetArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryFacetValueArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryFacetValuesArgs = {\n options?: InputMaybe<FacetValueListOptions>;\n};\n\n\nexport type QueryFacetsArgs = {\n options?: InputMaybe<FacetListOptions>;\n};\n\n\nexport type QueryGetSettingsStoreValueArgs = {\n key: Scalars['String']['input'];\n};\n\n\nexport type QueryGetSettingsStoreValuesArgs = {\n keys: Array<Scalars['String']['input']>;\n};\n\n\nexport type QueryJobArgs = {\n jobId: Scalars['ID']['input'];\n};\n\n\nexport type QueryJobBufferSizeArgs = {\n bufferIds?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n\nexport type QueryJobsArgs = {\n options?: InputMaybe<JobListOptions>;\n};\n\n\nexport type QueryJobsByIdArgs = {\n jobIds: Array<Scalars['ID']['input']>;\n};\n\n\nexport type QueryMetricSummaryArgs = {\n input?: InputMaybe<MetricSummaryInput>;\n};\n\n\nexport type QueryOrderArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryOrdersArgs = {\n options?: InputMaybe<OrderListOptions>;\n};\n\n\nexport type QueryPaymentMethodArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryPaymentMethodsArgs = {\n options?: InputMaybe<PaymentMethodListOptions>;\n};\n\n\nexport type QueryPreviewCollectionVariantsArgs = {\n input: PreviewCollectionVariantsInput;\n options?: InputMaybe<ProductVariantListOptions>;\n};\n\n\nexport type QueryProductArgs = {\n id?: InputMaybe<Scalars['ID']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryProductOptionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProductOptionGroupArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProductOptionGroupsArgs = {\n filterTerm?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryProductOptionsArgs = {\n groupId?: InputMaybe<Scalars['ID']['input']>;\n options?: InputMaybe<ProductOptionListOptions>;\n};\n\n\nexport type QueryProductVariantArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProductVariantsArgs = {\n options?: InputMaybe<ProductVariantListOptions>;\n productId?: InputMaybe<Scalars['ID']['input']>;\n};\n\n\nexport type QueryProductsArgs = {\n options?: InputMaybe<ProductListOptions>;\n};\n\n\nexport type QueryPromotionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryPromotionsArgs = {\n options?: InputMaybe<PromotionListOptions>;\n};\n\n\nexport type QueryProvinceArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryProvincesArgs = {\n options?: InputMaybe<ProvinceListOptions>;\n};\n\n\nexport type QueryRoleArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryRolesArgs = {\n options?: InputMaybe<RoleListOptions>;\n};\n\n\nexport type QuerySearchArgs = {\n input: SearchInput;\n};\n\n\nexport type QuerySellerArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QuerySellersArgs = {\n options?: InputMaybe<SellerListOptions>;\n};\n\n\nexport type QueryShippingMethodArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryShippingMethodsArgs = {\n options?: InputMaybe<ShippingMethodListOptions>;\n};\n\n\nexport type QuerySlugForEntityArgs = {\n input: SlugForEntityInput;\n};\n\n\nexport type QueryStockLocationArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryStockLocationsArgs = {\n options?: InputMaybe<StockLocationListOptions>;\n};\n\n\nexport type QueryTagArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTagsArgs = {\n options?: InputMaybe<TagListOptions>;\n};\n\n\nexport type QueryTaxCategoriesArgs = {\n options?: InputMaybe<TaxCategoryListOptions>;\n};\n\n\nexport type QueryTaxCategoryArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTaxRateArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTaxRatesArgs = {\n options?: InputMaybe<TaxRateListOptions>;\n};\n\n\nexport type QueryTestEligibleShippingMethodsArgs = {\n input: TestEligibleShippingMethodsInput;\n};\n\n\nexport type QueryTestShippingMethodArgs = {\n input: TestShippingMethodInput;\n};\n\n\nexport type QueryZoneArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryZonesArgs = {\n options?: InputMaybe<ZoneListOptions>;\n};\n\nexport type Refund = Node & {\n __typename?: 'Refund';\n adjustment: Scalars['Money']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n items: Scalars['Money']['output'];\n lines: Array<RefundLine>;\n metadata?: Maybe<Scalars['JSON']['output']>;\n method?: Maybe<Scalars['String']['output']>;\n paymentId: Scalars['ID']['output'];\n reason?: Maybe<Scalars['String']['output']>;\n shipping: Scalars['Money']['output'];\n state: Scalars['String']['output'];\n total: Scalars['Money']['output'];\n transactionId?: Maybe<Scalars['String']['output']>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\n/** Returned if `amount` is greater than the maximum un-refunded amount of the Payment */\nexport type RefundAmountError = ErrorResult & {\n __typename?: 'RefundAmountError';\n errorCode: ErrorCode;\n maximumRefundable: Scalars['Int']['output'];\n message: Scalars['String']['output'];\n};\n\nexport type RefundLine = {\n __typename?: 'RefundLine';\n orderLine: OrderLine;\n orderLineId: Scalars['ID']['output'];\n quantity: Scalars['Int']['output'];\n refund: Refund;\n refundId: Scalars['ID']['output'];\n};\n\nexport type RefundOrderInput = {\n /** @deprecated Use the `amount` field instead */\n adjustment?: InputMaybe<Scalars['Money']['input']>;\n /**\n * The amount to be refunded to this particular payment. This was introduced in v2.2.0 as the preferred way to specify the refund amount.\n * Can be as much as the total amount of the payment minus the sum of all previous refunds.\n */\n amount?: InputMaybe<Scalars['Money']['input']>;\n /** @deprecated Use the `amount` field instead */\n lines?: InputMaybe<Array<OrderLineInput>>;\n paymentId: Scalars['ID']['input'];\n reason?: InputMaybe<Scalars['String']['input']>;\n /** @deprecated Use the `amount` field instead */\n shipping?: InputMaybe<Scalars['Money']['input']>;\n};\n\nexport type RefundOrderResult = AlreadyRefundedError | MultipleOrderError | NothingToRefundError | OrderStateTransitionError | PaymentOrderMismatchError | QuantityTooGreatError | Refund | RefundAmountError | RefundOrderStateError | RefundStateTransitionError;\n\n/** Returned if an attempting to refund an Order which is not in the expected state */\nexport type RefundOrderStateError = ErrorResult & {\n __typename?: 'RefundOrderStateError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n orderState: Scalars['String']['output'];\n};\n\n/**\n * Returned when a call to modifyOrder fails to include a refundPaymentId even\n * though the price has decreased as a result of the changes.\n */\nexport type RefundPaymentIdMissingError = ErrorResult & {\n __typename?: 'RefundPaymentIdMissingError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n};\n\n/** Returned when there is an error in transitioning the Refund state */\nexport type RefundStateTransitionError = ErrorResult & {\n __typename?: 'RefundStateTransitionError';\n errorCode: ErrorCode;\n fromState: Scalars['String']['output'];\n message: Scalars['String']['output'];\n toState: Scalars['String']['output'];\n transitionError: Scalars['String']['output'];\n};\n\nexport type Region = {\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n parent?: Maybe<Region>;\n parentId?: Maybe<Scalars['ID']['output']>;\n translations: Array<RegionTranslation>;\n type: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RegionTranslation = {\n __typename?: 'RegionTranslation';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RelationCustomFieldConfig = CustomField & {\n __typename?: 'RelationCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n entity: Scalars['String']['output'];\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n scalarFields: Array<Scalars['String']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type Release = Node & StockMovement & {\n __typename?: 'Release';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RemoveCollectionsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n collectionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveFacetFromChannelResult = Facet | FacetInUseError;\n\nexport type RemoveFacetsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n facetIds: Array<Scalars['ID']['input']>;\n force?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type RemoveOptionGroupFromProductResult = Product | ProductOptionInUseError;\n\nexport type RemoveOrderItemsResult = Order | OrderInterceptorError | OrderModificationError;\n\nexport type RemovePaymentMethodsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n paymentMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveProductVariantsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n productVariantIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveProductsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n productIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemovePromotionsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n promotionIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveShippingMethodsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n shippingMethodIds: Array<Scalars['ID']['input']>;\n};\n\nexport type RemoveStockLocationsFromChannelInput = {\n channelId: Scalars['ID']['input'];\n stockLocationIds: Array<Scalars['ID']['input']>;\n};\n\nexport type Return = Node & StockMovement & {\n __typename?: 'Return';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type Role = Node & {\n __typename?: 'Role';\n channels: Array<Channel>;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n permissions: Array<Permission>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type RoleFilterParameter = {\n _and?: InputMaybe<Array<RoleFilterParameter>>;\n _or?: InputMaybe<Array<RoleFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type RoleList = PaginatedList & {\n __typename?: 'RoleList';\n items: Array<Role>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type RoleListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<RoleFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<RoleSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RoleSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type Sale = Node & StockMovement & {\n __typename?: 'Sale';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ScheduledTask = {\n __typename?: 'ScheduledTask';\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n id: Scalars['String']['output'];\n isRunning: Scalars['Boolean']['output'];\n lastExecutedAt?: Maybe<Scalars['DateTime']['output']>;\n lastResult?: Maybe<Scalars['JSON']['output']>;\n nextExecutionAt?: Maybe<Scalars['DateTime']['output']>;\n schedule: Scalars['String']['output'];\n scheduleDescription: Scalars['String']['output'];\n};\n\nexport type SearchInput = {\n collectionId?: InputMaybe<Scalars['ID']['input']>;\n collectionSlug?: InputMaybe<Scalars['String']['input']>;\n facetValueFilters?: InputMaybe<Array<FacetValueFilterInput>>;\n /** @deprecated Use `facetValueFilters` instead */\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n /** @deprecated Use `facetValueFilters` instead */\n facetValueOperator?: InputMaybe<LogicalOperator>;\n groupByProduct?: InputMaybe<Scalars['Boolean']['input']>;\n skip?: InputMaybe<Scalars['Int']['input']>;\n sort?: InputMaybe<SearchResultSortParameter>;\n take?: InputMaybe<Scalars['Int']['input']>;\n term?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type SearchReindexResponse = {\n __typename?: 'SearchReindexResponse';\n success: Scalars['Boolean']['output'];\n};\n\nexport type SearchResponse = {\n __typename?: 'SearchResponse';\n collections: Array<CollectionResult>;\n facetValues: Array<FacetValueResult>;\n items: Array<SearchResult>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type SearchResult = {\n __typename?: 'SearchResult';\n /** An array of ids of the Channels in which this result appears */\n channelIds: Array<Scalars['ID']['output']>;\n /** An array of ids of the Collections in which this result appears */\n collectionIds: Array<Scalars['ID']['output']>;\n currencyCode: CurrencyCode;\n description: Scalars['String']['output'];\n enabled: Scalars['Boolean']['output'];\n facetIds: Array<Scalars['ID']['output']>;\n facetValueIds: Array<Scalars['ID']['output']>;\n price: SearchResultPrice;\n priceWithTax: SearchResultPrice;\n productAsset?: Maybe<SearchResultAsset>;\n productId: Scalars['ID']['output'];\n productName: Scalars['String']['output'];\n productVariantAsset?: Maybe<SearchResultAsset>;\n productVariantId: Scalars['ID']['output'];\n productVariantName: Scalars['String']['output'];\n /** A relevance score for the result. Differs between database implementations */\n score: Scalars['Float']['output'];\n sku: Scalars['String']['output'];\n slug: Scalars['String']['output'];\n};\n\nexport type SearchResultAsset = {\n __typename?: 'SearchResultAsset';\n focalPoint?: Maybe<Coordinate>;\n id: Scalars['ID']['output'];\n preview: Scalars['String']['output'];\n};\n\n/** The price of a search result product, either as a range or as a single price */\nexport type SearchResultPrice = PriceRange | SinglePrice;\n\nexport type SearchResultSortParameter = {\n name?: InputMaybe<SortOrder>;\n price?: InputMaybe<SortOrder>;\n};\n\nexport type Seller = Node & {\n __typename?: 'Seller';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type SellerFilterParameter = {\n _and?: InputMaybe<Array<SellerFilterParameter>>;\n _or?: InputMaybe<Array<SellerFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type SellerList = PaginatedList & {\n __typename?: 'SellerList';\n items: Array<Seller>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type SellerListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<SellerFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<SellerSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type SellerSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ServerConfig = {\n __typename?: 'ServerConfig';\n /**\n * This field is deprecated in v2.2 in favor of the entityCustomFields field,\n * which allows custom fields to be defined on user-supplies entities.\n */\n customFieldConfig: CustomFields;\n entityCustomFields: Array<EntityCustomFields>;\n moneyStrategyPrecision: Scalars['Int']['output'];\n orderProcess: Array<OrderProcessState>;\n permissions: Array<PermissionDefinition>;\n permittedAssetTypes: Array<Scalars['String']['output']>;\n};\n\nexport type SetCustomerForDraftOrderResult = EmailAddressConflictError | Order;\n\nexport type SetOrderCustomerInput = {\n customerId: Scalars['ID']['input'];\n note?: InputMaybe<Scalars['String']['input']>;\n orderId: Scalars['ID']['input'];\n};\n\nexport type SetOrderShippingMethodResult = IneligibleShippingMethodError | NoActiveOrderError | Order | OrderModificationError;\n\nexport type SetSettingsStoreValueResult = {\n __typename?: 'SetSettingsStoreValueResult';\n error?: Maybe<Scalars['String']['output']>;\n key: Scalars['String']['output'];\n result: Scalars['Boolean']['output'];\n};\n\nexport type SettingsStoreInput = {\n key: Scalars['String']['input'];\n value: Scalars['JSON']['input'];\n};\n\n/** Returned if the Payment settlement fails */\nexport type SettlePaymentError = ErrorResult & {\n __typename?: 'SettlePaymentError';\n errorCode: ErrorCode;\n message: Scalars['String']['output'];\n paymentErrorMessage: Scalars['String']['output'];\n};\n\nexport type SettlePaymentResult = OrderStateTransitionError | Payment | PaymentStateTransitionError | SettlePaymentError;\n\nexport type SettleRefundInput = {\n id: Scalars['ID']['input'];\n transactionId: Scalars['String']['input'];\n};\n\nexport type SettleRefundResult = Refund | RefundStateTransitionError;\n\nexport type ShippingLine = {\n __typename?: 'ShippingLine';\n customFields?: Maybe<Scalars['JSON']['output']>;\n discountedPrice: Scalars['Money']['output'];\n discountedPriceWithTax: Scalars['Money']['output'];\n discounts: Array<Discount>;\n id: Scalars['ID']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n shippingMethod: ShippingMethod;\n};\n\nexport type ShippingMethod = Node & {\n __typename?: 'ShippingMethod';\n calculator: ConfigurableOperation;\n checker: ConfigurableOperation;\n code: Scalars['String']['output'];\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n fulfillmentHandlerCode: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n translations: Array<ShippingMethodTranslation>;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ShippingMethodFilterParameter = {\n _and?: InputMaybe<Array<ShippingMethodFilterParameter>>;\n _or?: InputMaybe<Array<ShippingMethodFilterParameter>>;\n code?: InputMaybe<StringOperators>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n fulfillmentHandlerCode?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n languageCode?: InputMaybe<StringOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ShippingMethodList = PaginatedList & {\n __typename?: 'ShippingMethodList';\n items: Array<ShippingMethod>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ShippingMethodListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ShippingMethodFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ShippingMethodSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ShippingMethodQuote = {\n __typename?: 'ShippingMethodQuote';\n code: Scalars['String']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n /** Any optional metadata returned by the ShippingCalculator in the ShippingCalculationResult */\n metadata?: Maybe<Scalars['JSON']['output']>;\n name: Scalars['String']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n};\n\nexport type ShippingMethodSortParameter = {\n code?: InputMaybe<SortOrder>;\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n fulfillmentHandlerCode?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type ShippingMethodTranslation = {\n __typename?: 'ShippingMethodTranslation';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n languageCode: LanguageCode;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ShippingMethodTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The price value where the result has a single price */\nexport type SinglePrice = {\n __typename?: 'SinglePrice';\n value: Scalars['Money']['output'];\n};\n\nexport type SlugForEntityInput = {\n entityId?: InputMaybe<Scalars['ID']['input']>;\n entityName: Scalars['String']['input'];\n fieldName: Scalars['String']['input'];\n inputValue: Scalars['String']['input'];\n};\n\nexport enum SortOrder {\n ASC = 'ASC',\n DESC = 'DESC'\n}\n\nexport type StockAdjustment = Node & StockMovement & {\n __typename?: 'StockAdjustment';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockLevel = Node & {\n __typename?: 'StockLevel';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n stockAllocated: Scalars['Int']['output'];\n stockLocation: StockLocation;\n stockLocationId: Scalars['ID']['output'];\n stockOnHand: Scalars['Int']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockLevelInput = {\n stockLocationId: Scalars['ID']['input'];\n stockOnHand: Scalars['Int']['input'];\n};\n\nexport type StockLocation = Node & {\n __typename?: 'StockLocation';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockLocationFilterParameter = {\n _and?: InputMaybe<Array<StockLocationFilterParameter>>;\n _or?: InputMaybe<Array<StockLocationFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n description?: InputMaybe<StringOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type StockLocationList = PaginatedList & {\n __typename?: 'StockLocationList';\n items: Array<StockLocation>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type StockLocationListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<StockLocationFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<StockLocationSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type StockLocationSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n description?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type StockMovement = {\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n productVariant: ProductVariant;\n quantity: Scalars['Int']['output'];\n type: StockMovementType;\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type StockMovementItem = Allocation | Cancellation | Release | Return | Sale | StockAdjustment;\n\nexport type StockMovementList = {\n __typename?: 'StockMovementList';\n items: Array<StockMovementItem>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type StockMovementListOptions = {\n skip?: InputMaybe<Scalars['Int']['input']>;\n take?: InputMaybe<Scalars['Int']['input']>;\n type?: InputMaybe<StockMovementType>;\n};\n\nexport enum StockMovementType {\n ADJUSTMENT = 'ADJUSTMENT',\n ALLOCATION = 'ALLOCATION',\n CANCELLATION = 'CANCELLATION',\n RELEASE = 'RELEASE',\n RETURN = 'RETURN',\n SALE = 'SALE'\n}\n\nexport type StringCustomFieldConfig = CustomField & {\n __typename?: 'StringCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n length?: Maybe<Scalars['Int']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n options?: Maybe<Array<StringFieldOption>>;\n pattern?: Maybe<Scalars['String']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StringFieldOption = {\n __typename?: 'StringFieldOption';\n label?: Maybe<Array<LocalizedString>>;\n value: Scalars['String']['output'];\n};\n\n/** Operators for filtering on a list of String fields */\nexport type StringListOperators = {\n inList: Scalars['String']['input'];\n};\n\n/** Operators for filtering on a String field */\nexport type StringOperators = {\n contains?: InputMaybe<Scalars['String']['input']>;\n eq?: InputMaybe<Scalars['String']['input']>;\n in?: InputMaybe<Array<Scalars['String']['input']>>;\n isNull?: InputMaybe<Scalars['Boolean']['input']>;\n notContains?: InputMaybe<Scalars['String']['input']>;\n notEq?: InputMaybe<Scalars['String']['input']>;\n notIn?: InputMaybe<Array<Scalars['String']['input']>>;\n regex?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type StringStructFieldConfig = StructField & {\n __typename?: 'StringStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n length?: Maybe<Scalars['Int']['output']>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n options?: Maybe<Array<StringFieldOption>>;\n pattern?: Maybe<Scalars['String']['output']>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StructCustomFieldConfig = CustomField & {\n __typename?: 'StructCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n fields: Array<StructFieldConfig>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StructField = {\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list?: Maybe<Scalars['Boolean']['output']>;\n name: Scalars['String']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type StructFieldConfig = BooleanStructFieldConfig | DateTimeStructFieldConfig | FloatStructFieldConfig | IntStructFieldConfig | StringStructFieldConfig | TextStructFieldConfig;\n\n/** Indicates that an operation succeeded, where we do not want to return any more specific information. */\nexport type Success = {\n __typename?: 'Success';\n success: Scalars['Boolean']['output'];\n};\n\nexport type Surcharge = Node & {\n __typename?: 'Surcharge';\n createdAt: Scalars['DateTime']['output'];\n description: Scalars['String']['output'];\n id: Scalars['ID']['output'];\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n sku?: Maybe<Scalars['String']['output']>;\n taxLines: Array<TaxLine>;\n taxRate: Scalars['Float']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type SurchargeInput = {\n description: Scalars['String']['input'];\n price: Scalars['Money']['input'];\n priceIncludesTax: Scalars['Boolean']['input'];\n sku?: InputMaybe<Scalars['String']['input']>;\n taxDescription?: InputMaybe<Scalars['String']['input']>;\n taxRate?: InputMaybe<Scalars['Float']['input']>;\n};\n\nexport type Tag = Node & {\n __typename?: 'Tag';\n createdAt: Scalars['DateTime']['output'];\n id: Scalars['ID']['output'];\n updatedAt: Scalars['DateTime']['output'];\n value: Scalars['String']['output'];\n};\n\nexport type TagFilterParameter = {\n _and?: InputMaybe<Array<TagFilterParameter>>;\n _or?: InputMaybe<Array<TagFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n value?: InputMaybe<StringOperators>;\n};\n\nexport type TagList = PaginatedList & {\n __typename?: 'TagList';\n items: Array<Tag>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type TagListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<TagFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<TagSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type TagSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n value?: InputMaybe<SortOrder>;\n};\n\nexport type TaxCategory = Node & {\n __typename?: 'TaxCategory';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n isDefault: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type TaxCategoryFilterParameter = {\n _and?: InputMaybe<Array<TaxCategoryFilterParameter>>;\n _or?: InputMaybe<Array<TaxCategoryFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n isDefault?: InputMaybe<BooleanOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type TaxCategoryList = PaginatedList & {\n __typename?: 'TaxCategoryList';\n items: Array<TaxCategory>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type TaxCategoryListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<TaxCategoryFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<TaxCategorySortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type TaxCategorySortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n\nexport type TaxLine = {\n __typename?: 'TaxLine';\n description: Scalars['String']['output'];\n taxRate: Scalars['Float']['output'];\n};\n\nexport type TaxRate = Node & {\n __typename?: 'TaxRate';\n category: TaxCategory;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n customerGroup?: Maybe<CustomerGroup>;\n enabled: Scalars['Boolean']['output'];\n id: Scalars['ID']['output'];\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n value: Scalars['Float']['output'];\n zone: Zone;\n};\n\nexport type TaxRateFilterParameter = {\n _and?: InputMaybe<Array<TaxRateFilterParameter>>;\n _or?: InputMaybe<Array<TaxRateFilterParameter>>;\n categoryId?: InputMaybe<IdOperators>;\n createdAt?: InputMaybe<DateOperators>;\n enabled?: InputMaybe<BooleanOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n value?: InputMaybe<NumberOperators>;\n zoneId?: InputMaybe<IdOperators>;\n};\n\nexport type TaxRateList = PaginatedList & {\n __typename?: 'TaxRateList';\n items: Array<TaxRate>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type TaxRateListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<TaxRateFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<TaxRateSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type TaxRateSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n value?: InputMaybe<SortOrder>;\n};\n\nexport type TestEligibleShippingMethodsInput = {\n lines: Array<TestShippingMethodOrderLineInput>;\n shippingAddress: CreateAddressInput;\n};\n\nexport type TestShippingMethodInput = {\n calculator: ConfigurableOperationInput;\n checker: ConfigurableOperationInput;\n lines: Array<TestShippingMethodOrderLineInput>;\n shippingAddress: CreateAddressInput;\n};\n\nexport type TestShippingMethodOrderLineInput = {\n productVariantId: Scalars['ID']['input'];\n quantity: Scalars['Int']['input'];\n};\n\nexport type TestShippingMethodQuote = {\n __typename?: 'TestShippingMethodQuote';\n metadata?: Maybe<Scalars['JSON']['output']>;\n price: Scalars['Money']['output'];\n priceWithTax: Scalars['Money']['output'];\n};\n\nexport type TestShippingMethodResult = {\n __typename?: 'TestShippingMethodResult';\n eligible: Scalars['Boolean']['output'];\n quote?: Maybe<TestShippingMethodQuote>;\n};\n\nexport type TextCustomFieldConfig = CustomField & {\n __typename?: 'TextCustomFieldConfig';\n deprecated?: Maybe<Scalars['Boolean']['output']>;\n deprecationReason?: Maybe<Scalars['String']['output']>;\n description?: Maybe<Array<LocalizedString>>;\n internal?: Maybe<Scalars['Boolean']['output']>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n nullable?: Maybe<Scalars['Boolean']['output']>;\n readonly?: Maybe<Scalars['Boolean']['output']>;\n requiresPermission?: Maybe<Array<Permission>>;\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type TextStructFieldConfig = StructField & {\n __typename?: 'TextStructFieldConfig';\n description?: Maybe<Array<LocalizedString>>;\n label?: Maybe<Array<LocalizedString>>;\n list: Scalars['Boolean']['output'];\n name: Scalars['String']['output'];\n type: Scalars['String']['output'];\n ui?: Maybe<Scalars['JSON']['output']>;\n};\n\nexport type TransitionFulfillmentToStateResult = Fulfillment | FulfillmentStateTransitionError;\n\nexport type TransitionOrderToStateResult = Order | OrderStateTransitionError;\n\nexport type TransitionPaymentToStateResult = Payment | PaymentStateTransitionError;\n\nexport type UpdateActiveAdministratorInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress?: InputMaybe<Scalars['String']['input']>;\n firstName?: InputMaybe<Scalars['String']['input']>;\n lastName?: InputMaybe<Scalars['String']['input']>;\n password?: InputMaybe<Scalars['String']['input']>;\n};\n\n/**\n * Input used to update an Address.\n *\n * The countryCode must correspond to a `code` property of a Country that has been defined in the\n * Vendure server. The `code` property is typically a 2-character ISO code such as \"GB\", \"US\", \"DE\" etc.\n * If an invalid code is passed, the mutation will fail.\n */\nexport type UpdateAddressInput = {\n city?: InputMaybe<Scalars['String']['input']>;\n company?: InputMaybe<Scalars['String']['input']>;\n countryCode?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultBillingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n defaultShippingAddress?: InputMaybe<Scalars['Boolean']['input']>;\n fullName?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n postalCode?: InputMaybe<Scalars['String']['input']>;\n province?: InputMaybe<Scalars['String']['input']>;\n streetLine1?: InputMaybe<Scalars['String']['input']>;\n streetLine2?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateAdministratorInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress?: InputMaybe<Scalars['String']['input']>;\n firstName?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n lastName?: InputMaybe<Scalars['String']['input']>;\n password?: InputMaybe<Scalars['String']['input']>;\n roleIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type UpdateAssetInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n focalPoint?: InputMaybe<CoordinateInput>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n tags?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type UpdateChannelInput = {\n availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;\n availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;\n code?: InputMaybe<Scalars['String']['input']>;\n /** @deprecated Use defaultCurrencyCode instead */\n currencyCode?: InputMaybe<CurrencyCode>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n defaultCurrencyCode?: InputMaybe<CurrencyCode>;\n defaultLanguageCode?: InputMaybe<LanguageCode>;\n defaultShippingZoneId?: InputMaybe<Scalars['ID']['input']>;\n defaultTaxZoneId?: InputMaybe<Scalars['ID']['input']>;\n id: Scalars['ID']['input'];\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n pricesIncludeTax?: InputMaybe<Scalars['Boolean']['input']>;\n sellerId?: InputMaybe<Scalars['ID']['input']>;\n token?: InputMaybe<Scalars['String']['input']>;\n trackInventory?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type UpdateChannelResult = Channel | LanguageNotAvailableError;\n\nexport type UpdateCollectionInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n filters?: InputMaybe<Array<ConfigurableOperationInput>>;\n id: Scalars['ID']['input'];\n inheritFilters?: InputMaybe<Scalars['Boolean']['input']>;\n isPrivate?: InputMaybe<Scalars['Boolean']['input']>;\n parentId?: InputMaybe<Scalars['ID']['input']>;\n translations?: InputMaybe<Array<UpdateCollectionTranslationInput>>;\n};\n\nexport type UpdateCollectionTranslationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id?: InputMaybe<Scalars['ID']['input']>;\n languageCode: LanguageCode;\n name?: InputMaybe<Scalars['String']['input']>;\n slug?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateCountryInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<CountryTranslationInput>>;\n};\n\nexport type UpdateCustomerGroupInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateCustomerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n emailAddress?: InputMaybe<Scalars['String']['input']>;\n firstName?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n lastName?: InputMaybe<Scalars['String']['input']>;\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n title?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateCustomerNoteInput = {\n note: Scalars['String']['input'];\n noteId: Scalars['ID']['input'];\n};\n\nexport type UpdateCustomerResult = Customer | EmailAddressConflictError;\n\nexport type UpdateFacetInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n isPrivate?: InputMaybe<Scalars['Boolean']['input']>;\n translations?: InputMaybe<Array<FacetTranslationInput>>;\n};\n\nexport type UpdateFacetValueInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<FacetValueTranslationInput>>;\n};\n\nexport type UpdateGlobalSettingsInput = {\n availableLanguages?: InputMaybe<Array<LanguageCode>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n trackInventory?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type UpdateGlobalSettingsResult = ChannelDefaultLanguageError | GlobalSettings;\n\nexport type UpdateOrderAddressInput = {\n city?: InputMaybe<Scalars['String']['input']>;\n company?: InputMaybe<Scalars['String']['input']>;\n countryCode?: InputMaybe<Scalars['String']['input']>;\n fullName?: InputMaybe<Scalars['String']['input']>;\n phoneNumber?: InputMaybe<Scalars['String']['input']>;\n postalCode?: InputMaybe<Scalars['String']['input']>;\n province?: InputMaybe<Scalars['String']['input']>;\n streetLine1?: InputMaybe<Scalars['String']['input']>;\n streetLine2?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateOrderInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n};\n\n/** Union type of all possible errors that can occur when adding or removing items from an Order. */\nexport type UpdateOrderItemErrorResult = InsufficientStockError | NegativeQuantityError | OrderInterceptorError | OrderLimitError | OrderModificationError;\n\nexport type UpdateOrderItemsResult = InsufficientStockError | NegativeQuantityError | Order | OrderInterceptorError | OrderLimitError | OrderModificationError;\n\nexport type UpdateOrderNoteInput = {\n isPublic?: InputMaybe<Scalars['Boolean']['input']>;\n note?: InputMaybe<Scalars['String']['input']>;\n noteId: Scalars['ID']['input'];\n};\n\nexport type UpdatePaymentMethodInput = {\n checker?: InputMaybe<ConfigurableOperationInput>;\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n handler?: InputMaybe<ConfigurableOperationInput>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<PaymentMethodTranslationInput>>;\n};\n\nexport type UpdateProductInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProductTranslationInput>>;\n};\n\nexport type UpdateProductOptionGroupInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProductOptionGroupTranslationInput>>;\n};\n\nexport type UpdateProductOptionInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProductOptionGroupTranslationInput>>;\n};\n\nexport type UpdateProductVariantInput = {\n assetIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n facetValueIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n featuredAssetId?: InputMaybe<Scalars['ID']['input']>;\n id: Scalars['ID']['input'];\n optionIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n outOfStockThreshold?: InputMaybe<Scalars['Int']['input']>;\n /** Sets the price for the ProductVariant in the Channel's default currency */\n price?: InputMaybe<Scalars['Money']['input']>;\n /** Allows multiple prices to be set for the ProductVariant in different currencies. */\n prices?: InputMaybe<Array<UpdateProductVariantPriceInput>>;\n sku?: InputMaybe<Scalars['String']['input']>;\n stockLevels?: InputMaybe<Array<StockLevelInput>>;\n stockOnHand?: InputMaybe<Scalars['Int']['input']>;\n taxCategoryId?: InputMaybe<Scalars['ID']['input']>;\n trackInventory?: InputMaybe<GlobalFlag>;\n translations?: InputMaybe<Array<ProductVariantTranslationInput>>;\n useGlobalOutOfStockThreshold?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\n/**\n * Used to set up update the price of a ProductVariant in a particular Channel.\n * If the `delete` flag is `true`, the price will be deleted for the given Channel.\n */\nexport type UpdateProductVariantPriceInput = {\n currencyCode: CurrencyCode;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n delete?: InputMaybe<Scalars['Boolean']['input']>;\n price: Scalars['Money']['input'];\n};\n\nexport type UpdatePromotionInput = {\n actions?: InputMaybe<Array<ConfigurableOperationInput>>;\n conditions?: InputMaybe<Array<ConfigurableOperationInput>>;\n couponCode?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n endsAt?: InputMaybe<Scalars['DateTime']['input']>;\n id: Scalars['ID']['input'];\n perCustomerUsageLimit?: InputMaybe<Scalars['Int']['input']>;\n startsAt?: InputMaybe<Scalars['DateTime']['input']>;\n translations?: InputMaybe<Array<PromotionTranslationInput>>;\n usageLimit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type UpdatePromotionResult = MissingConditionsError | Promotion;\n\nexport type UpdateProvinceInput = {\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n translations?: InputMaybe<Array<ProvinceTranslationInput>>;\n};\n\nexport type UpdateRoleInput = {\n channelIds?: InputMaybe<Array<Scalars['ID']['input']>>;\n code?: InputMaybe<Scalars['String']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n permissions?: InputMaybe<Array<Permission>>;\n};\n\nexport type UpdateScheduledTaskInput = {\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['String']['input'];\n};\n\nexport type UpdateSellerInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateShippingMethodInput = {\n calculator?: InputMaybe<ConfigurableOperationInput>;\n checker?: InputMaybe<ConfigurableOperationInput>;\n code?: InputMaybe<Scalars['String']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n fulfillmentHandler?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n translations: Array<ShippingMethodTranslationInput>;\n};\n\nexport type UpdateStockLocationInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n description?: InputMaybe<Scalars['String']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateTagInput = {\n id: Scalars['ID']['input'];\n value?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateTaxCategoryInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n isDefault?: InputMaybe<Scalars['Boolean']['input']>;\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type UpdateTaxRateInput = {\n categoryId?: InputMaybe<Scalars['ID']['input']>;\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n customerGroupId?: InputMaybe<Scalars['ID']['input']>;\n enabled?: InputMaybe<Scalars['Boolean']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n value?: InputMaybe<Scalars['Float']['input']>;\n zoneId?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type UpdateZoneInput = {\n customFields?: InputMaybe<Scalars['JSON']['input']>;\n id: Scalars['ID']['input'];\n name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type User = Node & {\n __typename?: 'User';\n authenticationMethods: Array<AuthenticationMethod>;\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n identifier: Scalars['String']['output'];\n lastLogin?: Maybe<Scalars['DateTime']['output']>;\n roles: Array<Role>;\n updatedAt: Scalars['DateTime']['output'];\n verified: Scalars['Boolean']['output'];\n};\n\nexport type Zone = Node & {\n __typename?: 'Zone';\n createdAt: Scalars['DateTime']['output'];\n customFields?: Maybe<Scalars['JSON']['output']>;\n id: Scalars['ID']['output'];\n members: Array<Region>;\n name: Scalars['String']['output'];\n updatedAt: Scalars['DateTime']['output'];\n};\n\nexport type ZoneFilterParameter = {\n _and?: InputMaybe<Array<ZoneFilterParameter>>;\n _or?: InputMaybe<Array<ZoneFilterParameter>>;\n createdAt?: InputMaybe<DateOperators>;\n id?: InputMaybe<IdOperators>;\n name?: InputMaybe<StringOperators>;\n updatedAt?: InputMaybe<DateOperators>;\n};\n\nexport type ZoneList = PaginatedList & {\n __typename?: 'ZoneList';\n items: Array<Zone>;\n totalItems: Scalars['Int']['output'];\n};\n\nexport type ZoneListOptions = {\n /** Allows the results to be filtered */\n filter?: InputMaybe<ZoneFilterParameter>;\n /** Specifies whether multiple top-level \"filter\" fields should be combined with a logical AND or OR operation. Defaults to AND. */\n filterOperator?: InputMaybe<LogicalOperator>;\n /** Skips the first n results, for use in pagination */\n skip?: InputMaybe<Scalars['Int']['input']>;\n /** Specifies which properties to sort the results by */\n sort?: InputMaybe<ZoneSortParameter>;\n /** Takes n results, for use in pagination */\n take?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type ZoneSortParameter = {\n createdAt?: InputMaybe<SortOrder>;\n id?: InputMaybe<SortOrder>;\n name?: InputMaybe<SortOrder>;\n updatedAt?: InputMaybe<SortOrder>;\n};\n", "import { NgModule } from '@angular/core';\nimport { RouterModule, ROUTES } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n AssetDetailQueryDocument,\n BulkActionRegistryService,\n CollectionDetailQueryDocument,\n detailComponentWithResolver,\n GetFacetDetailDocument,\n GetProductDetailDocument,\n GetProductVariantDetailDocument,\n PageService,\n SharedModule,\n} from '@vendure/admin-ui/core';\nimport { SortOrder } from '@vendure/common/lib/generated-types';\n\nimport { createRoutes } from './catalog.routes';\nimport { ApplyFacetDialogComponent } from './components/apply-facet-dialog/apply-facet-dialog.component';\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\nimport { AssignProductsToChannelDialogComponent } from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { BulkAddFacetValuesDialogComponent } from './components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\nimport { CollectionContentsComponent } from './components/collection-contents/collection-contents.component';\nimport { CollectionDataTableComponent } from './components/collection-data-table/collection-data-table.component';\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\nimport { CollectionBreadcrumbPipe } from './components/collection-list/collection-breadcrumb.pipe';\nimport {\n assignCollectionsToChannelBulkAction,\n deleteCollectionsBulkAction,\n duplicateCollectionsBulkAction,\n moveCollectionsBulkAction,\n removeCollectionsFromChannelBulkAction,\n} from './components/collection-list/collection-list-bulk-actions';\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\nimport { CollectionTreeNodeComponent } from './components/collection-tree/collection-tree-node.component';\nimport { CollectionTreeComponent } from './components/collection-tree/collection-tree.component';\nimport { ConfirmVariantDeletionDialogComponent } from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\nimport { CreateFacetValueDialogComponent } from './components/create-facet-value-dialog/create-facet-value-dialog.component';\nimport { CreateProductOptionGroupDialogComponent } from './components/create-product-option-group-dialog/create-product-option-group-dialog.component';\nimport { CreateProductVariantDialogComponent } from './components/create-product-variant-dialog/create-product-variant-dialog.component';\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\nimport {\n assignFacetsToChannelBulkAction,\n deleteFacetsBulkAction,\n duplicateFacetsBulkAction,\n removeFacetsFromChannelBulkAction,\n} from './components/facet-list/facet-list-bulk-actions';\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\nimport { GenerateProductVariantsComponent } from './components/generate-product-variants/generate-product-variants.component';\nimport { MoveCollectionsDialogComponent } from './components/move-collections-dialog/move-collections-dialog.component';\nimport { OptionValueInputComponent } from './components/option-value-input/option-value-input.component';\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\nimport {\n assignFacetValuesToProductsBulkAction,\n assignProductsToChannelBulkAction,\n deleteProductsBulkAction,\n duplicateProductsBulkAction,\n removeProductsFromChannelBulkAction,\n} from './components/product-list/product-list-bulk-actions';\nimport { ProductListComponent } from './components/product-list/product-list.component';\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\nimport { ProductVariantDetailComponent } from './components/product-variant-detail/product-variant-detail.component';\nimport {\n assignFacetValuesToProductVariantsBulkAction,\n assignProductVariantsToChannelBulkAction,\n deleteProductVariantsBulkAction,\n removeProductVariantsFromChannelBulkAction,\n} from './components/product-variant-list/product-variant-list-bulk-actions';\nimport { ProductVariantListComponent } from './components/product-variant-list/product-variant-list.component';\nimport { ProductVariantQuickJumpComponent } from './components/product-variant-quick-jump/product-variant-quick-jump.component';\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\nimport { UpdateProductOptionDialogComponent } from './components/update-product-option-dialog/update-product-option-dialog.component';\nimport { VariantPriceDetailComponent } from './components/variant-price-detail/variant-price-detail.component';\nimport { VariantPriceStrategyDetailComponent } from './components/variant-price-strategy-detail/variant-price-strategy-detail.component';\n\nconst CATALOG_COMPONENTS = [\n ProductListComponent,\n ProductDetailComponent,\n FacetListComponent,\n FacetDetailComponent,\n GenerateProductVariantsComponent,\n ApplyFacetDialogComponent,\n AssetListComponent,\n VariantPriceDetailComponent,\n VariantPriceStrategyDetailComponent,\n CollectionListComponent,\n CollectionDetailComponent,\n CollectionTreeComponent,\n CollectionTreeNodeComponent,\n CollectionContentsComponent,\n ProductVariantsTableComponent,\n OptionValueInputComponent,\n UpdateProductOptionDialogComponent,\n ProductVariantsEditorComponent,\n AssignProductsToChannelDialogComponent,\n AssetDetailComponent,\n ConfirmVariantDeletionDialogComponent,\n ProductOptionsEditorComponent,\n BulkAddFacetValuesDialogComponent,\n CollectionDataTableComponent,\n CollectionBreadcrumbPipe,\n MoveCollectionsDialogComponent,\n ProductVariantListComponent,\n ProductDetailComponent,\n ProductVariantDetailComponent,\n CreateProductVariantDialogComponent,\n CreateProductOptionGroupDialogComponent,\n ProductVariantQuickJumpComponent,\n CreateFacetValueDialogComponent,\n];\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild([])],\n exports: [...CATALOG_COMPONENTS],\n declarations: [...CATALOG_COMPONENTS],\n providers: [\n {\n provide: ROUTES,\n useFactory: (pageService: PageService) => createRoutes(pageService),\n multi: true,\n deps: [PageService],\n },\n ],\n})\nexport class CatalogModule {\n private static hasRegisteredTabsAndBulkActions = false;\n\n constructor(bulkActionRegistryService: BulkActionRegistryService, pageService: PageService) {\n if (CatalogModule.hasRegisteredTabsAndBulkActions) {\n return;\n }\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductsBulkAction);\n bulkActionRegistryService.registerBulkAction(assignProductsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(duplicateProductsBulkAction);\n bulkActionRegistryService.registerBulkAction(removeProductsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteProductsBulkAction);\n\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductVariantsBulkAction);\n bulkActionRegistryService.registerBulkAction(assignProductVariantsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(removeProductVariantsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteProductVariantsBulkAction);\n\n bulkActionRegistryService.registerBulkAction(assignFacetsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(duplicateFacetsBulkAction);\n bulkActionRegistryService.registerBulkAction(removeFacetsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteFacetsBulkAction);\n\n bulkActionRegistryService.registerBulkAction(moveCollectionsBulkAction);\n bulkActionRegistryService.registerBulkAction(assignCollectionsToChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(duplicateCollectionsBulkAction);\n bulkActionRegistryService.registerBulkAction(removeCollectionsFromChannelBulkAction);\n bulkActionRegistryService.registerBulkAction(deleteCollectionsBulkAction);\n\n pageService.registerPageTab({\n priority: 0,\n location: 'product-list',\n tab: _('catalog.products'),\n route: '',\n component: ProductListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'product-detail',\n tab: _('catalog.product'),\n route: '',\n component: detailComponentWithResolver({\n component: ProductDetailComponent,\n query: GetProductDetailDocument,\n entityKey: 'product',\n getBreadcrumbs: entity => [\n {\n label: entity ? entity.name : _('catalog.create-new-product'),\n link: [entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'product-list',\n tab: _('catalog.product-variants'),\n route: 'variants',\n component: ProductVariantListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'product-variant-detail',\n tab: _('catalog.product-variants'),\n route: '',\n component: detailComponentWithResolver({\n component: ProductVariantDetailComponent,\n query: GetProductVariantDetailDocument,\n entityKey: 'productVariant',\n getBreadcrumbs: entity => [\n {\n label: `${entity?.product.name}`,\n link: ['/catalog', 'products', entity?.product.id],\n },\n {\n label: `${entity?.name} (${entity?.sku})`,\n link: ['variants', entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'facet-list',\n tab: _('catalog.facets'),\n route: '',\n component: FacetListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'facet-detail',\n tab: _('catalog.facet'),\n route: '',\n component: detailComponentWithResolver({\n component: FacetDetailComponent,\n query: GetFacetDetailDocument,\n variables: {\n facetValueListOptions: {\n take: 10,\n skip: 0,\n sort: {\n createdAt: SortOrder.DESC,\n },\n },\n },\n entityKey: 'facet',\n getBreadcrumbs: entity => [\n {\n label: entity ? entity.name : _('catalog.create-new-facet'),\n link: [entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'collection-list',\n tab: _('catalog.collections'),\n route: '',\n component: CollectionListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'collection-detail',\n tab: _('catalog.collection'),\n route: '',\n component: detailComponentWithResolver({\n component: CollectionDetailComponent,\n query: CollectionDetailQueryDocument,\n entityKey: 'collection',\n getBreadcrumbs: entity => [\n {\n label: entity ? entity.name : _('catalog.create-new-collection'),\n link: [entity?.id],\n },\n ],\n }),\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'asset-list',\n tab: _('catalog.assets'),\n route: '',\n component: AssetListComponent,\n });\n pageService.registerPageTab({\n priority: 0,\n location: 'asset-detail',\n tab: _('catalog.asset'),\n route: '',\n component: detailComponentWithResolver({\n component: AssetDetailComponent,\n query: AssetDetailQueryDocument,\n entityKey: 'asset',\n getBreadcrumbs: entity => [\n {\n label: `${entity?.name}`,\n link: [entity?.id],\n },\n ],\n }),\n });\n CatalogModule.hasRegisteredTabsAndBulkActions = true;\n }\n}\n", "import { Injectable } from '@angular/core';\nimport {\n CreateProductInput,\n CreateProductVariantInput,\n DataService,\n DeletionResult,\n FacetWithValuesFragment,\n findTranslation,\n GetProductDetailQuery,\n GetProductWithVariantsQuery,\n LanguageCode,\n UpdateProductInput,\n UpdateProductMutation,\n UpdateProductOptionInput,\n UpdateProductVariantInput,\n UpdateProductVariantsMutation,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\nimport { forkJoin, Observable, of, throwError } from 'rxjs';\nimport { map, mergeMap, shareReplay, switchMap } from 'rxjs/operators';\n\nimport { CreateProductVariantsConfig } from '../../components/generate-product-variants/generate-product-variants.component';\n\nimport { replaceLast } from './replace-last';\n\n/**\n * Handles the logic for making the API calls to perform CRUD operations on a Product and its related\n * entities. This logic was extracted out of the component because it became too large and hard to follow.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ProductDetailService {\n constructor(private dataService: DataService) {}\n\n getTaxCategories() {\n return this.dataService.settings\n .getTaxCategories()\n .mapSingle(data => data.taxCategories.items)\n .pipe(shareReplay(1));\n }\n\n createProductWithVariants(\n input: CreateProductInput,\n createVariantsConfig: CreateProductVariantsConfig,\n languageCode: LanguageCode,\n ) {\n const createProduct$ = this.dataService.product.createProduct(input);\n const nonEmptyOptionGroups = createVariantsConfig.groups.filter(g => 0 < g.values.length);\n const createOptionGroups$ = this.createProductOptionGroups(nonEmptyOptionGroups, languageCode);\n\n return forkJoin(createProduct$, createOptionGroups$).pipe(\n mergeMap(([{ createProduct }, optionGroups]) => {\n const addOptionsToProduct$ = optionGroups.length\n ? forkJoin(\n optionGroups.map(optionGroup =>\n this.dataService.product.addOptionGroupToProduct({\n productId: createProduct.id,\n optionGroupId: optionGroup.id,\n }),\n ),\n )\n : of([]);\n return addOptionsToProduct$.pipe(map(() => ({ createProduct, optionGroups })));\n }),\n mergeMap(({ createProduct, optionGroups }) => {\n const variants = createVariantsConfig.variants.map(v => {\n const optionIds = optionGroups.length\n ? v.optionValues.map((optionName, index) => {\n const option = optionGroups[index].options.find(o => o.name === optionName);\n if (!option) {\n throw new Error(\n `Could not find a matching ProductOption \"${optionName}\" when creating variant`,\n );\n }\n return option.id;\n })\n : [];\n return {\n ...v,\n optionIds,\n };\n });\n const options = optionGroups.map(og => og.options).reduce((flat, o) => [...flat, ...o], []);\n return this.createProductVariants(\n createProduct,\n variants,\n options,\n languageCode,\n createVariantsConfig.stockLocationId,\n );\n }),\n );\n }\n\n createProductOptionGroups(groups: Array<{ name: string; values: string[] }>, languageCode: LanguageCode) {\n return groups.length\n ? forkJoin(\n groups.map(c =>\n this.dataService.product\n .createProductOptionGroups({\n code: normalizeString(c.name, '-'),\n translations: [{ languageCode, name: c.name }],\n options: c.values.map(v => ({\n code: normalizeString(v, '-'),\n translations: [{ languageCode, name: v }],\n })),\n })\n .pipe(map(data => data.createProductOptionGroup)),\n ),\n )\n : of([]);\n }\n\n createProductVariants(\n product: { name: string; id: string },\n variantData: Array<{ price: number; sku: string; stock: number; optionIds: string[] }>,\n options: Array<{ id: string; name: string }>,\n languageCode: LanguageCode,\n stockLocationId: string,\n ) {\n const variants: CreateProductVariantInput[] = variantData.map(v => {\n const name = options.length\n ? `${product.name} ${v.optionIds\n .map(id => options.find(o => o.id === id))\n .filter(notNullOrUndefined)\n .map(o => o.name)\n .join(' ')}`\n : product.name;\n return {\n productId: product.id,\n price: v.price,\n sku: v.sku,\n translations: [\n {\n languageCode,\n name,\n },\n ],\n stockLevels: [\n {\n stockLocationId,\n stockOnHand: v.stock,\n },\n ],\n optionIds: v.optionIds,\n };\n });\n return this.dataService.product.createProductVariants(variants).pipe(\n map(({ createProductVariants }) => ({\n createProductVariants,\n productId: product.id,\n })),\n );\n }\n\n updateProduct(updateOptions: {\n product: NonNullable<GetProductDetailQuery['product']>;\n languageCode: LanguageCode;\n autoUpdate: boolean;\n productInput?: UpdateProductInput;\n variantsInput?: UpdateProductVariantInput[];\n }) {\n const { product, languageCode, autoUpdate, productInput, variantsInput } = updateOptions;\n const updateOperations: Array<Observable<UpdateProductMutation | UpdateProductVariantsMutation>> = [];\n const updateVariantsInput = variantsInput || [];\n\n const variants$ = autoUpdate\n ? this.dataService.product\n .getProductVariantsForProduct({}, product.id)\n .mapSingle(({ productVariants }) => productVariants.items)\n : of([]);\n\n return variants$.pipe(\n mergeMap(variants => {\n if (productInput) {\n updateOperations.push(this.dataService.product.updateProduct(productInput));\n const productOldName = findTranslation(product, languageCode)?.name ?? '';\n const productNewName = findTranslation(productInput, languageCode)?.name;\n if (productNewName && productOldName !== productNewName && autoUpdate) {\n for (const variant of variants) {\n const currentVariantName = findTranslation(variant, languageCode)?.name || '';\n let variantInput: UpdateProductVariantInput;\n const existingVariantInput = updateVariantsInput.find(i => i.id === variant.id);\n if (existingVariantInput) {\n variantInput = existingVariantInput;\n } else {\n variantInput = {\n id: variant.id,\n translations: [{ languageCode, name: currentVariantName }],\n };\n updateVariantsInput.push(variantInput);\n }\n const variantTranslation = findTranslation(variantInput, languageCode);\n if (variantTranslation) {\n if (variantTranslation.name) {\n variantTranslation.name = replaceLast(\n variantTranslation.name,\n productOldName,\n productNewName,\n );\n } else {\n // The variant translation was falsy, which occurs\n // when defining the product name for a new translation\n // language that had not yet been defined.\n variantTranslation.name = [\n productNewName,\n ...variant.options.map(o => o.name),\n ].join(' ');\n }\n }\n }\n }\n }\n if (updateVariantsInput.length) {\n updateOperations.push(\n this.dataService.product.updateProductVariants(updateVariantsInput),\n );\n }\n return forkJoin(updateOperations);\n }),\n );\n }\n\n updateProductOptions(\n inputs: UpdateProductOptionInput[],\n autoUpdateProductNames: boolean,\n product: NonNullable<GetProductDetailQuery['product']>,\n languageCode: LanguageCode,\n ) {\n const variants$ = autoUpdateProductNames\n ? this.dataService.product\n .getProductVariantsForProduct({}, product.id)\n .mapSingle(({ productVariants }) => productVariants.items)\n : of([]);\n\n return variants$.pipe(\n mergeMap(variants => {\n let updateProductVariantNames$: Observable<any> = of([]);\n if (autoUpdateProductNames) {\n const replacementMap = new Map<string, string>();\n\n for (const input of inputs) {\n const newOptionName = findTranslation(input, languageCode)?.name;\n let oldOptionName: string | undefined;\n for (const variant of variants) {\n if (oldOptionName) {\n continue;\n }\n if (variant.options.map(o => o.id).includes(input.id)) {\n if (!oldOptionName) {\n oldOptionName = findTranslation(\n variant.options.find(o => o.id === input.id),\n languageCode,\n )?.name;\n }\n }\n }\n if (oldOptionName && newOptionName) {\n replacementMap.set(oldOptionName, newOptionName);\n }\n }\n\n const variantsToUpdate: UpdateProductVariantInput[] = [];\n if (replacementMap.size) {\n const oldOptionNames = Array.from(replacementMap.keys());\n for (const variant of variants) {\n const variantName = findTranslation(variant, languageCode)?.name;\n if (!variantName) {\n continue;\n }\n if (!oldOptionNames.some(oldOptionName => variantName.includes(oldOptionName))) {\n continue;\n }\n const updatedVariantName = oldOptionNames.reduce(\n (name, oldOptionName) =>\n replaceLast(name, oldOptionName, replacementMap.get(oldOptionName)!),\n variantName,\n );\n variantsToUpdate.push({\n id: variant.id,\n translations: [\n {\n languageCode,\n name: updatedVariantName,\n },\n ],\n });\n }\n }\n if (variantsToUpdate.length) {\n updateProductVariantNames$ =\n this.dataService.product.updateProductVariants(variantsToUpdate);\n } else {\n updateProductVariantNames$ = of([]);\n }\n }\n return forkJoin(\n inputs.map(input => this.dataService.product.updateProductOption(input)),\n ).pipe(mergeMap(() => updateProductVariantNames$));\n }),\n );\n }\n\n deleteProductVariant(id: string, productId: string) {\n return this.dataService.product.deleteProductVariant(id).pipe(\n switchMap(result => {\n if (result.deleteProductVariant.result === DeletionResult.DELETED) {\n return this.dataService.product.getProduct(productId).single$;\n } else {\n return throwError(result.deleteProductVariant.message);\n }\n }),\n );\n }\n}\n", "/**\n * @description\n * Like String.prototype.replace(), but replaces the last instance\n * rather than the first.\n */\nexport function replaceLast(target: string | undefined | null, search: string, replace: string): string {\n if (!target) {\n return '';\n }\n const lastIndex = target.lastIndexOf(search);\n if (lastIndex === -1) {\n return target;\n }\n const head = target.substr(0, lastIndex);\n const tail = target.substr(lastIndex).replace(search, replace);\n return head + tail;\n}\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BaseDetailComponent,\n createUpdatedTranslatable,\n CustomFieldConfig,\n DataService,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n NotificationService,\n Permission,\n PermissionsService,\n ProductOptionFragment,\n ProductOptionGroupFragment,\n ServerConfigService,\n TranslationOf,\n UpdateProductOptionGroupInput,\n UpdateProductOptionInput,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\nimport { map, mergeMap, take, tap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\n\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\n\n@Component({\n selector: 'vdr-product-options-editor',\n templateUrl: './product-options-editor.component.html',\n styleUrls: ['./product-options-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\n detailForm: UntypedFormGroup;\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\n languageCode$: Observable<LanguageCode>;\n availableLanguages$: Observable<LanguageCode[]>;\n optionGroupCustomFields: CustomFieldConfig[];\n optionCustomFields: CustomFieldConfig[];\n autoUpdateVariantNames = true;\n paginationSettings: { [groupId: string]: { currentPage: number; itemsPerPage: number } } = {};\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n protected route: ActivatedRoute,\n protected router: Router,\n protected serverConfigService: ServerConfigService,\n protected dataService: DataService,\n protected permissionsService: PermissionsService,\n private productDetailService: ProductDetailService,\n private formBuilder: UntypedFormBuilder,\n private changeDetector: ChangeDetectorRef,\n private notificationService: NotificationService,\n ) {\n super(route, router, serverConfigService, dataService, permissionsService);\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\n }\n\n ngOnInit(): void {\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\n map((product: ProductWithOptions) => product.optionGroups),\n tap((optionGroups: ProductWithOptions['optionGroups']) => {\n for (const group of optionGroups) {\n this.paginationSettings[group.id] = {\n currentPage: 1,\n itemsPerPage: 10,\n };\n }\n }),\n );\n this.detailForm = new UntypedFormGroup({\n optionGroups: new UntypedFormArray([]),\n });\n super.init();\n }\n\n getOptionGroups(): UntypedFormGroup[] {\n const optionGroups = this.detailForm.get('optionGroups');\n return (optionGroups as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n getOptions(optionGroup: UntypedFormGroup): UntypedFormGroup[] {\n const options = optionGroup.get('options');\n return (options as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n save() {\n if (this.detailForm.invalid || this.detailForm.pristine) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\n combineLatest(this.entity$, this.languageCode$, $product)\n .pipe(\n take(1),\n mergeMap(([{ optionGroups }, languageCode, product]) => {\n const updateOperations: Array<Observable<any>> = [];\n const updatedProductOptionInputs: UpdateProductOptionInput[] = [];\n for (const optionGroupForm of this.getOptionGroups()) {\n if (optionGroupForm.dirty) {\n const optionGroupEntity = optionGroups.find(\n og => og.id === optionGroupForm.value.id,\n );\n if (optionGroupEntity) {\n const input = this.getUpdatedOptionGroup(\n optionGroupEntity,\n optionGroupForm,\n languageCode,\n );\n updateOperations.push(\n this.dataService.product.updateProductOptionGroup(input),\n );\n }\n }\n\n for (const optionForm of this.getOptions(optionGroupForm)) {\n if (optionForm.dirty) {\n const optionGroup = optionGroups\n .find(og => og.id === optionGroupForm.value.id)\n ?.options.find(o => o.id === optionForm.value.id);\n if (optionGroup) {\n const input = this.getUpdatedOption(\n optionGroup,\n optionForm,\n languageCode,\n );\n updatedProductOptionInputs.push(input);\n }\n }\n }\n }\n if (updatedProductOptionInputs.length) {\n updateOperations.push(\n this.productDetailService.updateProductOptions(\n updatedProductOptionInputs,\n this.autoUpdateVariantNames,\n product,\n languageCode,\n ),\n );\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductOptionGroup',\n });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductOptionGroup',\n });\n },\n );\n }\n\n private getUpdatedOptionGroup(\n optionGroup: ProductOptionGroupFragment,\n optionGroupFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionGroupInput {\n const input = createUpdatedTranslatable({\n translatable: optionGroup,\n updatedFields: optionGroupFormGroup.value,\n customFieldConfig: this.optionGroupCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: optionGroup.name || '',\n },\n });\n return input;\n }\n\n private getUpdatedOption(\n option: ProductOptionFragment,\n optionFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionInput {\n const input = createUpdatedTranslatable({\n translatable: option,\n updatedFields: optionFormGroup.value,\n customFieldConfig: this.optionCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: option.name || '',\n },\n });\n return input;\n }\n\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\n const groupsForm = this.detailForm.get('optionGroups') as UntypedFormArray;\n for (const optionGroup of entity.optionGroups) {\n const groupTranslation = findTranslation(optionGroup, languageCode);\n\n const groupForm = this.setOptionGroupForm(optionGroup, groupsForm, groupTranslation);\n this.setCustomFieldsForm(this.optionGroupCustomFields, groupForm, optionGroup, groupTranslation);\n\n let optionsForm = groupForm.get('options') as UntypedFormArray;\n if (!optionsForm) {\n optionsForm = this.formBuilder.array([]);\n groupForm.addControl('options', optionsForm);\n }\n for (const option of optionGroup.options) {\n const optionTranslation = findTranslation(option, languageCode);\n const optionForm = this.setOptionForm(option, optionsForm, optionTranslation);\n\n this.setCustomFieldsForm(this.optionCustomFields, optionForm, option, optionTranslation);\n }\n }\n }\n\n protected setCustomFieldsForm<\n T extends ProductWithOptions['optionGroups'][0] | ProductWithOptions['optionGroups'][0]['options'][0],\n >(\n customFields: CustomFieldConfig[],\n formGroup: UntypedFormGroup,\n entity: T,\n currentTranslation?: TranslationOf<T>,\n ) {\n if (customFields.length) {\n let customValueFieldsGroup = formGroup.get(['customFields']);\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = this.formBuilder.group(\n customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\n );\n formGroup.addControl('customFields', customValueFieldsGroup);\n }\n this.setCustomFieldFormValues(customFields, customValueFieldsGroup, entity, currentTranslation);\n }\n }\n\n protected setOptionGroupForm(\n entity: ProductWithOptions['optionGroups'][0],\n groupsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let groupForm = groupsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (groupForm) {\n groupForm.get('id')?.setValue(group.id);\n groupForm.get('code')?.setValue(group.code);\n groupForm.get('name')?.setValue(group.name);\n groupForm.get('createdAt')?.setValue(group.createdAt);\n groupForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n groupForm = this.formBuilder.group(group);\n groupsForm.push(groupForm);\n }\n return groupForm;\n }\n\n protected setOptionForm(\n entity: ProductWithOptions['optionGroups'][0]['options'][0],\n optionsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]['options'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let optionForm = optionsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (optionForm) {\n optionForm.get('id')?.setValue(group.id);\n optionForm.get('code')?.setValue(group.code);\n optionForm.get('name')?.setValue(group.name);\n optionForm.get('createdAt')?.setValue(group.createdAt);\n optionForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n optionForm = this.formBuilder.group(group);\n optionsForm.push(optionForm);\n }\n return optionForm;\n }\n}\n", "<vdr-page-header>\n <vdr-page-title></vdr-page-title>\n <vdr-page-header-description>{{ 'catalog.page-description-options-editor' | translate }}</vdr-page-header-description>\n</vdr-page-header>\n<vdr-page-body>\n <vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <div class=\"flex center\">\n <div class=\"mr-2\">\n <clr-checkbox-wrapper>\n <input\n clrCheckbox\n type=\"checkbox\"\n id=\"auto-update\"\n [(ngModel)]=\"autoUpdateVariantNames\"\n />\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\n </clr-checkbox-wrapper>\n </div>\n <button\n *vdrIfPermissions=\"updatePermission\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"detailForm.pristine || detailForm.invalid\"\n >\n {{ 'common.update' | translate }}\n </button>\n </div>\n </vdr-ab-right>\n </vdr-action-bar>\n </vdr-page-block>\n <vdr-page-block>\n <form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\n <div formGroupName=\"optionGroups\">\n <vdr-card\n *ngFor=\"let optionGroup of getOptionGroups(); index as i\"\n [formArrayName]=\"i\"\n [title]=\"optionGroup.value.code\"\n >\n <vdr-page-entity-info [entity]=\"optionGroup.value\"></vdr-page-entity-info>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n [id]=\"'name-' + i\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\n <input\n [id]=\"'code-' + i\"\n type=\"text\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n </div>\n <ng-container formGroupName=\"customFields\" *ngIf=\"optionGroupCustomFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"ProductOptionGroup\"\n [customFields]=\"optionGroupCustomFields\"\n [customFieldsFormGroup]=\"optionGroup.get('customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </ng-container>\n\n <vdr-data-table-2\n id=\"edit-options-list\"\n *ngIf=\"getOptions(optionGroup) as options\"\n [items]=\"options\"\n [trackByPath]=\"'value.id'\"\n [itemsPerPage]=\"paginationSettings[optionGroup.value.id]?.itemsPerPage\"\n [currentPage]=\"paginationSettings[optionGroup.value.id]?.currentPage\"\n (pageChange)=\"paginationSettings[optionGroup.value.id].currentPage = $event\"\n (itemsPerPageChange)=\"paginationSettings[optionGroup.value.id].itemsPerPage = $event\"\n [totalItems]=\"options.length\"\n >\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-optionControl=\"item\">\n {{ optionControl.value.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\n <ng-template let-optionControl=\"item\">\n {{ optionControl.value.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\n <ng-template let-optionControl=\"item\">\n {{ optionControl.value.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-optionControl=\"item\">\n <input\n type=\"text\"\n [formControl]=\"optionControl.get('name')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\" [optional]=\"false\">\n <ng-template let-optionControl=\"item\">\n <input type=\"text\" [formControl]=\"optionControl.get('code')\" />\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.custom-fields' | translate\" id=\"custom-fields\"\n [hiddenByDefault]=\"optionCustomFields.length === 0\"\n >\n <ng-template let-optionControl=\"item\">\n <vdr-tabbed-custom-fields\n entityName=\"ProductOption\"\n [customFields]=\"optionCustomFields\"\n [compact]=\"true\"\n [customFieldsFormGroup]=\"optionControl.get('customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </ng-template>\n </vdr-dt2-column>\n </vdr-data-table-2>\n </vdr-card>\n </div>\n </form>\n </vdr-page-block>\n</vdr-page-body>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n CurrencyCode,\n DataService,\n DeactivateAware,\n DeletionResult,\n getDefaultUiLanguage,\n GetProductVariantOptionsQuery,\n LanguageCode,\n ModalService,\n NotificationService,\n SelectionManager,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY, Observable, Subject } from 'rxjs';\nimport { map, startWith, switchMap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\nimport { CreateProductOptionGroupDialogComponent } from '../create-product-option-group-dialog/create-product-option-group-dialog.component';\nimport { CreateProductVariantDialogComponent } from '../create-product-variant-dialog/create-product-variant-dialog.component';\n\nexport class GeneratedVariant {\n isDefault: boolean;\n options: Array<{ name: string; id?: string }>;\n productVariantId?: string;\n enabled: boolean;\n existing: boolean;\n sku: string;\n price: number;\n stock: number;\n\n constructor(config: Partial<GeneratedVariant>) {\n for (const key of Object.keys(config)) {\n this[key] = config[key];\n }\n }\n}\n\ninterface OptionGroupUiModel {\n id?: string;\n isNew: boolean;\n name: string;\n locked: boolean;\n values: Array<{\n id: string;\n name: string;\n locked: boolean;\n }>;\n}\n\n@Component({\n selector: 'vdr-product-variants-editor',\n templateUrl: './product-variants-editor.component.html',\n styleUrls: ['./product-variants-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n standalone: false\n})\nexport class ProductVariantsEditorComponent implements OnInit, DeactivateAware {\n formValueChanged = false;\n optionsChanged = false;\n optionGroups: OptionGroupUiModel[];\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\n variants$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['variants']>;\n optionGroups$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups']>;\n totalItems$: Observable<number>;\n currencyCode: CurrencyCode;\n itemsPerPage = 100;\n currentPage = 1;\n searchTermControl = new FormControl('');\n selectionManager = new SelectionManager<any>({\n multiSelect: true,\n itemsAreEqual: (a, b) => a.id === b.id,\n additiveMode: true,\n });\n optionsToAddToVariant: {\n [variantId: string]: { [groupId: string]: string };\n } = {};\n private refresh$ = new Subject<void>();\n private languageCode: LanguageCode;\n\n constructor(\n private route: ActivatedRoute,\n private dataService: DataService,\n private productDetailService: ProductDetailService,\n private notificationService: NotificationService,\n private modalService: ModalService,\n private changeDetector: ChangeDetectorRef,\n ) {}\n\n ngOnInit() {\n this.languageCode =\n (this.route.snapshot.paramMap.get('lang') as LanguageCode) || getDefaultUiLanguage();\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\n });\n\n const product$ = this.refresh$.pipe(\n switchMap(() =>\n this.dataService.product\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .getProductVariantsOptions(this.route.parent?.snapshot.paramMap.get('id')!)\n .mapSingle(data => data.product),\n ),\n startWith(this.route.snapshot.data.product),\n );\n\n this.variants$ = product$.pipe(\n switchMap(product =>\n this.searchTermControl.valueChanges.pipe(\n startWith(''),\n map(term =>\n term\n ? product.variants.filter(v => v.name.toLowerCase().includes(term.toLowerCase()))\n : product.variants,\n ),\n ),\n ),\n );\n this.optionGroups$ = product$.pipe(map(product => product.optionGroups));\n this.totalItems$ = this.variants$.pipe(map(variants => variants.length));\n\n product$.subscribe(p => {\n this.product = p;\n const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();\n const allUsedOptionGroupIds = p.variants.map(v => v.options.map(option => option.groupId)).flat();\n this.optionGroups = p.optionGroups.map(og => ({\n id: og.id,\n isNew: false,\n name: og.name,\n locked: allUsedOptionGroupIds.includes(og.id),\n values: og.options.map(o => ({\n id: o.id,\n name: o.name,\n locked: allUsedOptionIds.includes(o.id),\n })),\n }));\n });\n }\n\n setItemsPerPage(itemsPerPage: number) {\n this.itemsPerPage = itemsPerPage;\n this.currentPage = 1;\n }\n\n setPageNumber(page: number) {\n this.currentPage = page;\n }\n\n onFormChanged(variantInfo: GeneratedVariant) {\n this.formValueChanged = true;\n variantInfo.enabled = true;\n }\n\n canDeactivate(): boolean {\n return !this.formValueChanged;\n }\n\n addOptionGroup() {\n this.modalService\n .fromComponent(CreateProductOptionGroupDialogComponent, {\n locals: {\n languageCode: this.languageCode,\n },\n })\n .pipe(\n switchMap(result => {\n if (result) {\n return this.dataService.product.createProductOptionGroups(result).pipe(\n switchMap(({ createProductOptionGroup }) =>\n this.dataService.product.addOptionGroupToProduct({\n optionGroupId: createProductOptionGroup.id,\n productId: this.product.id,\n }),\n ),\n );\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(result => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'ProductOptionGroup',\n });\n this.refresh$.next();\n this.changeDetector.markForCheck();\n });\n }\n\n removeOptionGroup(\n optionGroup: NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups'][number],\n ) {\n const id = optionGroup.id;\n const usedByVariantsCount = this.product.variants.filter(v =>\n v.options.map(o => o.groupId).includes(id),\n ).length;\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product-option-group'),\n body: usedByVariantsCount ? _('catalog.confirm-delete-product-option-group-body') : '',\n translationVars: { name: optionGroup.name, count: usedByVariantsCount },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(val => {\n if (val) {\n return this.dataService.product.removeOptionGroupFromProduct({\n optionGroupId: id,\n productId: this.product.id,\n force: true,\n });\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(({ removeOptionGroupFromProduct }) => {\n if (removeOptionGroupFromProduct.__typename === 'Product') {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'ProductOptionGroup',\n });\n this.refresh$.next();\n } else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {\n this.notificationService.error(removeOptionGroupFromProduct.message ?? '');\n }\n });\n }\n\n addOption(index: number, optionName: string) {\n const group = this.optionGroups[index];\n if (group && group.id) {\n this.dataService.product\n .addOptionToGroup({\n productOptionGroupId: group.id,\n code: normalizeString(optionName, '-'),\n translations: [{ name: optionName, languageCode: this.languageCode }],\n })\n .subscribe(({ createProductOption }) => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'ProductOption',\n });\n this.refresh$.next();\n });\n }\n }\n\n removeOption(index: number, { id, name }: { id: string; name: string }) {\n const optionGroup = this.optionGroups[index];\n if (optionGroup) {\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product-option'),\n translationVars: { name },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(val => {\n if (val) {\n return this.dataService.product.deleteProductOption(id);\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(({ deleteProductOption }) => {\n if (deleteProductOption.result === DeletionResult.DELETED) {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'ProductOption',\n });\n optionGroup.values = optionGroup.values.filter(v => v.id !== id);\n this.refresh$.next();\n } else {\n this.notificationService.error(deleteProductOption.message ?? '');\n }\n });\n }\n }\n\n setOptionToAddToVariant(variantId: string, optionGroupId: string, optionId?: string) {\n if (!this.optionsToAddToVariant[variantId]) {\n this.optionsToAddToVariant[variantId] = {};\n }\n if (optionId) {\n this.optionsToAddToVariant[variantId][optionGroupId] = optionId;\n } else {\n delete this.optionsToAddToVariant[variantId][optionGroupId];\n }\n }\n\n addOptionToVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\n const optionIds = [\n ...variant.options.map(o => o.id),\n ...Object.values(this.optionsToAddToVariant[variant.id]),\n ];\n this.dataService.product\n .updateProductVariants([\n {\n id: variant.id,\n optionIds: unique(optionIds),\n },\n ])\n .subscribe(({ updateProductVariants }) => {\n this.refresh$.next();\n });\n }\n\n deleteVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product-variant'),\n translationVars: { name: variant.name },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response =>\n response\n ? this.productDetailService.deleteProductVariant(variant.id, this.product.id)\n : EMPTY,\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'ProductVariant',\n });\n this.refresh$.next();\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'ProductVariant',\n });\n },\n );\n }\n\n createNewVariant() {\n this.modalService\n .fromComponent(CreateProductVariantDialogComponent, {\n locals: {\n product: this.product,\n },\n })\n .pipe(\n switchMap(result => {\n if (result) {\n return this.dataService.product.createProductVariants([result]);\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(result => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'ProductVariant',\n });\n this.refresh$.next();\n });\n }\n\n getOption(\n variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\n groupId: string,\n ) {\n return variant.options.find(o => o.groupId === groupId);\n }\n}\n", "<vdr-page-block>\n <vdr-card>\n <div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\n <vdr-form-field [label]=\"'catalog.option' | translate\">\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.option-values' | translate\" class=\"flex-spacer\">\n <vdr-option-value-input\n #optionValueInputComponent\n [options]=\"group.values\"\n [groupName]=\"group.name\"\n [disabled]=\"group.name === ''\"\n (add)=\"addOption(i, $event.name)\"\n (remove)=\"removeOption(i, $event)\"\n ></vdr-option-value-input>\n </vdr-form-field>\n <div>\n <button class=\"button-small mt-4\" (click)=\"removeOptionGroup(group)\">\n <clr-icon shape=\"trash\"></clr-icon>\n </button>\n </div>\n </div>\n <button class=\"button mt-1\" (click)=\"addOptionGroup()\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-product-option-group' | translate }}\n </button>\n </vdr-card>\n <vdr-card [paddingX]=\"false\">\n <div class=\"mx-3\">\n <button class=\"button\" (click)=\"createNewVariant()\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-product-variant' | translate }}\n </button>\n </div>\n <vdr-data-table-2\n id=\"manage-product-variant-list\"\n [items]=\"variants$ | async\"\n [itemsPerPage]=\"itemsPerPage\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n >\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n {{ variant.name }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n {{ variant.sku }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column *ngFor=\"let optionGroup of optionGroups$ | async\" [heading]=\"optionGroup.name\" [id]=\"optionGroup.code\">\n <ng-template let-variant=\"item\">\n <vdr-chip\n *ngIf=\"getOption(variant, optionGroup.id) as option; else selectOption\"\n [colorFrom]=\"optionGroup.code\"\n >{{ option.name }}</vdr-chip\n >\n <ng-template #selectOption>\n <div class=\"flex center\">\n <ng-select\n [items]=\"optionGroup.options\"\n bindLabel=\"name\"\n bindValue=\"id\"\n appendTo=\"body\"\n (change)=\"setOptionToAddToVariant(variant.id, optionGroup.id, $event?.id)\"\n ></ng-select>\n <button\n class=\"button-small ml-1\"\n [class.primary]=\"!!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\n (click)=\"addOptionToVariant(variant)\"\n [disabled]=\"!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\n >\n <clr-icon shape=\"floppy\"></clr-icon>\n </button>\n </div>\n </ng-template>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.price' | translate\" id=\"price\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.price | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.delete' | translate\" id=\"delete\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n <button class=\"button-small\" (click)=\"deleteVariant(variant)\">\n <clr-icon shape=\"trash is-danger\"></clr-icon>\n </button>\n </ng-template>\n </vdr-dt2-column>\n </vdr-data-table-2>\n </vdr-card>\n</vdr-page-block>\n", "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport {\n CreateProductOptionGroupInput,\n Dialog,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n ServerConfigService,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\n\n@Component({\n selector: 'vdr-create-product-option-group-dialog',\n templateUrl: './create-product-option-group-dialog.component.html',\n styleUrls: ['./create-product-option-group-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CreateProductOptionGroupDialogComponent implements Dialog<CreateProductOptionGroupInput> {\n resolveWith: (result?: CreateProductOptionGroupInput) => void;\n languageCode: LanguageCode;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n code: ['', Validators.required],\n });\n constructor(private formBuilder: FormBuilder) {}\n\n updateCode() {\n const nameControl = this.form.get('name');\n const codeControl = this.form.get('code');\n if (nameControl && codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\n }\n }\n\n confirm() {\n const { name, code } = this.form.value;\n if (!name || !code) {\n return;\n }\n this.resolveWith({\n code,\n options: [],\n translations: [{ languageCode: this.languageCode, name }],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.create-product-option-group' | translate }}\n</ng-template>\n<div class=\"form-grid\" [formGroup]=\"form\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'common.code' | translate\"\n for=\"code\"\n >\n <input\n id=\"code\"\n type=\"text\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n</div>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\" [disabled]=\"form.invalid\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormRecord, Validators } from '@angular/forms';\nimport {\n CreateProductVariantInput,\n CurrencyCode,\n Dialog,\n GetProductVariantOptionsQuery,\n} from '@vendure/admin-ui/core';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\n\n@Component({\n selector: 'vdr-create-product-variant-dialog',\n templateUrl: './create-product-variant-dialog.component.html',\n styleUrls: ['./create-product-variant-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CreateProductVariantDialogComponent implements Dialog<CreateProductVariantInput>, OnInit {\n resolveWith: (result?: CreateProductVariantInput) => void;\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n sku: [''],\n price: [''],\n options: this.formBuilder.record<string>({}),\n });\n existingVariant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number] | undefined;\n currencyCode: CurrencyCode;\n\n constructor(private formBuilder: FormBuilder) {}\n\n ngOnInit() {\n this.currencyCode = this.product.variants[0]?.currencyCode;\n for (const optionGroup of this.product.optionGroups) {\n (this.form.get('options') as FormRecord).addControl(\n optionGroup.code,\n new FormControl('', Validators.required),\n );\n }\n const optionsRecord = this.form.get('options') as FormRecord;\n optionsRecord.valueChanges.subscribe(value => {\n const nameControl = this.form.get('name');\n const allNull = Object.values(value).every(v => v == null);\n if (!allNull && value && nameControl && !nameControl.dirty) {\n const name = Object.entries(value)\n .map(\n ([groupCode, optionId]) =>\n this.product.optionGroups\n .find(og => og.code === groupCode)\n ?.options.find(o => o.id === optionId)?.name,\n )\n .join(' ');\n nameControl.setValue(`${this.product.name} ${name}`);\n }\n const allSelected = Object.values(value).every(v => v != null);\n if (allSelected) {\n this.existingVariant = this.product.variants.find(v =>\n Object.entries(value).every(\n ([groupCode, optionId]) =>\n v.options.find(o => o.groupId === this.getGroupIdFromCode(groupCode))?.id ===\n optionId,\n ),\n );\n }\n });\n }\n\n confirm() {\n const { name, sku, options, price } = this.form.value;\n if (!name || !options || price == null) {\n return;\n }\n\n const optionIds = Object.values(options).filter(notNullOrUndefined);\n this.resolveWith({\n productId: this.product.id,\n sku: sku || '',\n price: Number(price),\n optionIds,\n translations: [\n {\n languageCode: this.product.languageCode,\n name,\n },\n ],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n\n private getGroupCodeFromId(id: string): string {\n return this.product.optionGroups.find(og => og.id === id)?.code ?? '';\n }\n\n private getGroupIdFromCode(code: string): string {\n return this.product.optionGroups.find(og => og.code === code)?.id ?? '';\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.create-product-variant' | translate }}\n</ng-template>\n<form [formGroup]=\"form\">\n <div formGroupName=\"options\" class=\"form-grid\">\n <vdr-form-field [label]=\"optionGroup.name\" *ngFor=\"let optionGroup of product.optionGroups\">\n <ng-select [items]=\"optionGroup.options\" [formControlName]=\"optionGroup.code\" bindLabel=\"name\"\n bindValue=\"id\" appendTo=\"body\">\n </ng-select>\n </vdr-form-field>\n <clr-alert *ngIf=\"product.optionGroups.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\"\n class=\"form-grid-span\">\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ 'catalog.cannot-create-variants-without-options' | translate }}\n </span>\n </clr-alert-item>\n </clr-alert>\n </div>\n <div *ngIf=\"existingVariant\" class=\"mt-2\">\n <clr-alert clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ 'catalog.product-variant-exists' | translate }}: {{ existingVariant.name }} ({{\n existingVariant.sku\n }})\n </span>\n </clr-alert-item>\n </clr-alert>\n </div>\n <div class=\"form-grid mt-2\">\n <vdr-form-field [label]=\"'common.name' | translate\">\n <input type=\"text\" formControlName=\"name\" />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.sku' | translate\">\n <input type=\"text\" formControlName=\"sku\" />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.price' | translate\">\n <vdr-currency-input name=\"price\" [currencyCode]=\"currencyCode\" formControlName=\"price\" />\n </vdr-form-field>\n </div>\n</form>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\"\n [disabled]=\"form.invalid || existingVariant || product.optionGroups.length === 0\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>", "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n OnChanges,\n OnInit,\n Output,\n Provider,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { unique } from '@vendure/common/lib/unique';\n\nexport const OPTION_VALUE_INPUT_VALUE_ACCESSOR: Provider = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OptionValueInputComponent),\n multi: true,\n};\n\ninterface Option {\n id?: string;\n name: string;\n locked: boolean;\n}\n\n@Component({\n selector: 'vdr-option-value-input',\n templateUrl: './option-value-input.component.html',\n styleUrls: ['./option-value-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [OPTION_VALUE_INPUT_VALUE_ACCESSOR],\n standalone: false\n})\nexport class OptionValueInputComponent implements ControlValueAccessor {\n @Input() groupName = '';\n @ViewChild('textArea', { static: true }) textArea: ElementRef<HTMLTextAreaElement>;\n @ViewChildren('editNameInput', { read: ElementRef }) nameInputs: QueryList<ElementRef>;\n @Input() options: Option[];\n @Output() add = new EventEmitter<Option>();\n @Output() remove = new EventEmitter<Option>();\n @Output() edit = new EventEmitter<{ index: number; option: Option }>();\n @Input() disabled = false;\n input = '';\n isFocussed = false;\n lastSelected = false;\n formValue: Option[];\n editingIndex = -1;\n onChangeFn: (value: any) => void;\n onTouchFn: (value: any) => void;\n\n get optionValues(): Option[] {\n return this.formValue ?? this.options ?? [];\n }\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n\n registerOnChange(fn: any): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouchFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.changeDetector.markForCheck();\n }\n\n writeValue(obj: any): void {\n this.formValue = obj || [];\n }\n\n focus() {\n this.textArea.nativeElement.focus();\n }\n\n editName(index: number, event: MouseEvent) {\n const optionValue = this.optionValues[index];\n if (!optionValue.locked && !optionValue.id) {\n event.cancelBubble = true;\n this.editingIndex = index;\n const input = this.nameInputs.get(index)?.nativeElement;\n setTimeout(() => input?.focus());\n }\n }\n\n updateOption(index: number, event: InputEvent) {\n const optionValue = this.optionValues[index];\n const newName = (event.target as HTMLInputElement).value;\n if (optionValue) {\n if (newName) {\n optionValue.name = newName;\n this.edit.emit({ index, option: optionValue });\n }\n this.editingIndex = -1;\n }\n }\n\n removeOption(option: Option) {\n if (!option.locked) {\n if (this.formValue) {\n this.formValue = this.formValue?.filter(o => o.name !== option.name);\n this.onChangeFn(this.formValue);\n } else {\n this.remove.emit(option);\n }\n }\n }\n\n handleKey(event: KeyboardEvent) {\n switch (event.key) {\n case ',':\n case 'Enter':\n this.addOptionValue();\n event.preventDefault();\n break;\n case 'Backspace':\n if (this.lastSelected) {\n this.removeLastOption();\n this.lastSelected = false;\n } else if (this.input === '') {\n this.lastSelected = true;\n }\n break;\n default:\n this.lastSelected = false;\n }\n }\n\n handleBlur() {\n this.isFocussed = false;\n this.addOptionValue();\n }\n\n private addOptionValue() {\n const options = this.parseInputIntoOptions(this.input).filter(option => {\n // do not add an option with the same name\n // as an existing option\n const existing = this.options ?? this.formValue;\n return !existing?.find(o => o?.name === option.name);\n });\n if (!this.formValue && this.options) {\n for (const option of options) {\n this.add.emit(option);\n }\n } else {\n this.formValue = unique([...this.formValue, ...options]);\n this.onChangeFn(this.formValue);\n }\n this.input = '';\n }\n\n private parseInputIntoOptions(input: string): Option[] {\n return input\n .split(/[,\\n]/)\n .map(s => s.trim())\n .filter(s => s !== '')\n .map(s => ({ name: s, locked: false }));\n }\n\n private removeLastOption() {\n if (this.optionValues.length) {\n const option = this.optionValues[this.optionValues.length - 1];\n this.removeOption(option);\n }\n }\n}\n", "<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\n <div class=\"chips\" *ngIf=\"0 < optionValues.length\">\n <vdr-chip\n *ngFor=\"let option of optionValues; last as isLast; index as i\"\n [icon]=\"option.locked ? 'lock' : 'times'\"\n [class.selected]=\"isLast && lastSelected\"\n [class.locked]=\"option.locked\"\n [colorFrom]=\"groupName\"\n (iconClick)=\"removeOption(option)\"\n >\n <span [hidden]=\"editingIndex !== i\">\n <input\n #editNameInput\n type=\"text\"\n [ngModel]=\"option.name\"\n (blur)=\"updateOption(i, $event)\"\n (click)=\"$event.cancelBubble = true\"\n />\n </span>\n <span\n class=\"option-name\"\n [class.editable]=\"!option.locked && !option.id\"\n (click)=\"editName(i, $event)\" [hidden]=\"editingIndex === i\">{{ option.name }}</span>\n </vdr-chip>\n </div>\n <textarea\n #textArea\n (keyup)=\"handleKey($event)\"\n (focus)=\"isFocussed = true\"\n (blur)=\"handleBlur()\"\n [(ngModel)]=\"input\"\n [disabled]=\"disabled\"\n ></textarea>\n</div>\n", "import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { BaseEntityResolver, GetProductVariantOptionsQuery, DataService } from '@vendure/admin-ui/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProductVariantsResolver extends BaseEntityResolver<GetProductVariantOptionsQuery['product']> {\n constructor(router: Router, dataService: DataService) {\n super(\n router,\n {\n __typename: 'Product' as const,\n id: '',\n createdAt: '',\n updatedAt: '',\n name: '',\n languageCode: '' as any,\n optionGroups: [],\n variants: [],\n },\n id => dataService.product.getProductVariantsOptions(id).mapStream(data => data.product),\n );\n }\n}\n", "import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, Route } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n CanDeactivateDetailGuard,\n createResolveData,\n DataService,\n PageComponent,\n PageService,\n} from '@vendure/admin-ui/core';\nimport { map } from 'rxjs/operators';\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\nimport { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\n\nexport const createRoutes = (pageService: PageService): Route[] => [\n {\n path: 'products',\n component: PageComponent,\n data: {\n locationId: 'product-list',\n breadcrumb: _('breadcrumb.products'),\n },\n children: pageService.getPageTabRoutes('product-list'),\n },\n {\n path: 'inventory',\n redirectTo: 'products',\n },\n {\n path: 'products/:id',\n component: PageComponent,\n data: {\n locationId: 'product-detail',\n breadcrumb: { label: _('breadcrumb.products'), link: ['../', 'products'] },\n },\n children: [\n {\n path: 'manage-variants',\n component: ProductVariantsEditorComponent,\n canDeactivate: [CanDeactivateDetailGuard],\n data: {\n breadcrumb: ({ product }) => [\n {\n label: `${product.name}`,\n link: ['../'],\n },\n {\n label: _('breadcrumb.manage-variants'),\n link: ['manage-variants'],\n },\n ],\n },\n resolve: {\n product: (route: ActivatedRouteSnapshot) =>\n inject(DataService)\n .product.getProductVariantsOptions(route.parent?.params.id)\n .mapSingle(data => data.product),\n },\n },\n ...pageService.getPageTabRoutes('product-detail'),\n ],\n },\n {\n path: 'products/:productId/variants/:id',\n component: PageComponent,\n data: {\n locationId: 'product-variant-detail',\n breadcrumb: { label: _('breadcrumb.products'), link: ['../', 'products'] },\n },\n children: pageService.getPageTabRoutes('product-variant-detail'),\n },\n {\n path: 'products/:id/options',\n component: ProductOptionsEditorComponent,\n resolve: createResolveData(ProductVariantsResolver),\n canDeactivate: [CanDeactivateDetailGuard],\n data: {\n breadcrumb: productOptionsEditorBreadcrumb,\n },\n },\n {\n path: 'facets',\n component: PageComponent,\n data: {\n locationId: 'facet-list',\n breadcrumb: _('breadcrumb.facets'),\n },\n children: pageService.getPageTabRoutes('facet-list'),\n },\n {\n path: 'facets/:id',\n component: PageComponent,\n data: {\n locationId: 'facet-detail',\n breadcrumb: { label: _('breadcrumb.facets'), link: ['../', 'facets'] },\n },\n children: pageService.getPageTabRoutes('facet-detail'),\n },\n {\n path: 'collections',\n component: PageComponent,\n data: {\n locationId: 'collection-list',\n breadcrumb: _('breadcrumb.collections'),\n },\n children: pageService.getPageTabRoutes('collection-list'),\n },\n {\n path: 'collections/:id',\n component: PageComponent,\n data: {\n locationId: 'collection-detail',\n breadcrumb: { label: _('breadcrumb.collections'), link: ['../', 'collections'] },\n },\n children: pageService.getPageTabRoutes('collection-detail'),\n },\n {\n path: 'assets',\n component: PageComponent,\n data: {\n locationId: 'asset-list',\n breadcrumb: _('breadcrumb.assets'),\n },\n children: pageService.getPageTabRoutes('asset-list'),\n },\n {\n path: 'assets/:id',\n component: PageComponent,\n data: {\n locationId: 'asset-detail',\n breadcrumb: { label: _('breadcrumb.assets'), link: ['../', 'assets'] },\n },\n children: pageService.getPageTabRoutes('asset-detail'),\n },\n];\n\nexport function productOptionsEditorBreadcrumb(data: any, params: any) {\n return data.entity.pipe(\n map((entity: any) => [\n {\n label: _('breadcrumb.products'),\n link: ['../', 'products'],\n },\n {\n label: `${entity.name}`,\n link: ['../', 'products', params.id],\n },\n {\n label: _('breadcrumb.product-options'),\n link: ['options'],\n },\n ]),\n );\n}\n", "import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ViewChild,\n} from '@angular/core';\nimport {\n Dialog,\n FacetValue,\n FacetValueSelectorComponent,\n FacetWithValuesFragment,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-apply-facet-dialog',\n templateUrl: './apply-facet-dialog.component.html',\n styleUrls: ['./apply-facet-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ApplyFacetDialogComponent implements Dialog<FacetValue[]>, AfterViewInit {\n @ViewChild(FacetValueSelectorComponent) private selector: FacetValueSelectorComponent;\n resolveWith: (result?: FacetValue[]) => void;\n selectedValues: FacetValue[] = [];\n // Provided by caller\n facets: FacetWithValuesFragment[];\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n\n ngAfterViewInit() {\n setTimeout(() => this.selector.focus(), 0);\n }\n\n selectValues() {\n this.resolveWith(this.selectedValues);\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>{{ 'catalog.add-facets' | translate }}</ng-template>\n\n<vdr-facet-value-selector\n (selectedValuesChange)=\"selectedValues = $event\"\n></vdr-facet-value-selector>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button\n type=\"submit\"\n (click)=\"selectValues()\"\n [disabled]=\"selectedValues.length === 0\"\n class=\"btn btn-primary\"\n >\n {{ 'catalog.add-facets' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, UntypedFormBuilder } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n ASSET_FRAGMENT,\n AssetDetailQueryDocument,\n AssetDetailQueryQuery,\n DataService,\n getCustomFieldsDefaults,\n LanguageCode,\n NotificationService,\n TAG_FRAGMENT,\n TypedBaseDetailComponent,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nexport const ASSET_DETAIL_QUERY = gql`\n query AssetDetailQuery($id: ID!) {\n asset(id: $id) {\n ...Asset\n tags {\n ...Tag\n }\n }\n }\n ${ASSET_FRAGMENT}\n ${TAG_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-asset-detail',\n templateUrl: './asset-detail.component.html',\n styleUrls: ['./asset-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class AssetDetailComponent\n extends TypedBaseDetailComponent<typeof AssetDetailQueryDocument, 'asset'>\n implements OnInit, OnDestroy\n{\n readonly customFields = this.getCustomFieldConfig('Asset');\n detailForm = new FormGroup({\n name: new FormControl(''),\n tags: new FormControl([] as string[]),\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n\n constructor(\n private notificationService: NotificationService,\n protected dataService: DataService,\n private formBuilder: UntypedFormBuilder,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n onAssetChange(event: { id: string; name: string; tags: string[] }) {\n this.detailForm.get('name')?.setValue(event.name);\n this.detailForm.get('tags')?.setValue(event.tags);\n this.detailForm.markAsDirty();\n }\n\n save() {\n this.dataService.product\n .updateAsset({\n id: this.id,\n name: this.detailForm.value.name,\n tags: this.detailForm.value.tags,\n customFields: this.detailForm.value.customFields,\n })\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Asset' });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Asset',\n });\n },\n );\n }\n\n protected setFormValues(\n entity: NonNullable<AssetDetailQueryQuery['asset']>,\n languageCode: LanguageCode,\n ): void {\n this.detailForm.get('name')?.setValue(entity.name);\n this.detailForm.get('tags')?.setValue(entity.tags.map(t => t.id));\n if (this.customFields.length) {\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get(['customFields']), entity);\n }\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left></vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"asset-detail\" />\n <button\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateAsset']\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.update' | translate }}\n </button>\n <vdr-action-bar-dropdown-menu locationId=\"asset-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-page-block>\n <vdr-asset-preview\n [asset]=\"entity$ | async\"\n [editable]=\"true\"\n [customFields]=\"customFields\"\n [customFieldsForm]=\"detailForm.get('customFields')\"\n (assetChange)=\"onAssetChange($event)\"\n />\n</vdr-page-block>\n", "import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n BaseListComponent,\n DataService,\n DeletionResult,\n GetAssetListQuery,\n GetAssetListQueryVariables,\n ItemOf,\n LogicalOperator,\n ModalService,\n NotificationService,\n SortOrder,\n TagFragment,\n} from '@vendure/admin-ui/core';\nimport { PaginationInstance } from 'ngx-pagination';\nimport { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs';\nimport { debounceTime, finalize, map, switchMap, takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-asset-list',\n templateUrl: './asset-list.component.html',\n styleUrls: ['./asset-list.component.scss'],\n standalone: false\n})\nexport class AssetListComponent\n extends BaseListComponent<\n GetAssetListQuery,\n ItemOf<GetAssetListQuery, 'assets'>,\n GetAssetListQueryVariables\n >\n implements OnInit\n{\n searchTerm$ = new BehaviorSubject<string | undefined>(undefined);\n filterByTags$ = new BehaviorSubject<TagFragment[] | undefined>(undefined);\n uploading = false;\n allTags$: Observable<TagFragment[]>;\n paginationConfig$: Observable<PaginationInstance>;\n\n constructor(\n private notificationService: NotificationService,\n private modalService: ModalService,\n private dataService: DataService,\n router: Router,\n route: ActivatedRoute,\n ) {\n super(router, route);\n super.setQueryFn(\n (...args: any[]) => this.dataService.product.getAssetList(...args).refetchOnChannelChange(),\n data => data.assets,\n (skip, take) => {\n const searchTerm = this.searchTerm$.value;\n const tags = this.filterByTags$.value?.map(t => t.value);\n return {\n options: {\n skip,\n take,\n ...(searchTerm\n ? {\n filter: {\n name: { contains: searchTerm },\n },\n }\n : {}),\n sort: {\n createdAt: SortOrder.DESC,\n },\n tags,\n tagsOperator: LogicalOperator.AND,\n },\n };\n },\n { take: 25, skip: 0 },\n );\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.paginationConfig$ = combineLatest(this.itemsPerPage$, this.currentPage$, this.totalItems$).pipe(\n map(([itemsPerPage, currentPage, totalItems]) => ({ itemsPerPage, currentPage, totalItems })),\n );\n this.searchTerm$.pipe(debounceTime(250), takeUntil(this.destroy$)).subscribe(() => this.refresh());\n\n this.filterByTags$.pipe(takeUntil(this.destroy$)).subscribe(() => this.refresh());\n this.allTags$ = this.dataService.product.getTagList().mapStream(data => data.tags.items);\n }\n\n filesSelected(files: File[]) {\n if (files.length) {\n this.uploading = true;\n this.dataService.product\n .createAssets(files)\n .pipe(finalize(() => (this.uploading = false)))\n .subscribe(({ createAssets }) => {\n let successCount = 0;\n for (const result of createAssets) {\n switch (result.__typename) {\n case 'Asset':\n successCount++;\n break;\n case 'MimeTypeError':\n this.notificationService.error(result.message);\n break;\n }\n }\n if (0 < successCount) {\n super.refresh();\n this.notificationService.success(_('asset.notify-create-assets-success'), {\n count: successCount,\n });\n }\n });\n }\n }\n\n deleteAssets(assets: Asset[]) {\n this.showModalAndDelete(assets.map(a => a.id))\n .pipe(\n switchMap(response => {\n if (response.result === DeletionResult.DELETED) {\n return [true];\n } else {\n return this.showModalAndDelete(\n assets.map(a => a.id),\n response.message || '',\n ).pipe(map(r => r.result === DeletionResult.DELETED));\n }\n }),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'Assets',\n });\n this.refresh();\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'Assets',\n });\n },\n );\n }\n\n private showModalAndDelete(assetIds: string[], message?: string) {\n return this.modalService\n .dialog({\n title: _('catalog.confirm-delete-assets'),\n translationVars: {\n count: assetIds.length,\n },\n body: message,\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(res => (res ? this.dataService.product.deleteAssets(assetIds, !!message) : EMPTY)),\n map(res => res.deleteAssets),\n );\n }\n}\n", "<vdr-page-block>\n <div class=\"my-2\">\n <vdr-asset-search-input\n [tags]=\"allTags$ | async\"\n (searchTermChange)=\"searchTerm$.next($event)\"\n (tagsChange)=\"filterByTags$.next($event)\"\n >\n <vdr-asset-file-input\n (selectFiles)=\"filesSelected($event)\"\n [uploading]=\"uploading\"\n dropZoneTarget=\".content-area\"\n ></vdr-asset-file-input>\n </vdr-asset-search-input>\n </div>\n <vdr-asset-gallery\n [assets]=\"(items$ | async)! | paginate : (paginationConfig$ | async) || {}\"\n [multiSelect]=\"true\"\n [canDelete]=\"['DeleteCatalog', 'DeleteAsset'] | hasPermission\"\n (deleteAssets)=\"deleteAssets($event)\"\n ></vdr-asset-gallery>\n\n <div class=\"paging-controls\">\n <vdr-items-per-page-controls\n [itemsPerPage]=\"itemsPerPage$ | async\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n ></vdr-items-per-page-controls>\n\n <vdr-pagination-controls\n [currentPage]=\"currentPage$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n (pageChange)=\"setPageNumber($event)\"\n ></vdr-pagination-controls>\n </div>\n</vdr-page-block>\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n Dialog,\n GetChannelsQuery,\n ItemOf,\n LogicalOperator,\n NotificationService,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, from, lastValueFrom, Observable } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\n\ntype Channel = ItemOf<GetChannelsQuery, 'channels'>;\n\n@Component({\n selector: 'vdr-assign-products-to-channel-dialog',\n templateUrl: './assign-products-to-channel-dialog.component.html',\n styleUrls: ['./assign-products-to-channel-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class AssignProductsToChannelDialogComponent implements OnInit, Dialog<any> {\n selectedChannel: Channel | null | undefined;\n currentChannel: Channel;\n availableChannels: Channel[];\n resolveWith: (result?: any) => void;\n variantsPreview$: Observable<Array<{ id: string; name: string; price: number; pricePreview: number }>>;\n priceFactorControl = new UntypedFormControl(1);\n selectedChannelIdControl = new UntypedFormControl();\n\n // assigned by ModalService.fromComponent() call\n productIds: string[];\n productVariantIds: string[] | undefined;\n currentChannelIds: string[];\n\n get isProductVariantMode(): boolean {\n return this.productVariantIds != null;\n }\n\n constructor(private dataService: DataService, private notificationService: NotificationService) {}\n\n ngOnInit() {\n const activeChannelId$ = this.dataService.client\n .userStatus()\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\n const allChannels$ = this.dataService.settings.getChannels().mapSingle(data => data.channels);\n\n combineLatest(activeChannelId$, allChannels$).subscribe(([activeChannelId, channels]) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.currentChannel = channels.items.find(c => c.id === activeChannelId)!;\n this.availableChannels = channels.items;\n });\n\n this.selectedChannelIdControl.valueChanges.subscribe(ids => {\n this.selectChannel(ids);\n });\n\n this.variantsPreview$ = combineLatest(\n from(this.getTopVariants(10)),\n this.priceFactorControl.valueChanges.pipe(startWith(1)),\n ).pipe(\n map(([variants, factor]) =>\n variants.map(v => ({\n id: v.id,\n name: v.name,\n price: v.price,\n pricePreview: v.price * +factor,\n })),\n ),\n );\n }\n\n selectChannel(channelIds: string[]) {\n this.selectedChannel = this.availableChannels.find(c => c.id === channelIds[0]);\n }\n\n assign() {\n const selectedChannel = this.selectedChannel;\n if (selectedChannel) {\n if (!this.isProductVariantMode) {\n this.dataService.product\n .assignProductsToChannel({\n channelId: selectedChannel.id,\n productIds: this.productIds,\n priceFactor: +this.priceFactorControl.value,\n })\n .subscribe(() => {\n this.notificationService.success(_('catalog.assign-product-to-channel-success'), {\n channel: selectedChannel.code,\n count: this.productIds.length,\n });\n this.resolveWith(true);\n });\n } else if (this.productVariantIds) {\n this.dataService.product\n .assignVariantsToChannel({\n channelId: selectedChannel.id,\n productVariantIds: this.productVariantIds,\n priceFactor: +this.priceFactorControl.value,\n })\n .subscribe(() => {\n this.notificationService.success(_('catalog.assign-variant-to-channel-success'), {\n channel: selectedChannel.code,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n count: this.productVariantIds!.length,\n });\n this.resolveWith(true);\n });\n }\n }\n }\n\n cancel() {\n this.resolveWith();\n }\n\n private async getTopVariants(take: number) {\n return (\n await lastValueFrom(\n this.dataService.product.getProductVariants({\n filterOperator: LogicalOperator.OR,\n filter: {\n productId: { in: this.productIds },\n id: { in: this.productVariantIds },\n },\n take,\n }).single$,\n )\n ).productVariants.items;\n }\n}\n", "<ng-template vdrDialogTitle>\n <ng-container *ngIf=\"isProductVariantMode; else productModeTitle\">{{\n 'catalog.assign-variants-to-channel' | translate\n }}</ng-container>\n <ng-template #productModeTitle>{{ 'catalog.assign-products-to-channel' | translate }}</ng-template>\n</ng-template>\n\n<div class=\"flex\">\n <clr-input-container>\n <label>{{ 'common.channel' | translate }}</label>\n <vdr-channel-assignment-control\n clrInput\n [multiple]=\"false\"\n [includeDefaultChannel]=\"false\"\n [disableChannelIds]=\"currentChannelIds\"\n [formControl]=\"selectedChannelIdControl\"\n ></vdr-channel-assignment-control>\n </clr-input-container>\n <div class=\"flex-spacer\"></div>\n <clr-input-container>\n <label>{{ 'catalog.price-conversion-factor' | translate }}</label>\n <input clrInput type=\"number\" min=\"0\" max=\"99999\" [formControl]=\"priceFactorControl\" />\n </clr-input-container>\n</div>\n\n<div class=\"channel-price-preview\">\n <label class=\"clr-control-label\">{{ 'catalog.channel-price-preview' | translate }}</label>\n <table class=\"table\">\n <thead>\n <tr>\n <th>{{ 'common.name' | translate }}</th>\n <th>\n {{\n 'catalog.price-in-channel'\n | translate: { channel: currentChannel?.code | channelCodeToLabel | translate }\n }}\n </th>\n <th>\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\n {{ 'catalog.price-in-channel' | translate: { channel: selectedChannel?.code } }}\n </ng-template>\n <ng-template #noSelection>\n {{ 'catalog.no-channel-selected' | translate }}\n </ng-template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of variantsPreview$ | async\">\n <td>{{ row.name }}</td>\n <td>{{ row.price | localeCurrency: currentChannel?.defaultCurrencyCode }}</td>\n <td>\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\n {{ row.pricePreview | localeCurrency: selectedChannel?.defaultCurrencyCode }}\n </ng-template>\n <ng-template #noChannelSelected> - </ng-template>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"assign()\" [disabled]=\"!selectedChannel\" class=\"btn btn-primary\">\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\n {{ 'catalog.assign-to-named-channel' | translate: { channelCode: selectedChannel?.code } }}\n </ng-template>\n <ng-template #noSelection>\n {{ 'catalog.no-channel-selected' | translate }}\n </ng-template>\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport {\n DataService,\n Dialog,\n FacetValueFragment,\n GetProductsWithFacetValuesByIdsQuery,\n GetProductsWithFacetValuesByIdsQueryVariables,\n GetVariantsWithFacetValuesByIdsQuery,\n UpdateProductsBulkMutation,\n UpdateProductsBulkMutationVariables,\n UpdateVariantsBulkMutation,\n UpdateVariantsBulkMutationVariables,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { Observable, Subscription } from 'rxjs';\n\nimport {\n GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS,\n GET_VARIANTS_WITH_FACET_VALUES_BY_IDS,\n UPDATE_PRODUCTS_BULK,\n UPDATE_VARIANTS_BULK,\n} from './bulk-add-facet-values-dialog.graphql';\n\ninterface ProductOrVariant {\n id: string;\n name: string;\n sku?: string;\n facetValues: Array<{\n id: string;\n name: string;\n code: string;\n facet: Array<{\n id: string;\n name: string;\n code: string;\n }>;\n }>;\n}\n\n@Component({\n selector: 'vdr-bulk-add-facet-values-dialog',\n templateUrl: './bulk-add-facet-values-dialog.component.html',\n styleUrls: ['./bulk-add-facet-values-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class BulkAddFacetValuesDialogComponent implements OnInit, OnDestroy, Dialog<FacetValueFragment[]> {\n resolveWith: (result?: FacetValueFragment[]) => void;\n /* provided by call to ModalService */\n mode: 'product' | 'variant' = 'product';\n ids?: string[];\n state: 'loading' | 'ready' | 'saving' = 'loading';\n\n selectedValues: FacetValueFragment[] = [];\n items: ProductOrVariant[] = [];\n facetValuesRemoved = false;\n private subscription: Subscription;\n constructor(\n private dataService: DataService,\n private changeDetectorRef: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n const fetchData$: Observable<any> =\n this.mode === 'product'\n ? this.dataService\n .query<\n GetProductsWithFacetValuesByIdsQuery,\n GetProductsWithFacetValuesByIdsQueryVariables\n >(GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS, {\n ids: this.ids ?? [],\n })\n .mapSingle(({ products }) =>\n products.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\n )\n : this.dataService\n .query<\n GetVariantsWithFacetValuesByIdsQuery,\n GetProductsWithFacetValuesByIdsQueryVariables\n >(GET_VARIANTS_WITH_FACET_VALUES_BY_IDS, {\n ids: this.ids ?? [],\n })\n .mapSingle(({ productVariants }) =>\n productVariants.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\n );\n this.subscription = fetchData$.subscribe({\n next: items => {\n this.items = items;\n this.state = 'ready';\n this.changeDetectorRef.markForCheck();\n },\n });\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n\n cancel() {\n this.resolveWith();\n }\n\n removeFacetValue(item: ProductOrVariant, facetValueId: string) {\n item.facetValues = item.facetValues.filter(fv => fv.id !== facetValueId);\n this.facetValuesRemoved = true;\n }\n\n addFacetValues() {\n const selectedFacetValueIds = this.selectedValues.map(sv => sv.id);\n this.state = 'saving';\n const save$: Observable<any> =\n this.mode === 'product'\n ? this.dataService.mutate<UpdateProductsBulkMutation, UpdateProductsBulkMutationVariables>(\n UPDATE_PRODUCTS_BULK,\n {\n input: this.items?.map(product => ({\n id: product.id,\n facetValueIds: unique([\n ...product.facetValues.map(fv => fv.id),\n ...selectedFacetValueIds,\n ]),\n })),\n },\n )\n : this.dataService.mutate<UpdateVariantsBulkMutation, UpdateVariantsBulkMutationVariables>(\n UPDATE_VARIANTS_BULK,\n {\n input: this.items?.map(product => ({\n id: product.id,\n facetValueIds: unique([\n ...product.facetValues.map(fv => fv.id),\n ...selectedFacetValueIds,\n ]),\n })),\n },\n );\n return save$.subscribe(result => {\n this.resolveWith(this.selectedValues);\n });\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.edit-facet-values' | translate }}\n</ng-template>\n\n<div class=\"flex\">\n <div class=\"flex center\">\n <div class=\"mr2\">\n {{ 'catalog.add-facet-value' | translate }}\n </div>\n <vdr-facet-value-selector\n (selectedValuesChange)=\"selectedValues = $event\"\n ></vdr-facet-value-selector>\n </div>\n</div>\n\n<table class=\"table\" *ngIf=\"state !== 'loading'; else placeholder\">\n <tbody>\n <tr *ngFor=\"let item of items\">\n <td class=\"left align-middle\">\n <div>{{ item.name }}</div>\n <div *ngIf=\"item.sku\" class=\"sku\">{{ item.sku }}</div>\n </td>\n <td class=\"left\">\n <vdr-facet-value-chip\n *ngFor=\"let facetValue of item.facetValues\"\n [facetValue]=\"facetValue\"\n (remove)=\"removeFacetValue(item, facetValue.id)\"\n ></vdr-facet-value-chip>\n </td>\n </tr>\n </tbody>\n</table>\n\n<ng-template #placeholder>\n <div class=\"loading\">\n <clr-spinner></clr-spinner>\n </div>\n</ng-template>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button\n type=\"submit\"\n (click)=\"addFacetValues()\"\n [disabled]=\"selectedValues.length === 0 && facetValuesRemoved === false\"\n class=\"btn btn-primary\"\n >\n {{ 'common.update' | translate }}\n </button>\n</ng-template>\n", "import { gql } from 'apollo-angular';\n\nexport const GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS = gql`\n query GetProductsWithFacetValuesByIds($ids: [String!]!) {\n products(options: { filter: { id: { in: $ids } } }) {\n items {\n id\n name\n facetValues {\n id\n name\n code\n facet {\n id\n name\n code\n }\n }\n }\n }\n }\n`;\n\nexport const GET_VARIANTS_WITH_FACET_VALUES_BY_IDS = gql`\n query GetVariantsWithFacetValuesByIds($ids: [String!]!) {\n productVariants(options: { filter: { id: { in: $ids } } }) {\n items {\n id\n name\n sku\n facetValues {\n id\n name\n code\n facet {\n id\n name\n code\n }\n }\n }\n }\n }\n`;\n\nexport const UPDATE_PRODUCTS_BULK = gql`\n mutation UpdateProductsBulk($input: [UpdateProductInput!]!) {\n updateProducts(input: $input) {\n id\n name\n facetValues {\n id\n name\n code\n }\n }\n }\n`;\n\nexport const UPDATE_VARIANTS_BULK = gql`\n mutation UpdateVariantsBulk($input: [UpdateProductVariantInput!]!) {\n updateProductVariants(input: $input) {\n id\n name\n facetValues {\n id\n name\n code\n }\n }\n }\n`;\n", "import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n CollectionFilterParameter,\n ConfigurableOperationInput,\n DataService,\n GetCollectionContentsQuery,\n} from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport {\n catchError,\n debounceTime,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n startWith,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-collection-contents',\n templateUrl: './collection-contents.component.html',\n styleUrls: ['./collection-contents.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionContentsComponent implements OnInit, OnChanges, OnDestroy {\n @Input() collectionId: string;\n @Input() parentId: string;\n @Input() inheritFilters: boolean;\n @Input() updatedFilters: ConfigurableOperationInput[] | undefined;\n @Input() previewUpdatedFilters = false;\n @ContentChild(TemplateRef, { static: true }) headerTemplate: TemplateRef<any>;\n\n contents$: Observable<NonNullable<GetCollectionContentsQuery['collection']>['productVariants']['items']>;\n contentsTotalItems$: Observable<number>;\n contentsItemsPerPage$: Observable<number>;\n contentsCurrentPage$: Observable<number>;\n filterTermControl = new UntypedFormControl('');\n isLoading = false;\n private collectionIdChange$ = new BehaviorSubject<string>('');\n private parentIdChange$ = new BehaviorSubject<string>('');\n private filterChanges$ = new BehaviorSubject<ConfigurableOperationInput[]>([]);\n private inheritFiltersChanges$ = new BehaviorSubject<boolean>(true);\n private refresh$ = new BehaviorSubject<boolean>(true);\n private destroy$ = new Subject<void>();\n\n constructor(private route: ActivatedRoute, private router: Router, private dataService: DataService) {}\n\n ngOnInit() {\n this.contentsCurrentPage$ = this.route.queryParamMap.pipe(\n map(qpm => qpm.get('contentsPage')),\n map(page => (!page ? 1 : +page)),\n startWith(1),\n distinctUntilChanged(),\n );\n\n this.contentsItemsPerPage$ = this.route.queryParamMap.pipe(\n map(qpm => qpm.get('contentsPerPage')),\n map(perPage => (!perPage ? 10 : +perPage)),\n startWith(10),\n distinctUntilChanged(),\n );\n\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\n debounceTime(250),\n tap(() => this.setContentsPageNumber(1)),\n startWith(''),\n );\n\n const filterChanges$ = this.filterChanges$.asObservable().pipe(\n filter(() => this.previewUpdatedFilters),\n tap(() => this.setContentsPageNumber(1)),\n startWith([]),\n );\n\n const inheritFiltersChanges$ = this.inheritFiltersChanges$.asObservable().pipe(\n filter(() => this.inheritFilters != null),\n distinctUntilChanged(),\n tap(() => this.setContentsPageNumber(1)),\n startWith(true),\n );\n\n const fetchUpdate$ = combineLatest(\n this.collectionIdChange$,\n this.parentIdChange$,\n this.contentsCurrentPage$,\n this.contentsItemsPerPage$,\n filterTerm$,\n filterChanges$,\n inheritFiltersChanges$,\n this.refresh$,\n );\n\n const collection$ = fetchUpdate$.pipe(\n takeUntil(this.destroy$),\n tap(() => (this.isLoading = true)),\n debounceTime(50),\n switchMap(([id, parentId, currentPage, itemsPerPage, filterTerm, filters, inheritFilters]) => {\n const take = itemsPerPage;\n const skip = (currentPage - 1) * itemsPerPage;\n if (filters.length && this.previewUpdatedFilters) {\n const filterClause = filterTerm\n ? ({ name: { contains: filterTerm } } as CollectionFilterParameter)\n : undefined;\n return this.dataService.collection\n .previewCollectionVariants(\n {\n parentId,\n filters,\n inheritFilters,\n },\n {\n take,\n skip,\n filter: filterClause,\n },\n )\n .mapSingle(data => data.previewCollectionVariants)\n .pipe(catchError(() => of({ items: [], totalItems: 0 })));\n } else if (id) {\n return this.dataService.collection\n .getCollectionContents(id, take, skip, filterTerm)\n .mapSingle(data => data.collection?.productVariants);\n } else {\n return of(null);\n }\n }),\n tap(() => (this.isLoading = false)),\n finalize(() => (this.isLoading = false)),\n );\n\n this.contents$ = collection$.pipe(map(result => (result ? result.items : [])));\n this.contentsTotalItems$ = collection$.pipe(map(result => (result ? result.totalItems : 0)));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ('collectionId' in changes) {\n this.collectionIdChange$.next(changes.collectionId.currentValue);\n }\n if ('parentId' in changes) {\n this.parentIdChange$.next(changes.parentId.currentValue);\n }\n if ('inheritFilters' in changes) {\n this.inheritFiltersChanges$.next(changes.inheritFilters.currentValue);\n }\n if ('updatedFilters' in changes) {\n if (this.updatedFilters) {\n this.filterChanges$.next(this.updatedFilters);\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n setContentsPageNumber(page: number) {\n this.setParam('contentsPage', page);\n }\n\n setContentsItemsPerPage(perPage: number) {\n this.setParam('contentsPerPage', perPage);\n }\n\n refresh() {\n this.refresh$.next(true);\n }\n\n private setParam(key: string, value: any) {\n this.router.navigate(['./'], {\n relativeTo: this.route,\n queryParams: {\n [key]: value,\n },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\n}\n", "<div class=\"table-wrapper\">\n <div class=\"progress loop\" [class.visible]=\"isLoading\"></div>\n <div class=\"header-title-row\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { $implicit: contentsTotalItems$ | async }\"\n ></ng-container>\n </div>\n <vdr-data-table-2\n id=\"collection-contents\"\n [class.loading]=\"isLoading\"\n [items]=\"contents$ | async\"\n [itemsPerPage]=\"contentsItemsPerPage$ | async\"\n [totalItems]=\"contentsTotalItems$ | async\"\n [currentPage]=\"contentsCurrentPage$ | async\"\n (pageChange)=\"setContentsPageNumber($event)\"\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\n >\n <vdr-dt2-search\n [searchTermControl]=\"filterTermControl\"\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\n <ng-template let-variant=\"item\">\n {{ variant.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['/catalog/products', variant.productId]\"\n ><span>{{ variant.name }}</span\n ><clr-icon shape=\"arrow right\"\n /></a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\n <ng-template let-variant=\"item\">\n {{ variant.sku }}\n </ng-template>\n </vdr-dt2-column>\n </vdr-data-table-2>\n</div>\n", "import { CdkDrag, CdkDragDrop, CdkDropList, DragRef } from '@angular/cdk/drag-drop';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { DataService, DataTable2Component, GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\n\nexport type CollectionTableItem = ItemOf<GetCollectionListQuery, 'collections'>;\nexport type CollectionOrderEvent = {\n collectionId: string;\n parentId: string;\n index: number;\n};\n@Component({\n selector: 'vdr-collection-data-table',\n templateUrl: './collection-data-table.component.html',\n styleUrls: [\n '../../../../core/src/shared/components/data-table-2/data-table2.component.scss',\n './collection-data-table.component.scss',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionDataTableComponent\n extends DataTable2Component<CollectionTableItem>\n implements OnChanges, AfterViewInit\n{\n @Input() subCollections: CollectionTableItem[];\n @Output() changeOrder = new EventEmitter<CollectionOrderEvent>();\n @ViewChild(CdkDropList, { static: true }) dropList: CdkDropList<{\n depth: number;\n collection: CollectionTableItem;\n }>;\n @ViewChildren('collectionRow', { read: CdkDrag }) collectionRowList: QueryList<CdkDrag>;\n dragRefs: DragRef[] = [];\n absoluteIndex: { [id: string]: number } = {};\n constructor(\n protected changeDetectorRef: ChangeDetectorRef,\n protected dataService: DataService,\n ) {\n super(changeDetectorRef, dataService);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n super.ngOnChanges(changes);\n if (changes.subCollections || changes.items) {\n const allCollections: CollectionTableItem[] = [];\n for (const collection of this.items ?? []) {\n allCollections.push(collection);\n const subCollectionMatches = this.getSubcollections(collection);\n allCollections.push(...subCollectionMatches.flat());\n }\n allCollections.forEach((collection, index) => (this.absoluteIndex[collection.id] = index));\n }\n }\n\n ngAfterViewInit() {\n this.collectionRowList.changes.subscribe((val: QueryList<CdkDrag>) => {\n this.dropList.getSortedItems().forEach(item => this.dropList.removeItem(item));\n for (const ref of val.toArray()) {\n ref.dropContainer = this.dropList;\n ref._dragRef._withDropContainer(this.dropList._dropListRef);\n this.dropList.addItem(ref);\n }\n });\n }\n\n getSubcollections(item: CollectionTableItem) {\n return this.subCollections?.filter(c => c.parentId === item.id) ?? [];\n }\n\n sortPredicate = (index: number, item: CdkDrag<{ depth: number; collection: CollectionTableItem }>) => {\n const itemAtIndex = this.dropList.getSortedItems()[index];\n return itemAtIndex?.data.collection.parentId === item.data.collection.parentId;\n };\n\n onDrop(\n event: CdkDragDrop<{\n depth: number;\n collection: CollectionTableItem;\n }>,\n ) {\n const isTopLevel = event.item.data.collection.breadcrumbs.length === 2;\n const pageIndexOffset = isTopLevel ? (this.currentPage - 1) * this.itemsPerPage : 0;\n const parentId = event.item.data.collection.parentId;\n const parentIndex = this.items.findIndex(i => i.id === parentId);\n const adjustedIndex = pageIndexOffset + event.currentIndex - parentIndex - 1;\n this.changeOrder.emit({\n collectionId: event.item.data.collection.id,\n index: adjustedIndex,\n parentId: event.item.data.collection.parentId,\n });\n\n if (isTopLevel) {\n this.items = [...this.items];\n this.items.splice(event.previousIndex, 1);\n this.items.splice(event.currentIndex, 0, event.item.data.collection);\n } else {\n const parent = this.items.find(i => i.id === parentId);\n if (parent) {\n const subCollections = this.getSubcollections(parent);\n const adjustedPreviousIndex = pageIndexOffset + event.previousIndex - parentIndex - 1;\n subCollections.splice(adjustedPreviousIndex, 1);\n subCollections.splice(event.currentIndex, 0, event.item.data.collection);\n }\n }\n this.changeDetectorRef.markForCheck();\n }\n}\n", "<vdr-data-table-filter-presets\n *ngIf=\"filters\"\n [filters]=\"filters\"\n [dataTableId]=\"id\"\n></vdr-data-table-filter-presets>\n<div class=\"table-wrapper\">\n <div class=\"bulk-actions\">\n <ng-content select=\"vdr-bulk-action-menu\"></ng-content>\n </div>\n <table class=\"\" [class.no-select]=\"disableSelect\">\n <thead [class.items-selected]=\"selectionManager?.selection.length\">\n <tr class=\"heading-row\">\n <th *ngIf=\"selectionManager\" class=\"selection-col\">\n <div class=\"flex\">\n <div class=\"drag-handle-spacer\"></div>\n <input\n type=\"checkbox\"\n clrCheckbox\n [checked]=\"selectionManager?.areAllCurrentItemsSelected()\"\n (change)=\"onToggleAllClick()\"\n />\n </div>\n </th>\n <th\n *ngFor=\"let column of visibleSortedColumns; last as isLast\"\n [class.expand]=\"column.expand\"\n >\n <div class=\"cell-content\" [ngClass]=\"column.align\">\n <vdr-ui-extension-point\n [locationId]=\"id\"\n [metadata]=\"column.id\"\n api=\"dataTable\"\n [topPx]=\"-6\"\n [leftPx]=\"-24\"\n display=\"block\"\n >\n <span>{{ column.heading }}</span>\n </vdr-ui-extension-point>\n <div *ngIf=\"column.sort as sort\" class=\"sort-toggle\">\n <button (click)=\"sort.toggleSortOrder()\" [class.active]=\"sort.sortOrder\">\n <clr-icon *ngIf=\"!sort.sortOrder\" shape=\"two-way-arrows left\"></clr-icon>\n <clr-icon *ngIf=\"sort.sortOrder === 'ASC'\" shape=\"arrow up\"></clr-icon>\n <clr-icon *ngIf=\"sort.sortOrder === 'DESC'\" shape=\"arrow down\"></clr-icon>\n </button>\n <div class=\"sort-label\" *ngIf=\"sort.sortOrder\">{{ sort.sortOrder }}</div>\n </div>\n </div>\n </th>\n <th>\n <div class=\"column-picker\">\n <vdr-data-table-colum-picker\n [uiLanguage]=\"uiLanguage$ | async\"\n [columns]=\"sortedColumns\"\n (reorder)=\"onColumnReorder($event)\"\n (resetColumns)=\"onColumnsReset()\"\n ></vdr-data-table-colum-picker>\n </div>\n </th>\n </tr>\n <tr *ngIf=\"searchComponent || customSearchTemplate || filters?.length\">\n <th\n [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\"\n class=\"filter-row\"\n [class.active]=\"showSearchFilterRow\"\n >\n <button\n class=\"button-ghost toggle-search-filter-row\"\n [class.active]=\"showSearchFilterRow\"\n (click)=\"toggleSearchFilterRow()\"\n [title]=\"'common.search-and-filter-list' | translate\"\n >\n <clr-icon shape=\"search\"></clr-icon>\n </button>\n <div class=\"filter-row-wrapper\" [class.hidden]=\"!showSearchFilterRow\">\n <ng-container *ngTemplateOutlet=\"searchComponent?.template\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customSearchTemplate\"></ng-container>\n <ng-container *ngIf=\"filters\">\n <div class=\"filters\">\n <vdr-data-table-filters\n *ngFor=\"let activeFilter of filters.activeFilters\"\n [filterWithValue]=\"activeFilter\"\n [filters]=\"filters\"\n class=\"mt-1\"\n ></vdr-data-table-filters>\n <vdr-data-table-filters\n *ngIf=\"filters.length\"\n [filters]=\"filters\"\n class=\"mt-1\"\n ></vdr-data-table-filters>\n <vdr-add-filter-preset-button\n [filters]=\"filters\"\n [dataTableId]=\"id\"\n ></vdr-add-filter-preset-button>\n </div>\n </ng-container>\n </div>\n </th>\n </tr>\n </thead>\n <tbody\n cdkDropList\n cdkDropListLockAxis=\"y\"\n (cdkDropListDropped)=\"onDrop($event)\"\n [cdkDropListSortPredicate]=\"sortPredicate\"\n >\n <ng-container\n *ngFor=\"\n let item of items\n | paginate\n : {\n itemsPerPage: itemsPerPage,\n currentPage: currentPage,\n totalItems: totalItems,\n id: id,\n };\n index as i;\n trackBy: trackByFn.bind(this)\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"collectionRowTmp\"\n [ngTemplateOutletContext]=\"{ item: item, i: i, depth: 0 }\"\n ></ng-container>\n </ng-container>\n <ng-container>\n <tr *ngIf=\"!items?.length\">\n <td [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\">\n <vdr-empty-placeholder [emptyStateLabel]=\"emptyStateLabel\"></vdr-empty-placeholder>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n</div>\n<div class=\"table-footer\">\n <vdr-items-per-page-controls\n *ngIf=\"totalItems\"\n [itemsPerPage]=\"itemsPerPage\"\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\n ></vdr-items-per-page-controls>\n <div *ngIf=\"totalItems\" class=\"p5 total-items-count\">\n {{ 'common.total-items' | translate : { currentStart, currentEnd, totalItems } }}\n </div>\n\n <vdr-pagination-controls\n *ngIf=\"totalItems\"\n [id]=\"id\"\n [currentPage]=\"currentPage\"\n [itemsPerPage]=\"itemsPerPage\"\n [totalItems]=\"totalItems\"\n (pageChange)=\"pageChange.emit($event)\"\n ></vdr-pagination-controls>\n</div>\n\n<ng-template #collectionRowTmp let-item=\"item\" let-depth=\"depth\">\n <tr #collectionRow cdkDrag [cdkDragData]=\"{ depth: depth, collection: item }\" cdkDragBoundary=\"tbody\">\n <td\n *ngIf=\"selectionManager\"\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\n class=\"selection-col\"\n >\n <div class=\"flex\">\n <div class=\"drag-handle\" cdkDragHandle [title]=\"'catalog.reorder-collection' | translate\">\n <clr-icon shape=\"drag-handle\"></clr-icon>\n </div>\n <input\n type=\"checkbox\"\n clrCheckbox\n [checked]=\"selectionManager?.isSelected(item)\"\n (click)=\"onRowClick(item, $event)\"\n />\n </div>\n </td>\n <td\n *ngFor=\"let column of visibleSortedColumns\"\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\n >\n <div class=\"cell-content\" [ngClass]=\"column.align\">\n <ng-container\n *ngIf=\"customComponents.get(column.id) as componentConfig; else defaultComponent\"\n >\n <ng-container\n *ngComponentOutlet=\"\n componentConfig.config.component;\n inputs: { rowItem: item };\n injector: componentConfig.injector\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultComponent>\n <ng-container\n *ngTemplateOutlet=\"column.template; context: { item: item, depth: depth }\"\n ></ng-container>\n </ng-template>\n </div>\n </td>\n <td [class.active]=\"activeIndex === absoluteIndex[item.id]\"><!-- column select --></td>\n </tr>\n <ng-container *ngFor=\"let subCollection of getSubcollections(item)\">\n <ng-container\n *ngTemplateOutlet=\"collectionRowTmp; context: { item: subCollection, depth: depth + 1 }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n", "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { FormBuilder, UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n COLLECTION_FRAGMENT,\n CollectionDetailQueryDocument,\n CollectionFragment,\n ConfigurableOperation,\n ConfigurableOperationDefinition,\n ConfigurableOperationInput,\n CreateCollectionInput,\n createUpdatedTranslatable,\n DataService,\n encodeConfigArgValue,\n findTranslation,\n getConfigArgValue,\n getCustomFieldsDefaults,\n LanguageCode,\n LocalStorageService,\n ModalService,\n NotificationService,\n Permission,\n TypedBaseDetailComponent,\n unicodePatternValidator,\n UpdateCollectionInput,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { gql } from 'apollo-angular';\nimport { combineLatest, merge, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, take } from 'rxjs/operators';\n\nimport { CollectionContentsComponent } from '../collection-contents/collection-contents.component';\n\nexport const COLLECTION_DETAIL_QUERY = gql`\n query CollectionDetailQuery($id: ID!) {\n collection(id: $id) {\n ...Collection\n }\n }\n ${COLLECTION_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-collection-detail',\n templateUrl: './collection-detail.component.html',\n styleUrls: ['./collection-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class CollectionDetailComponent\n extends TypedBaseDetailComponent<typeof CollectionDetailQueryDocument, 'collection'>\n implements OnInit, OnDestroy\n{\n customFields = this.getCustomFieldConfig('Collection');\n detailForm = this.formBuilder.group({\n name: ['', Validators.required],\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9._-]+$/u)],\n description: '',\n visible: false,\n inheritFilters: true,\n filters: this.formBuilder.array([]),\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n assetChanges: { assets?: Asset[]; featuredAsset?: Asset } = {};\n filters: ConfigurableOperation[] = [];\n allFilters: ConfigurableOperationDefinition[] = [];\n updatedFilters$: Observable<ConfigurableOperationInput[]>;\n inheritFilters$: Observable<boolean>;\n livePreview = false;\n parentId$: Observable<string | undefined>;\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateCollection];\n private filterRemoved$ = new Subject<void>();\n @ViewChild('collectionContents') contentsComponent: CollectionContentsComponent;\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n protected dataService: DataService,\n private formBuilder: FormBuilder,\n private notificationService: NotificationService,\n private modalService: ModalService,\n private localStorageService: LocalStorageService,\n ) {\n super();\n this.livePreview = this.localStorageService.get('livePreviewCollectionContents') ?? false;\n }\n\n ngOnInit() {\n this.init();\n this.dataService.collection.getCollectionFilters().single$.subscribe(res => {\n this.allFilters = res.collectionFilters;\n });\n const filtersFormArray = this.detailForm.get('filters') as UntypedFormArray;\n const inheritFiltersControl = this.detailForm.get('inheritFilters') as UntypedFormControl;\n this.inheritFilters$ = inheritFiltersControl.valueChanges.pipe(distinctUntilChanged());\n this.updatedFilters$ = merge(filtersFormArray.statusChanges, this.filterRemoved$).pipe(\n debounceTime(200),\n filter(() => filtersFormArray.touched),\n map(() =>\n this.mapOperationsToInputs(this.filters, filtersFormArray.value).filter(_filter => {\n // ensure all the arguments have valid values. E.g. a newly-added\n // filter will not yet have valid values\n for (const arg of _filter.arguments) {\n if (arg.value === '') {\n return false;\n }\n }\n return true;\n }),\n ),\n );\n this.parentId$ = this.route.paramMap.pipe(\n map(pm => pm.get('parentId') || undefined),\n switchMap(parentId => {\n if (parentId) {\n return of(parentId);\n } else {\n return this.entity$.pipe(map(collection => collection.parent?.id));\n }\n }),\n );\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n getFilterDefinition(_filter: ConfigurableOperation): ConfigurableOperationDefinition | undefined {\n return this.allFilters.find(f => f.code === _filter.code);\n }\n\n assetsChanged(): boolean {\n return !!Object.values(this.assetChanges).length;\n }\n\n /**\n * If creating a new Collection, automatically generate the slug based on the collection name.\n */\n updateSlug(nameValue: string) {\n const slugControl = this.detailForm.get(['slug']);\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\n }\n }\n\n addFilter(collectionFilter: ConfigurableOperation) {\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\n const argsHash = collectionFilter.args.reduce(\n (output, arg) => ({\n ...output,\n [arg.name]: getConfigArgValue(arg.value),\n }),\n {},\n );\n filtersArray.push(\n this.formBuilder.control({\n code: collectionFilter.code,\n args: argsHash,\n }),\n );\n this.filters.push({\n code: collectionFilter.code,\n args: collectionFilter.args.map(a => ({ name: a.name, value: getConfigArgValue(a.value) })),\n });\n }\n\n removeFilter(index: number) {\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\n if (index !== -1) {\n filtersArray.removeAt(index);\n filtersArray.markAsDirty();\n filtersArray.markAsTouched();\n this.filters.splice(index, 1);\n this.filterRemoved$.next();\n }\n }\n\n create() {\n if (!this.detailForm.dirty) {\n return;\n }\n const input = this.getUpdatedCollection(\n {\n id: '',\n createdAt: '',\n updatedAt: '',\n languageCode: this.languageCode,\n name: '',\n slug: '',\n isPrivate: false,\n breadcrumbs: [],\n description: '',\n featuredAsset: null,\n assets: [],\n translations: [],\n inheritFilters: true,\n filters: [],\n parent: {} as any,\n children: null,\n },\n this.detailForm,\n this.languageCode,\n ) as CreateCollectionInput;\n const parentId = this.route.snapshot.paramMap.get('parentId');\n if (parentId) {\n input.parentId = parentId;\n }\n this.dataService.collection.createCollection(input).subscribe(\n data => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'Collection',\n });\n this.assetChanges = {};\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.router.navigate(['../', data.createCollection.id], { relativeTo: this.route });\n },\n err => {\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Collection',\n });\n },\n );\n }\n\n save() {\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([category, languageCode]) => {\n const input = this.getUpdatedCollection(\n category,\n this.detailForm,\n languageCode,\n ) as UpdateCollectionInput;\n return this.dataService.collection.updateCollection(input);\n }),\n )\n .subscribe(\n () => {\n this.assetChanges = {};\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'Collection',\n });\n this.contentsComponent.refresh();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Collection',\n });\n },\n );\n }\n\n canDeactivate(): boolean {\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\n }\n\n toggleLivePreview() {\n this.livePreview = !this.livePreview;\n this.localStorageService.set('livePreviewCollectionContents', this.livePreview);\n }\n\n trackByFn(index: number, item: ConfigurableOperation) {\n return JSON.stringify(item);\n }\n\n /**\n * Sets the values of the form on changes to the category or current language.\n */\n protected setFormValues(entity: CollectionFragment, languageCode: LanguageCode) {\n const currentTranslation = findTranslation(entity, languageCode);\n\n this.detailForm.patchValue({\n name: currentTranslation ? currentTranslation.name : '',\n slug: currentTranslation ? currentTranslation.slug : '',\n description: currentTranslation ? currentTranslation.description : '',\n visible: !entity.isPrivate,\n inheritFilters: entity.inheritFilters,\n });\n\n const formArray = this.detailForm.get('filters') as UntypedFormArray;\n if (formArray.length !== entity.filters.length) {\n formArray.clear();\n this.filters = [];\n entity.filters.forEach(f => this.addFilter(f));\n }\n\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get(['customFields']),\n entity,\n currentTranslation,\n );\n }\n }\n\n /**\n * Given a category and the value of the form, this method creates an updated copy of the category which\n * can then be persisted to the API.\n */\n private getUpdatedCollection(\n category: CollectionFragment,\n form: typeof this.detailForm,\n languageCode: LanguageCode,\n ): CreateCollectionInput | UpdateCollectionInput {\n const updatedCategory = createUpdatedTranslatable({\n translatable: category,\n updatedFields: form.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: category.name || '',\n slug: category.slug || '',\n description: category.description || '',\n },\n });\n return {\n ...updatedCategory,\n assetIds: this.assetChanges.assets?.map(a => a.id),\n featuredAssetId: this.assetChanges.featuredAsset?.id,\n isPrivate: !form.value.visible,\n filters: this.mapOperationsToInputs(this.filters, this.detailForm.value.filters),\n };\n }\n\n /**\n * Maps an array of conditions or actions to the input format expected by the GraphQL API.\n */\n private mapOperationsToInputs(\n operations: ConfigurableOperation[],\n formValueOperations: any,\n ): ConfigurableOperationInput[] {\n return operations.map((o, i) => ({\n code: o.code,\n arguments: Object.entries(formValueOperations[i].args).map(([name, value], j) => ({\n name,\n value: encodeConfigArgValue(value),\n })),\n }));\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"collection-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n *vdrIfPermissions=\"updatePermission\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"collection-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n formControlName=\"visible\"\n id=\"visibility\"\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n />\n <label class=\"visible-toggle\">\n <ng-container *ngIf=\"detailForm.value.visible; else private\">{{\n 'catalog.public' | translate\n }}</ng-container>\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\n </label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\n </vdr-card>\n </vdr-page-detail-sidebar>\n\n <vdr-page-block *ngIf=\"entity$ | async as entity\"\n ><nav role=\"navigation\">\n <ul class=\"collection-breadcrumbs\">\n <li *ngFor=\"let breadcrumb of entity.breadcrumbs; let isFirst = first; let isLast = last\">\n <a [routerLink]=\"['/catalog/collections']\" *ngIf=\"isFirst\">{{\n 'catalog.root-collection' | translate\n }}</a>\n <a\n [routerLink]=\"['/catalog/collections', breadcrumb.id]\"\n *ngIf=\"!isFirst && !isLast\"\n >{{ breadcrumb.name | translate }}</a\n >\n <ng-container *ngIf=\"isLast\">{{ breadcrumb.name | translate }}</ng-container>\n </li>\n </ul>\n </nav>\n </vdr-page-block>\n\n <vdr-page-block>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n (input)=\"updateSlug($event.target.value)\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'catalog.slug' | translate\"\n for=\"slug\"\n [errors]=\"{ pattern: ('catalog.slug-pattern-error' | translate) }\"\n >\n <input\n id=\"slug\"\n type=\"text\"\n formControlName=\"slug\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field\n class=\"form-grid-span\"\n [label]=\"'common.description' | translate\"\n for=\"slug\"\n >\n <vdr-rich-text-editor\n formControlName=\"description\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-rich-text-editor>\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card\n formGroupName=\"customFields\"\n *ngIf=\"customFields.length\"\n [title]=\"'common.custom-fields' | translate\"\n >\n <vdr-tabbed-custom-fields\n entityName=\"Collection\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n <vdr-custom-detail-component-host\n locationId=\"collection-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n <vdr-card [title]=\"'catalog.assets' | translate\">\n <vdr-assets\n [assets]=\"entity?.assets\"\n [featuredAsset]=\"entity?.featuredAsset\"\n [updatePermissions]=\"updatePermission\"\n (change)=\"assetChanges = $event\"\n ></vdr-assets>\n </vdr-card>\n <vdr-card [title]=\"'catalog.filters' | translate\">\n <vdr-form-field [label]=\"'catalog.filter-inheritance' | translate\" for=\"inheritFilters\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n formControlName=\"inheritFilters\"\n id=\"inheritFilters\"\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n />\n <label class=\"visible-toggle\">\n <ng-container *ngIf=\"detailForm.value.inheritFilters; else noInherit\">{{\n 'catalog.inherit-filters-from-parent' | translate\n }}</ng-container>\n <ng-template #noInherit>{{\n 'catalog.do-not-inherit-filters' | translate\n }}</ng-template>\n </label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n <div formArrayName=\"filters\">\n <ng-container *ngFor=\"let filter of filters; index as i; trackBy: trackByFn\">\n <vdr-configurable-input\n (remove)=\"removeFilter(i)\"\n [position]=\"i\"\n [operation]=\"filter\"\n [operationDefinition]=\"getFilterDefinition(filter)\"\n [formControlName]=\"i\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-configurable-input>\n </ng-container>\n </div>\n <div *vdrIfPermissions=\"updatePermission\">\n <vdr-dropdown>\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n <span>{{ 'marketing.add-condition' | translate }}</span>\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let filter of allFilters\"\n type=\"button\"\n vdrDropdownItem\n (click)=\"addFilter(filter)\"\n >\n {{ filter.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n\n <vdr-card [title]=\"'common.contents' | translate\" [paddingX]=\"false\">\n <vdr-collection-contents\n [collectionId]=\"id\"\n [parentId]=\"parentId$ | async\"\n [updatedFilters]=\"updatedFilters$ | async\"\n [inheritFilters]=\"inheritFilters$ | async\"\n [previewUpdatedFilters]=\"livePreview\"\n #collectionContents\n >\n <ng-template let-count>\n <div class=\"ml-3\">\n <div class=\"contents-title\">\n {{ 'catalog.collection-contents' | translate }} ({{\n 'common.results-count' | translate : { count: count }\n }})\n </div>\n <clr-checkbox-wrapper [class.disabled]=\"detailForm.get('filters')?.pristine\">\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModelOptions]=\"{ standalone: true }\"\n [disabled]=\"detailForm.get('filters')?.pristine\"\n [ngModel]=\"livePreview\"\n (ngModelChange)=\"toggleLivePreview()\"\n />\n <label>{{ 'catalog.live-preview-contents' | translate }}</label>\n </clr-checkbox-wrapper>\n </div>\n </ng-template>\n </vdr-collection-contents>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { Pipe, PipeTransform } from '@angular/core';\nimport { GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\n\n/**\n * Removes the root collection and self breadcrumb from the collection breadcrumb list.\n */\n@Pipe({\n name: 'collectionBreadcrumb',\n standalone: false\n})\nexport class CollectionBreadcrumbPipe implements PipeTransform {\n transform(value: ItemOf<GetCollectionListQuery, 'collections'>): unknown {\n return value?.breadcrumbs.slice(1, -1);\n }\n}\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DataService, Dialog, GetCollectionListQuery, I18nService, ItemOf } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, startWith, switchMap, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-move-collections-dialog',\n templateUrl: './move-collections-dialog.component.html',\n styleUrls: ['./move-collections-dialog.component.scss', '../collection-list/collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class MoveCollectionsDialogComponent\n implements OnInit, Dialog<ItemOf<GetCollectionListQuery, 'collections'>>\n{\n resolveWith: (result?: ItemOf<GetCollectionListQuery, 'collections'>) => void;\n searchTermControl = new FormControl('');\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n totalItems$: Observable<number>;\n currentPage$ = new BehaviorSubject(1);\n itemsPerPage$ = new BehaviorSubject(10);\n expandedIds$ = new Subject<string[]>();\n expandedIds: string[] = [];\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n\n constructor(private dataService: DataService, private i18nService: I18nService) {}\n\n ngOnInit() {\n const getCollectionsResult = this.dataService.collection.getCollections();\n\n const searchTerm$ = this.searchTermControl.valueChanges.pipe(\n debounceTime(250),\n distinctUntilChanged(),\n startWith(''),\n );\n const currentPage$ = this.currentPage$.pipe(distinctUntilChanged());\n const itemsPerPage$ = this.itemsPerPage$.pipe(distinctUntilChanged());\n combineLatest(searchTerm$, currentPage$, itemsPerPage$).subscribe(\n ([searchTerm, currentPage, itemsPerPage]) => {\n const topLevelOnly = searchTerm === '';\n getCollectionsResult.ref.refetch({\n options: {\n skip: (currentPage - 1) * itemsPerPage,\n take: itemsPerPage,\n filter: {\n name: { contains: searchTerm },\n },\n topLevelOnly,\n },\n });\n },\n );\n\n const rootCollectionId$ = this.dataService.collection\n .getCollections({\n take: 1,\n topLevelOnly: true,\n })\n .mapSingle(data => data.collections.items[0].parentId);\n\n this.items$ = combineLatest(\n getCollectionsResult.mapStream(({ collections }) => collections),\n rootCollectionId$,\n ).pipe(\n map(([collections, rootCollectionId]) => [\n ...(rootCollectionId\n ? [\n {\n id: rootCollectionId,\n name: this.i18nService.translate('catalog.root-collection'),\n slug: '',\n parentId: '__',\n position: 0,\n featuredAsset: null,\n children: [],\n breadcrumbs: [],\n isPrivate: false,\n createdAt: '',\n updatedAt: '',\n } satisfies ItemOf<GetCollectionListQuery, 'collections'>,\n ]\n : []),\n ...collections.items,\n ]),\n );\n this.totalItems$ = getCollectionsResult.mapStream(data => data.collections.totalItems);\n\n this.subCollections$ = this.expandedIds$.pipe(\n tap(val => (this.expandedIds = val)),\n switchMap(ids => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.expandedIds$.next(expandedIds);\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.move-collections' | translate }}\n</ng-template>\n<vdr-collection-data-table\n class=\"mt-2\"\n id=\"move-collection-list\"\n [items]=\"items$ | async\"\n [subCollections]=\"subCollections$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n (pageChange)=\"currentPage$.next($event)\"\n (itemsPerPageChange)=\"itemsPerPage$.next($event)\"\n>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\n ></vdr-dt2-search>\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-collection=\"item\">\n {{ collection.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\n <ng-template let-collection=\"item\" let-depth=\"depth\">\n <div [ngClass]=\"'indent-' + depth\"></div>\n <clr-icon\n class=\"child-arrow\"\n [class.transparent]=\"depth === 0\"\n shape=\"child-arrow\"\n *ngIf=\"!collection.children?.length && collection.parentId !== '__'\"\n ></clr-icon>\n <button\n class=\"icon-button folder-button\"\n *ngIf=\"collection.children?.length\"\n (click)=\"toggleExpanded(collection)\"\n >\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\n </button>\n <button class=\"icon-button folder-button\" *ngIf=\"collection.parentId === '__'\" disabled>\n <clr-icon shape=\"folder\" class=\"is-solid\"></clr-icon>\n </button>\n <button class=\"button-ghost\" (click)=\"resolveWith(collection)\">\n <span>{{ 'catalog.move-collection-to' | translate : {name: collection.name} }}</span>\n </button>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\n <ng-template let-collection=\"item\">\n <div class=\"breadcrumb\">\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\n <ng-container *ngIf=\"breadcrumbs.length\">\n <div *ngFor=\"let item of breadcrumbs\">\n <span class=\"separator\">/</span>{{ item.name }}\n </div>\n </ng-container>\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\n </ng-container>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\">\n <ng-template let-collection=\"item\">\n {{ collection.slug }}\n </ng-template>\n </vdr-dt2-column>\n</vdr-collection-data-table>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkAssignToChannelAction,\n createBulkDeleteAction,\n createBulkRemoveFromChannelAction,\n DataService,\n DuplicateEntityDialogComponent,\n GetCollectionListQuery,\n ItemOf,\n ModalService,\n MoveCollectionInput,\n NotificationService,\n Permission,\n} from '@vendure/admin-ui/core';\nimport { EMPTY } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { CollectionPartial } from '../collection-tree/collection-tree.types';\nimport { MoveCollectionsDialogComponent } from '../move-collections-dialog/move-collections-dialog.component';\n\nimport { CollectionListComponent } from './collection-list.component';\n\nexport const deleteCollectionsBulkAction = createBulkDeleteAction<\n ItemOf<GetCollectionListQuery, 'collections'>\n>({\n location: 'collection-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteCollection) ||\n userPermissions.includes(Permission.DeleteCatalog),\n getItemName: item => item.name,\n bulkDelete: (dataService, ids) =>\n dataService.collection.deleteCollections(ids).pipe(map(res => res.deleteCollections)),\n});\n\nexport const moveCollectionsBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\n location: 'collection-list',\n label: _('catalog.move-collections'),\n icon: 'drag-handle',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateCollection),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n modalService\n .fromComponent(MoveCollectionsDialogComponent, {\n size: 'xl',\n closable: true,\n })\n .pipe(\n switchMap(result => {\n if (result) {\n const inputs: MoveCollectionInput[] = selection.map(c => ({\n collectionId: c.id,\n parentId: result.id,\n index: 0,\n }));\n return dataService.collection.moveCollection(inputs);\n } else {\n return EMPTY;\n }\n }),\n )\n .subscribe(result => {\n notificationService.success(_('catalog.move-collections-success'), {\n count: selection.length,\n });\n clearSelection();\n hostComponent.refresh();\n });\n },\n};\n\nexport const assignCollectionsToChannelBulkAction = createBulkAssignToChannelAction<\n ItemOf<GetCollectionListQuery, 'collections'>\n>({\n location: 'collection-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateCollection),\n getItemName: item => item.name,\n bulkAssignToChannel: (dataService, collectionIds, channelIds) =>\n channelIds.map(channelId =>\n dataService.collection\n .assignCollectionsToChannel({\n collectionIds,\n channelId,\n })\n .pipe(map(res => res.assignCollectionsToChannel)),\n ),\n});\n\nexport const removeCollectionsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetCollectionListQuery, 'collections'>\n>({\n location: 'collection-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteCatalog) ||\n userPermissions.includes(Permission.DeleteCollection),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, collectionIds, channelId) =>\n dataService.collection\n .removeCollectionsFromChannel({\n channelId: channelId,\n collectionIds,\n })\n .pipe(map(res => res.removeCollectionsFromChannel)),\n});\n\nexport const duplicateCollectionsBulkAction: BulkAction<\n ItemOf<GetCollectionListQuery, 'collections'>,\n CollectionListComponent\n> = {\n location: 'collection-list',\n label: _('common.duplicate'),\n icon: 'copy',\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(DuplicateEntityDialogComponent<ItemOf<GetCollectionListQuery, 'collections'>>, {\n locals: {\n entities: selection,\n entityName: 'Collection',\n title: _('catalog.duplicate-collections'),\n getEntityName: entity => entity.name,\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n hostComponent.refresh();\n }\n });\n },\n};\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n GetCollectionListDocument,\n GetCollectionListQuery,\n ItemOf,\n LanguageCode,\n NotificationService,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { distinctUntilChanged, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { CollectionOrderEvent } from '../collection-data-table/collection-data-table.component';\n\n@Component({\n selector: 'vdr-collection-list',\n templateUrl: './collection-list.component.html',\n styleUrls: ['./collection-list.component.scss', './collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionListComponent\n extends TypedBaseListComponent<typeof GetCollectionListDocument, 'collections'>\n implements OnInit\n{\n activeCollectionId$: Observable<string | null>;\n activeCollectionIndex$: Observable<number>;\n activeCollectionTitle$: Observable<string>;\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n expandedIds: string[] = [];\n dataTableListId = 'collection-list';\n readonly customFields = this.getCustomFieldConfig('Collection');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilter({\n name: 'slug',\n label: _('common.slug'),\n type: { kind: 'text' },\n filterField: 'slug',\n })\n .addFilter({\n name: 'visibility',\n type: { kind: 'boolean' },\n label: _('common.visibility'),\n toFilterInput: value => ({\n isPrivate: { eq: !value },\n }),\n })\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n readonly sorts = this.createSortCollection()\n .defaultSort('position', 'ASC')\n .addSort({ name: 'createdAt' })\n .addSort({ name: 'updatedAt' })\n .addSort({ name: 'name' })\n .addSort({ name: 'slug' })\n .addSort({ name: 'position' })\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor(\n protected dataService: DataService,\n private notificationService: NotificationService,\n ) {\n super();\n super.configure({\n document: GetCollectionListDocument,\n getItems: data => data.collections,\n setVariables: (skip, _take) => {\n const topLevelOnly =\n this.searchTermControl.value === '' && this.filters.activeFilters.length === 0\n ? true\n : undefined;\n return {\n options: {\n skip,\n take: _take,\n filter: {\n name: { contains: this.searchTermControl.value },\n ...this.filters.createFilterInput(),\n },\n topLevelOnly,\n sort: this.sorts.createSortInput(),\n },\n };\n },\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\n });\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.activeCollectionId$ = this.route.paramMap.pipe(\n map(pm => pm.get('contents')),\n distinctUntilChanged(),\n );\n const expandedIds$ = this.route.queryParamMap.pipe(\n map(qpm => qpm.get('expanded')),\n distinctUntilChanged(),\n map(ids => (ids ? ids.split(',') : [])),\n );\n expandedIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\n this.expandedIds = ids;\n });\n this.subCollections$ = combineLatest(expandedIds$, this.refresh$).pipe(\n switchMap(([ids]) => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n\n this.activeCollectionTitle$ = combineLatest(\n this.activeCollectionId$,\n this.items$,\n this.subCollections$,\n ).pipe(\n map(([id, collections, subCollections]) => {\n if (id) {\n const match = [...collections, ...subCollections].find(c => c.id === id);\n return match ? match.name : '';\n }\n return '';\n }),\n );\n this.activeCollectionIndex$ = combineLatest(\n this.activeCollectionId$,\n this.items$,\n this.subCollections$,\n ).pipe(\n map(([id, collections, subCollections]) => {\n if (id) {\n const allCollections: typeof collections = [];\n for (const collection of collections) {\n allCollections.push(collection);\n const subCollectionMatches = subCollections.filter(\n c => c.parentId && c.parentId === collection.id,\n );\n allCollections.push(...subCollectionMatches);\n }\n return allCollections.findIndex(c => c.id === id);\n }\n return -1;\n }),\n );\n }\n\n onRearrange(event: CollectionOrderEvent) {\n this.dataService.collection.moveCollection([event]).subscribe({\n next: () => {\n this.notificationService.success(_('common.notify-saved-changes'));\n this.refresh();\n },\n error: err => {\n this.notificationService.error(_('common.notify-save-changes-error'));\n },\n });\n }\n\n closeContents() {\n const params = { ...this.route.snapshot.params };\n delete params.contents;\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\n }\n\n setLanguage(code: LanguageCode) {\n this.dataService.client.setContentLanguage(code).subscribe();\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.router.navigate(['./'], {\n queryParams: {\n expanded: expandedIds.filter(id => !!id).join(','),\n },\n queryParamsHandling: 'merge',\n relativeTo: this.route,\n });\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"collection-list\" />\n <a\n class=\"btn btn-primary\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\n [routerLink]=\"['./create']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-collection' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"collection-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-split-view [rightPanelOpen]=\"activeCollectionId$ | async\" (closeClicked)=\"closeContents()\">\n <ng-template vdrSplitViewLeft>\n <vdr-collection-data-table\n class=\"mt-2\"\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [subCollections]=\"subCollections$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n [activeIndex]=\"activeCollectionIndex$ | async\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (changeOrder)=\"onRearrange($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n >\n <vdr-bulk-action-menu\n locationId=\"collection-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n ></vdr-bulk-action-menu>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\n ></vdr-dt2-search>\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-collection=\"item\">\n {{ collection.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-collection=\"item\">\n {{ collection.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-collection=\"item\">\n {{ collection.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.position' | translate\" id=\"position\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('position')\"\n >\n <ng-template let-collection=\"item\">\n {{ collection.position }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.name' | translate\" id=\"name\"\n [optional]=\"false\"\n [sort]=\"sorts.get('name')\"\n >\n <ng-template let-collection=\"item\" let-depth=\"depth\">\n <div [ngClass]=\"'indent-' + depth\"></div>\n <clr-icon\n class=\"child-arrow\"\n [class.transparent]=\"depth === 0\"\n shape=\"child-arrow\"\n *ngIf=\"!collection.children?.length\"\n ></clr-icon>\n <button\n class=\"icon-button folder-button\"\n *ngIf=\"collection.children?.length\"\n (click)=\"toggleExpanded(collection)\"\n >\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\n </button>\n <a class=\"button-ghost\" [routerLink]=\"['./', collection.id]\"\n ><span>{{ collection.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\n <ng-template let-collection=\"item\">\n <div class=\"breadcrumb\">\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\n <ng-container *ngIf=\"breadcrumbs.length\">\n <div *ngFor=\"let item of breadcrumbs\">\n <span class=\"separator\">/</span>{{ item.name }}\n </div>\n </ng-container>\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\n </ng-container>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\n <ng-template let-collection=\"item\">\n {{ collection.slug }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\n <ng-template let-collection=\"item\">\n <vdr-chip *ngIf=\"collection.isPrivate\" colorType=\"warning\">{{\n 'common.private' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!collection.isPrivate\" colorType=\"success\">{{\n 'common.public' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.view-contents' | translate\" id=\"view-contents\" [optional]=\"false\">\n <ng-template let-collection=\"item\">\n <a\n class=\"button-small bg-weight-150\"\n [routerLink]=\"['./', { contents: collection.id }]\"\n [queryParams]=\"{ contentsPage: 1 }\"\n queryParamsHandling=\"merge\"\n >\n <span>{{ 'common.view-contents' | translate }}</span>\n <clr-icon shape=\"file-group\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n </vdr-collection-data-table>\n </ng-template>\n <ng-template vdrSplitViewRight [splitViewTitle]=\"activeCollectionTitle$ | async\">\n <ng-container *ngIf=\"activeCollectionId$ | async as activeGroup\">\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\"></vdr-collection-contents>\n </ng-container>\n </ng-template>\n</vdr-split-view>\n", "import { CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nimport { RootNode, TreeNode } from './array-to-tree';\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\n\n/**\n * Facilitates communication between the CollectionTreeComponent and child CollectionTreeNodeComponents\n * without introducing a cyclic dependency.\n */\n@Injectable()\nexport class CollectionTreeService implements OnDestroy {\n private allMoveListItems: Array<{ path: string; id: string; ancestorIdPath: Set<string> }> = [];\n private collectionTree: RootNode<CollectionPartial>;\n private _rearrange$ = new Subject<RearrangeEvent>();\n private _delete$ = new Subject<string>();\n\n public rearrange$: Observable<RearrangeEvent>;\n public delete$: Observable<string>;\n\n constructor() {\n this.rearrange$ = this._rearrange$.asObservable();\n this.delete$ = this._delete$.asObservable();\n }\n\n ngOnDestroy() {\n this._rearrange$.complete();\n this._delete$.complete();\n }\n\n setCollectionTree(tree: RootNode<CollectionPartial>) {\n this.collectionTree = tree;\n }\n\n resetMoveList() {\n this.allMoveListItems = [];\n }\n\n getMoveListItems(collection: CollectionPartial) {\n if (this.allMoveListItems.length === 0) {\n this.allMoveListItems = this.calculateAllMoveListItems();\n }\n return this.allMoveListItems.filter(\n item =>\n item.id !== collection.id &&\n !item.ancestorIdPath.has(collection.id) &&\n item.id !== collection.parent?.id,\n );\n }\n\n onDrop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\n const item = event.item.data as CollectionPartial;\n const newParent = event.container.data;\n const newParentId = newParent.id;\n if (newParentId == null) {\n throw new Error(`Could not determine the ID of the root Collection`);\n }\n this._rearrange$.next({\n collectionId: item.id,\n parentId: newParentId,\n index: event.currentIndex,\n });\n }\n\n onMove(event: RearrangeEvent) {\n this._rearrange$.next(event);\n }\n\n onDelete(id: string) {\n this._delete$.next(id);\n }\n\n private calculateAllMoveListItems() {\n const visit = (\n node: TreeNode<any>,\n parentPath: string[],\n ancestorIdPath: Set<string>,\n output: Array<{ path: string; id: string; ancestorIdPath: Set<string> }>,\n ) => {\n const path = parentPath.concat(node.name);\n output.push({ path: path.slice(1).join(' / ') || 'root', id: node.id, ancestorIdPath });\n node.children.forEach(child =>\n visit(child, path, new Set<string>([...ancestorIdPath, node.id]), output),\n );\n return output;\n };\n return visit(this.collectionTree, [], new Set<string>(), []);\n }\n}\n", "import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n SimpleChanges,\n SkipSelf,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { DataService, Permission, SelectionManager } from '@vendure/admin-ui/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\n\nimport { RootNode, TreeNode } from './array-to-tree';\nimport { CollectionTreeService } from './collection-tree.service';\nimport { CollectionPartial } from './collection-tree.types';\n\n@Component({\n selector: 'vdr-collection-tree-node',\n templateUrl: './collection-tree-node.component.html',\n styleUrls: ['./collection-tree-node.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CollectionTreeNodeComponent implements OnInit, OnChanges, OnDestroy {\n depth = 0;\n parentName: string;\n @Input() collectionTree: TreeNode<CollectionPartial>;\n @Input() activeCollectionId: string;\n @Input() expandAll = false;\n @Input() selectionManager: SelectionManager<CollectionPartial>;\n hasUpdatePermission$: Observable<boolean>;\n hasDeletePermission$: Observable<boolean>;\n moveListItems: Array<{ path: string; id: string }> = [];\n private subscription: Subscription;\n\n constructor(\n @SkipSelf() @Optional() private parent: CollectionTreeNodeComponent,\n private dataService: DataService,\n private collectionTreeService: CollectionTreeService,\n private router: Router,\n private route: ActivatedRoute,\n private changeDetectorRef: ChangeDetectorRef,\n ) {\n if (parent) {\n this.depth = parent.depth + 1;\n }\n }\n\n ngOnInit() {\n this.parentName = this.collectionTree.name || '<root>';\n const permissions$ = this.dataService.client\n .userStatus()\n .mapStream(data => data.userStatus.permissions)\n .pipe(shareReplay(1));\n this.hasUpdatePermission$ = permissions$.pipe(\n map(\n perms =>\n perms.includes(Permission.UpdateCatalog) || perms.includes(Permission.UpdateCollection),\n ),\n );\n this.hasDeletePermission$ = permissions$.pipe(\n map(\n perms =>\n perms.includes(Permission.DeleteCatalog) || perms.includes(Permission.DeleteCollection),\n ),\n );\n this.subscription = this.selectionManager?.selectionChanges$.subscribe(() =>\n this.changeDetectorRef.markForCheck(),\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const expandAllChange = changes['expandAll'];\n if (expandAllChange) {\n if (expandAllChange.previousValue === true && expandAllChange.currentValue === false) {\n this.collectionTree.children.forEach(c => (c.expanded = false));\n }\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n\n trackByFn(index: number, item: CollectionPartial) {\n return item.id;\n }\n\n toggleExpanded(collection: TreeNode<CollectionPartial>) {\n collection.expanded = !collection.expanded;\n let expandedIds = this.route.snapshot.queryParamMap.get('expanded')?.split(',') ?? [];\n if (collection.expanded) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.router.navigate(['./'], {\n queryParams: {\n expanded: expandedIds.filter(id => !!id).join(','),\n },\n queryParamsHandling: 'merge',\n relativeTo: this.route,\n });\n }\n\n getMoveListItems(collection: CollectionPartial) {\n this.moveListItems = this.collectionTreeService.getMoveListItems(collection);\n }\n\n move(collection: CollectionPartial, parentId: string) {\n this.collectionTreeService.onMove({\n index: 0,\n parentId,\n collectionId: collection.id,\n });\n }\n\n moveUp(collection: CollectionPartial, currentIndex: number) {\n if (!collection.parent) {\n return;\n }\n this.collectionTreeService.onMove({\n index: currentIndex - 1,\n parentId: collection.parent.id,\n collectionId: collection.id,\n });\n }\n\n moveDown(collection: CollectionPartial, currentIndex: number) {\n if (!collection.parent) {\n return;\n }\n this.collectionTreeService.onMove({\n index: currentIndex + 1,\n parentId: collection.parent.id,\n collectionId: collection.id,\n });\n }\n\n drop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\n moveItemInArray(this.collectionTree.children, event.previousIndex, event.currentIndex);\n this.collectionTreeService.onDrop(event);\n }\n\n delete(id: string) {\n this.collectionTreeService.onDelete(id);\n }\n}\n", "<div\n cdkDropList\n class=\"tree-node\"\n #dropList\n [cdkDropListData]=\"collectionTree\"\n [cdkDropListDisabled]=\"!(hasUpdatePermission$ | async)\"\n (cdkDropListDropped)=\"drop($event)\"\n>\n <div\n class=\"collection\"\n [class.private]=\"collection.isPrivate\"\n *ngFor=\"let collection of collectionTree.children; index as i; trackBy: trackByFn\"\n cdkDrag\n [cdkDragData]=\"collection\"\n >\n <div\n class=\"collection-detail\"\n [ngClass]=\"'depth-' + depth\"\n [class.active]=\"collection.id === activeCollectionId\"\n >\n <div>\n <input\n type=\"checkbox\"\n clrCheckbox\n [checked]=\"selectionManager.isSelected(collection)\"\n (click)=\"selectionManager.toggleSelection(collection, $event)\"\n />\n </div>\n <div class=\"name\">\n <button\n class=\"icon-button folder-button\"\n [disabled]=\"expandAll\"\n *ngIf=\"collection.children?.length; else folderSpacer\"\n (click)=\"toggleExpanded(collection)\"\n >\n <clr-icon shape=\"folder\" *ngIf=\"!collection.expanded && !expandAll\"></clr-icon>\n <clr-icon shape=\"folder-open\" *ngIf=\"collection.expanded || expandAll\"></clr-icon>\n </button>\n <ng-template #folderSpacer>\n <div class=\"folder-button-spacer\"></div>\n </ng-template>\n {{ collection.name }}\n </div>\n <div class=\"flex-spacer\"></div>\n <vdr-chip *ngIf=\"collection.isPrivate\">{{ 'catalog.private' | translate }}</vdr-chip>\n <a\n class=\"btn btn-link btn-sm\"\n [routerLink]=\"['./', { contents: collection.id }]\"\n queryParamsHandling=\"preserve\"\n >\n <clr-icon shape=\"view-list\"></clr-icon>\n {{ 'catalog.view-contents' | translate }}\n </a>\n <a class=\"btn btn-link btn-sm\" [routerLink]=\"['/catalog/collections/', collection.id]\">\n <clr-icon shape=\"edit\"></clr-icon>\n {{ 'common.edit' | translate }}\n </a>\n <div class=\"drag-handle\" cdkDragHandle *vdrIfPermissions=\"['UpdateCatalog', 'UpdateCollection']\">\n <clr-icon shape=\"drag-handle\" size=\"24\"></clr-icon>\n </div>\n <vdr-dropdown>\n <button class=\"icon-button\" vdrDropdownTrigger (click)=\"getMoveListItems(collection)\">\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\n <a\n class=\"dropdown-item\"\n [routerLink]=\"['./', 'create', { parentId: collection.id }]\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-collection' | translate }}\n </a>\n <div class=\"dropdown-divider\"></div>\n <button\n type=\"button\"\n vdrDropdownItem\n [disabled]=\"i === 0 || !(hasUpdatePermission$ | async)\"\n (click)=\"moveUp(collection, i)\"\n >\n <clr-icon shape=\"caret up\"></clr-icon>\n {{ 'catalog.move-up' | translate }}\n </button>\n <button\n type=\"button\"\n vdrDropdownItem\n [disabled]=\"\n i === collectionTree.children.length - 1 || !(hasUpdatePermission$ | async)\n \"\n (click)=\"moveDown(collection, i)\"\n >\n <clr-icon shape=\"caret down\"></clr-icon>\n {{ 'catalog.move-down' | translate }}\n </button>\n <h4 class=\"dropdown-header\">{{ 'catalog.move-to' | translate }}</h4>\n <button\n type=\"button\"\n vdrDropdownItem\n *ngFor=\"let item of moveListItems\"\n (click)=\"move(collection, item.id)\"\n [disabled]=\"!(hasUpdatePermission$ | async)\"\n >\n <div class=\"move-to-item\">\n <div class=\"move-icon\">\n <clr-icon shape=\"child-arrow\"></clr-icon>\n </div>\n <div class=\"path\">\n {{ item.path }}\n </div>\n </div>\n </button>\n <div class=\"dropdown-divider\"></div>\n <button\n class=\"button\"\n vdrDropdownItem\n (click)=\"delete(collection.id)\"\n [disabled]=\"!(hasDeletePermission$ | async)\"\n >\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\n {{ 'common.delete' | translate }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n <vdr-collection-tree-node\n *ngIf=\"collection.expanded || expandAll\"\n [expandAll]=\"expandAll\"\n [collectionTree]=\"collection\"\n [activeCollectionId]=\"activeCollectionId\"\n [selectionManager]=\"selectionManager\"\n ></vdr-collection-tree-node>\n </div>\n</div>\n", "export type HasParent = { id: string; parent?: { id: string } | null };\nexport type TreeNode<T extends HasParent> = T & { children: Array<TreeNode<T>>; expanded: boolean };\nexport type RootNode<T extends HasParent> = { id?: string; children: Array<TreeNode<T>> };\n\n/**\n * Builds a tree from an array of nodes which have a parent.\n * Based on https://stackoverflow.com/a/31247960/772859, modified to preserve ordering.\n */\nexport function arrayToTree<T extends HasParent>(\n nodes: T[],\n currentState?: RootNode<T>,\n expandedIds: string[] = [],\n): RootNode<T> {\n const topLevelNodes: Array<TreeNode<T>> = [];\n const mappedArr: { [id: string]: TreeNode<T> } = {};\n const currentStateMap = treeToMap(currentState);\n\n // First map the nodes of the array to an object -> create a hash table.\n for (const node of nodes) {\n mappedArr[node.id] = { ...(node as any), children: [] };\n }\n\n for (const id of nodes.map(n => n.id)) {\n if (mappedArr.hasOwnProperty(id)) {\n const mappedElem = mappedArr[id];\n mappedElem.expanded = currentStateMap.get(id)?.expanded ?? expandedIds.includes(id);\n const parent = mappedElem.parent;\n if (!parent) {\n continue;\n }\n // If the element is not at the root level, add it to its parent array of children.\n const parentIsRoot = !mappedArr[parent.id];\n if (!parentIsRoot) {\n if (mappedArr[parent.id]) {\n mappedArr[parent.id].children.push(mappedElem);\n } else {\n mappedArr[parent.id] = { children: [mappedElem] } as any;\n }\n } else {\n topLevelNodes.push(mappedElem);\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rootId = topLevelNodes.length ? topLevelNodes[0].parent!.id : undefined;\n return { id: rootId, children: topLevelNodes };\n}\n\n/**\n * Converts an existing tree (as generated by the arrayToTree function) into a flat\n * Map. This is used to persist certain states (e.g. `expanded`) when re-building the\n * tree.\n */\nfunction treeToMap<T extends HasParent>(tree?: RootNode<T>): Map<string, TreeNode<T>> {\n const nodeMap = new Map<string, TreeNode<T>>();\n function visit(node: TreeNode<T>) {\n nodeMap.set(node.id, node);\n node.children.forEach(visit);\n }\n if (tree) {\n visit(tree as TreeNode<T>);\n }\n return nodeMap;\n}\n", "import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { Collection, SelectionManager } from '@vendure/admin-ui/core';\n\nimport { arrayToTree, RootNode } from './array-to-tree';\nimport { CollectionTreeService } from './collection-tree.service';\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\n\n@Component({\n selector: 'vdr-collection-tree',\n templateUrl: 'collection-tree.component.html',\n styleUrls: ['./collection-tree.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [CollectionTreeService],\n standalone: false\n})\nexport class CollectionTreeComponent implements OnInit, OnChanges {\n @Input() collections: CollectionPartial[];\n @Input() activeCollectionId: string;\n @Input() expandAll = false;\n @Input() expandedIds: string[] = [];\n @Input() selectionManager: SelectionManager<CollectionPartial>;\n @Output() rearrange = new EventEmitter<RearrangeEvent>();\n @Output() deleteCollection = new EventEmitter<string>();\n collectionTree: RootNode<CollectionPartial>;\n\n constructor(private collectionTreeService: CollectionTreeService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if ('collections' in changes && this.collections) {\n this.collectionTree = arrayToTree(this.collections, this.collectionTree, this.expandedIds);\n this.collectionTreeService.setCollectionTree(this.collectionTree);\n this.collectionTreeService.resetMoveList();\n }\n }\n\n ngOnInit() {\n this.collectionTreeService.rearrange$.subscribe(event => this.rearrange.emit(event));\n this.collectionTreeService.delete$.subscribe(id => this.deleteCollection.emit(id));\n }\n}\n", "<vdr-collection-tree-node\n *ngIf=\"collectionTree\"\n cdkDropListGroup\n [expandAll]=\"expandAll\"\n [collectionTree]=\"collectionTree\"\n [selectionManager]=\"selectionManager\"\n [activeCollectionId]=\"activeCollectionId\"\n></vdr-collection-tree-node>\n", "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Dialog, GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-confirm-variant-deletion-dialog',\n templateUrl: './confirm-variant-deletion-dialog.component.html',\n styleUrls: ['./confirm-variant-deletion-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ConfirmVariantDeletionDialogComponent implements Dialog<boolean> {\n resolveWith: (result?: boolean) => void;\n variants: NonNullable<GetProductVariantOptionsQuery['product']>['variants'] = [];\n\n confirm() {\n this.resolveWith(true);\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.confirm-deletion-of-unused-variants-title' | translate }}\n</ng-template>\n{{ 'catalog.confirm-deletion-of-unused-variants-body' | translate }}\n<ul>\n <li *ngFor=\"let variant of variants\">{{ variant.name }} ({{ variant.sku }})</li>\n</ul>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport { CreateFacetValueInput, Dialog, LanguageCode } from '@vendure/admin-ui/core';\n\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\n\n@Component({\n selector: 'vdr-create-facet-value-dialog',\n templateUrl: './create-facet-value-dialog.component.html',\n styleUrls: ['./create-facet-value-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class CreateFacetValueDialogComponent implements Dialog<CreateFacetValueInput> {\n resolveWith: (result?: CreateFacetValueInput) => void;\n languageCode: LanguageCode;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n code: ['', Validators.required],\n });\n facetId: string;\n constructor(private formBuilder: FormBuilder) {}\n\n updateCode() {\n const nameControl = this.form.get('name');\n const codeControl = this.form.get('code');\n if (nameControl && codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\n }\n }\n\n confirm() {\n const { name, code } = this.form.value;\n if (!name || !code) {\n return;\n }\n this.resolveWith({\n facetId: this.facetId,\n code,\n translations: [{ languageCode: this.languageCode, name }],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n", "<ng-template vdrDialogTitle>\n {{ 'catalog.create-facet-value' | translate }}\n</ng-template>\n<div class=\"form-grid\" [formGroup]=\"form\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'common.code' | translate\"\n for=\"code\"\n >\n <input\n id=\"code\"\n type=\"text\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n</div>\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\" [disabled]=\"form.invalid\">\n {{ 'common.confirm' | translate }}\n </button>\n</ng-template>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n FormRecord,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n CreateFacetInput,\n createUpdatedTranslatable,\n DataService,\n DeletionResult,\n FACET_WITH_VALUE_LIST_FRAGMENT,\n FacetWithValueListFragment,\n findTranslation,\n getCustomFieldsDefaults,\n GetFacetDetailDocument,\n GetFacetDetailQuery,\n GetFacetDetailQueryVariables,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n TypedBaseDetailComponent,\n UpdateFacetInput,\n UpdateFacetValueInput,\n} from '@vendure/admin-ui/core';\nimport { SortOrder } from '@vendure/common/lib/generated-types';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\nimport { gql } from 'apollo-angular';\nimport { BehaviorSubject, combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\nimport { debounceTime, map, mergeMap, switchMap, take, takeUntil } from 'rxjs/operators';\nimport { CreateFacetValueDialogComponent } from '../create-facet-value-dialog/create-facet-value-dialog.component';\n\nexport const FACET_DETAIL_QUERY = gql`\n query GetFacetDetail($id: ID!, $facetValueListOptions: FacetValueListOptions) {\n facet(id: $id) {\n ...FacetWithValueList\n }\n }\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\n`;\n\ntype ValueItem =\n | FacetWithValueListFragment['valueList']['items'][number]\n | { id: string; name: string; code: string };\n\n@Component({\n selector: 'vdr-facet-detail',\n templateUrl: './facet-detail.component.html',\n styleUrls: ['./facet-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class FacetDetailComponent\n extends TypedBaseDetailComponent<typeof GetFacetDetailDocument, 'facet'>\n implements OnInit, OnDestroy\n{\n readonly customFields = this.getCustomFieldConfig('Facet');\n readonly customValueFields = this.getCustomFieldConfig('FacetValue');\n detailForm = this.formBuilder.group({\n facet: this.formBuilder.group({\n code: ['', Validators.required],\n name: '',\n visible: true,\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n }),\n values: this.formBuilder.record<\n FormGroup<{\n id: FormControl<string>;\n name: FormControl<string>;\n code: FormControl<string>;\n customFields: FormGroup;\n }>\n >({}),\n });\n currentPage = 1;\n itemsPerPage = 10;\n totalItems = 0;\n filterControl = new FormControl('');\n values$ = new BehaviorSubject<ValueItem[]>([]);\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateFacet];\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n protected dataService: DataService,\n private formBuilder: FormBuilder,\n private notificationService: NotificationService,\n private modalService: ModalService,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n this.filterControl.valueChanges\n .pipe(debounceTime(200), takeUntil(this.destroy$))\n .subscribe(filterTerm => {\n this.currentPage = 1;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, filterTerm);\n });\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n updateCode(currentCode: string, nameValue: string) {\n if (!currentCode) {\n const codeControl = this.detailForm.get(['facet', 'code']);\n if (codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(nameValue, '-'));\n }\n }\n }\n\n updateValueCode(currentCode: string, nameValue: string, valueId: string) {\n if (!currentCode) {\n const codeControl = this.detailForm.get(['values', valueId, 'code']);\n if (codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(nameValue, '-'));\n }\n }\n }\n\n customValueFieldIsSet(index: number, name: string): boolean {\n return !!this.detailForm.get(['values', index, 'customFields', name]);\n }\n\n addFacetValue() {\n this.modalService\n .fromComponent(CreateFacetValueDialogComponent, {\n locals: {\n languageCode: this.languageCode,\n facetId: this.id,\n },\n })\n .pipe(\n switchMap(result => {\n if (!result) {\n return EMPTY;\n } else {\n return this.dataService.facet.createFacetValues([result]);\n }\n }),\n )\n .subscribe(result => {\n if (result.createFacetValues) {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'FacetValue',\n });\n this.currentPage = 1;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage);\n }\n });\n }\n\n create() {\n const facetForm = this.detailForm.get('facet') as (typeof this.detailForm)['controls']['facet'];\n if (!facetForm || !facetForm.dirty) {\n return;\n }\n const newFacet = this.getUpdatedFacet(\n {\n id: '',\n createdAt: '',\n updatedAt: '',\n isPrivate: false,\n languageCode: this.languageCode,\n name: '',\n code: '',\n translations: [],\n },\n facetForm,\n this.languageCode,\n ) as CreateFacetInput;\n this.dataService.facet.createFacet(newFacet).subscribe(\n data => {\n this.notificationService.success(_('common.notify-create-success'), { entity: 'Facet' });\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.router.navigate(['../', data.createFacet.id], { relativeTo: this.route });\n },\n err => {\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Facet',\n });\n },\n );\n }\n\n save() {\n const valuesFormRecord = this.detailForm.get(\n 'values',\n ) as (typeof this.detailForm)['controls']['values'];\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([facet, languageCode]) => {\n const facetForm = this.detailForm.get(\n 'facet',\n ) as (typeof this.detailForm)['controls']['facet'];\n const updateOperations: Array<Observable<any>> = [];\n\n if (facetForm && facetForm.dirty) {\n const updatedFacetInput = this.getUpdatedFacet(\n facet,\n facetForm,\n languageCode,\n ) as UpdateFacetInput;\n if (updatedFacetInput) {\n updateOperations.push(this.dataService.facet.updateFacet(updatedFacetInput));\n }\n }\n if (valuesFormRecord && valuesFormRecord.dirty) {\n const updatedValues = this.getUpdatedFacetValues(valuesFormRecord, languageCode);\n if (updatedValues.length) {\n updateOperations.push(this.dataService.facet.updateFacetValues(updatedValues));\n }\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Facet' });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Facet',\n });\n },\n );\n }\n\n deleteFacetValue(facetValueId: string) {\n this.showModalAndDelete(facetValueId)\n .pipe(\n switchMap(response => {\n if (response.result === DeletionResult.DELETED) {\n return [true];\n } else {\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\n map(r => r.result === DeletionResult.DELETED),\n );\n }\n }),\n switchMap(deleted =>\n deleted\n ? this.dataService.query(GetFacetDetailDocument, {\n id: this.id,\n }).single$\n : [],\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'FacetValue',\n });\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, this.filterControl.value);\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'FacetValue',\n });\n },\n );\n }\n\n private showModalAndDelete(facetValueId: string, message?: string) {\n return this.modalService\n .dialog({\n title: _('catalog.confirm-delete-facet-value'),\n body: message,\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(result =>\n result ? this.dataService.facet.deleteFacetValues([facetValueId], !!message) : EMPTY,\n ),\n map(result => result.deleteFacetValues[0]),\n );\n }\n\n protected setCurrentPage(newPage: number) {\n this.currentPage = newPage;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, this.filterControl.value);\n }\n\n protected setItemsPerPage(itemsPerPage: number) {\n this.itemsPerPage = itemsPerPage;\n this.fetchFacetValues(this.currentPage, this.itemsPerPage, this.filterControl.value);\n }\n\n private fetchFacetValues(currentPage: number, itemsPerPage: number, filterTerm?: string | null) {\n this.dataService\n .query<GetFacetDetailQuery, GetFacetDetailQueryVariables>(FACET_DETAIL_QUERY, {\n id: this.id,\n facetValueListOptions: {\n take: itemsPerPage,\n skip: (currentPage - 1) * itemsPerPage,\n sort: {\n createdAt: SortOrder.DESC,\n },\n ...(filterTerm ? { filter: { name: { contains: filterTerm } } } : {}),\n },\n })\n .single$.subscribe(({ facet }) => {\n if (facet) {\n this.values$.next([...facet.valueList.items]);\n this.totalItems = facet.valueList.totalItems;\n this.setFacetValueFormValues(facet, this.languageCode);\n }\n });\n }\n\n /**\n * Sets the values of the form on changes to the facet or current language.\n */\n protected setFormValues(facet: FacetWithValueListFragment, languageCode: LanguageCode) {\n const currentTranslation = findTranslation(facet, languageCode);\n\n this.detailForm.patchValue({\n facet: {\n code: facet.code,\n visible: !facet.isPrivate,\n name: currentTranslation?.name ?? '',\n },\n });\n\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get(['facet', 'customFields']),\n facet,\n currentTranslation,\n );\n }\n this.values$.next([...facet.valueList.items]);\n this.totalItems = facet.valueList.totalItems;\n this.setFacetValueFormValues(facet, languageCode);\n }\n\n private setFacetValueFormValues(facet: FacetWithValueListFragment, languageCode: LanguageCode) {\n const currentValuesFormGroup = this.detailForm.get('values') as FormRecord;\n facet.valueList.items.forEach(value => {\n const valueTranslation = findTranslation(value, languageCode);\n const group = {\n id: value.id,\n code: value.code,\n name: valueTranslation ? valueTranslation.name : '',\n };\n let valueControl = currentValuesFormGroup.get(value.id) as FormGroup;\n if (!valueControl) {\n valueControl = this.formBuilder.group(group);\n currentValuesFormGroup.addControl(value.id, valueControl);\n } else {\n valueControl.patchValue(group);\n }\n if (this.customValueFields.length) {\n let customValueFieldsGroup = valueControl.get(['customFields']) as\n | UntypedFormGroup\n | undefined;\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = new UntypedFormGroup({});\n valueControl.addControl('customFields', customValueFieldsGroup);\n }\n\n if (customValueFieldsGroup) {\n for (const fieldDef of this.customValueFields) {\n const key = fieldDef.name;\n const fieldValue =\n fieldDef.type === 'localeString'\n ? (valueTranslation as any | undefined)?.customFields?.[key]\n : (value as any).customFields[key];\n const control = customValueFieldsGroup.get(key);\n if (control) {\n control.setValue(fieldValue);\n } else {\n customValueFieldsGroup.addControl(key, new UntypedFormControl(fieldValue));\n }\n }\n }\n }\n });\n }\n\n /**\n * Given a facet and the value of the detailForm, this method creates an updated copy of the facet which\n * can then be persisted to the API.\n */\n private getUpdatedFacet(\n facet: Omit<FacetWithValueListFragment, 'valueList'>,\n facetFormGroup: (typeof this.detailForm)['controls']['facet'],\n languageCode: LanguageCode,\n ): CreateFacetInput | UpdateFacetInput {\n const input = createUpdatedTranslatable({\n translatable: facet,\n updatedFields: facetFormGroup.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: facet.name || '',\n },\n });\n input.isPrivate = !facetFormGroup.value.visible;\n return input;\n }\n\n /**\n * Given an array of facet values and the values from the detailForm, this method creates a new array\n * which can be persisted to the API via an updateFacetValues mutation.\n */\n private getUpdatedFacetValues(\n valuesFormGroup: FormGroup,\n languageCode: LanguageCode,\n ): UpdateFacetValueInput[] {\n const dirtyValueValues = Object.values(valuesFormGroup.controls)\n .filter(c => c.dirty)\n .map(c => c.value);\n\n return dirtyValueValues\n .map((value, i) =>\n createUpdatedTranslatable({\n translatable: value,\n updatedFields: value,\n customFieldConfig: this.customValueFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: '',\n },\n }),\n )\n .filter(notNullOrUndefined);\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"facet-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n *vdrIfPermissions=\"updatePermission\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"facet-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar formGroupName=\"facet\">\n <vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n formControlName=\"visible\"\n id=\"visibility\"\n />\n <label class=\"visible-toggle\">\n <ng-container *ngIf=\"detailForm.value.facet?.visible; else private\">{{\n 'catalog.public' | translate\n }}</ng-container>\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\n </label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <vdr-card>\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n <vdr-page-block>\n <vdr-card formGroupName=\"facet\">\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n (input)=\"updateCode(entity?.code, $event.target.value)\"\n />\n </vdr-form-field>\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\n <input\n id=\"code\"\n type=\"text\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"code\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"Facet\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('facet.customFields')\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </vdr-card>\n\n <vdr-custom-detail-component-host\n locationId=\"facet-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n\n <vdr-card\n *ngIf=\"!(isNew$ | async)\"\n [title]=\"'catalog.facet-values' | translate\"\n [paddingX]=\"false\"\n >\n <ng-template vdrCardControls>\n <input\n type=\"text\"\n class=\"mr-3\"\n [formControl]=\"filterControl\"\n [placeholder]=\"'catalog.filter-by-name' | translate\"\n />\n </ng-template>\n <ng-container *ngIf=\"values$ | async as filteredValues\">\n <table class=\"facet-values-list table\" formArrayName=\"values\">\n <thead>\n <tr>\n <th></th>\n <th>{{ 'common.name' | translate }}</th>\n <th>{{ 'common.code' | translate }}</th>\n <ng-container *ngIf=\"customValueFields.length\">\n <th>{{ 'common.custom-fields' | translate }}</th>\n </ng-container>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr\n class=\"facet-value\"\n *ngFor=\"\n let value of filteredValues\n | paginate\n : {\n currentPage: currentPage,\n itemsPerPage: itemsPerPage,\n totalItems: totalItems,\n };\n let i = index\n \"\n [formGroup]=\"detailForm.get(['values', value.id])\"\n >\n <td class=\"align-middle\">\n <vdr-entity-info [entity]=\"value\"></vdr-entity-info>\n </td>\n <td class=\"align-middle\">\n <input\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n (input)=\"updateValueCode(value.code, $event.target.value, value.id)\"\n />\n </td>\n <td class=\"align-middle\">\n <input type=\"text\" formControlName=\"code\" />\n </td>\n <td class=\"\" *ngIf=\"customValueFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"FacetValue\"\n [customFields]=\"customValueFields\"\n [compact]=\"true\"\n [customFieldsFormGroup]=\"\n detailForm.get(['values', value.id, 'customFields'])\n \"\n [readonly]=\"!(updatePermission | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </td>\n <td class=\"align-middle\">\n <vdr-dropdown>\n <button type=\"button\" class=\"icon-button\" vdrDropdownTrigger>\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\n <button\n type=\"button\"\n class=\"delete-button\"\n (click)=\"deleteFacetValue(value.id)\"\n [disabled]=\"!(updatePermission | hasPermission)\"\n vdrDropdownItem\n >\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\n {{ 'common.delete' | translate }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"pagination-wrapper\">\n <vdr-items-per-page-controls\n [itemsPerPage]=\"itemsPerPage\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n ></vdr-items-per-page-controls>\n <vdr-pagination-controls\n [currentPage]=\"currentPage\"\n [itemsPerPage]=\"itemsPerPage\"\n [totalItems]=\"totalItems\"\n (pageChange)=\"setCurrentPage($event)\"\n ></vdr-pagination-controls>\n </div>\n </ng-container>\n <div>\n <button\n type=\"button\"\n class=\"button m-3\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\n (click)=\"addFacetValue()\"\n >\n <clr-icon shape=\"add\"></clr-icon>\n {{ 'catalog.add-facet-value' | translate }}\n </button>\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkAssignToChannelAction,\n createBulkDeleteAction,\n createBulkRemoveFromChannelAction,\n currentChannelIsNotDefault,\n DataService,\n DuplicateEntityDialogComponent,\n getChannelCodeFromUserStatus,\n GetFacetListQuery,\n ItemOf,\n ModalService,\n NotificationService,\n Permission,\n RemoveFacetsFromChannelMutation,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport { FacetListComponent } from './facet-list.component';\n\nexport const deleteFacetsBulkAction = createBulkDeleteAction<ItemOf<GetFacetListQuery, 'facets'>>({\n location: 'facet-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteFacet) ||\n userPermissions.includes(Permission.DeleteCatalog),\n getItemName: item => item.name,\n shouldRetryItem: (response, item) => !!response.message,\n bulkDelete: (dataService, ids, retrying) =>\n dataService.facet.deleteFacets(ids, retrying).pipe(map(res => res.deleteFacets)),\n});\n\nexport const assignFacetsToChannelBulkAction = createBulkAssignToChannelAction<\n ItemOf<GetFacetListQuery, 'facets'>\n>({\n location: 'facet-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateFacet),\n getItemName: item => item.name,\n bulkAssignToChannel: (dataService, facetIds, channelIds) =>\n channelIds.map(channelId =>\n dataService.facet\n .assignFacetsToChannel({\n facetIds,\n channelId,\n })\n .pipe(map(res => res.assignFacetsToChannel)),\n ),\n});\n\nexport const removeFacetsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetFacetListQuery, 'facets'>,\n RemoveFacetsFromChannelMutation['removeFacetsFromChannel'][number]\n>({\n location: 'facet-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteCatalog) ||\n userPermissions.includes(Permission.DeleteFacet),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, facetIds, channelId, retrying) =>\n dataService.facet\n .removeFacetsFromChannel({\n channelId: channelId,\n facetIds,\n force: retrying,\n })\n .pipe(map(res => res.removeFacetsFromChannel)),\n isErrorResult: result => (result.__typename === 'FacetInUseError' ? result.message : undefined),\n});\n\nexport const removeFacetsFromChannelBulkAction2: BulkAction<\n ItemOf<GetFacetListQuery, 'facets'>,\n FacetListComponent\n> = {\n location: 'facet-list',\n label: _('catalog.remove-from-channel'),\n getTranslationVars: ({ injector }) => getChannelCodeFromUserStatus(injector.get(DataService)),\n icon: 'layers',\n iconClass: 'is-warning',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateFacet) ||\n userPermissions.includes(Permission.UpdateCatalog),\n isVisible: ({ injector }) => currentChannelIsNotDefault(injector.get(DataService)),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n\n const activeChannelId$ = dataService.client\n .userStatus()\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\n\n function showModalAndDelete(facetIds: string[], message?: string) {\n return modalService\n .dialog({\n title: _('catalog.remove-from-channel'),\n translationVars: {\n count: selection.length,\n },\n size: message ? 'lg' : 'md',\n body: message,\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n {\n type: 'danger',\n label: message ? _('common.force-remove') : _('common.remove'),\n returnValue: true,\n },\n ],\n })\n .pipe(\n switchMap(res =>\n res\n ? activeChannelId$.pipe(\n switchMap(activeChannelId =>\n activeChannelId\n ? dataService.facet.removeFacetsFromChannel({\n channelId: activeChannelId,\n facetIds,\n force: !!message,\n })\n : EMPTY,\n ),\n map(res2 => res2.removeFacetsFromChannel),\n )\n : EMPTY,\n ),\n );\n }\n\n showModalAndDelete(unique(selection.map(f => f.id)))\n .pipe(\n switchMap(result => {\n let removedCount = selection.length;\n const errors: string[] = [];\n const errorIds: string[] = [];\n let i = 0;\n for (const item of result) {\n if (item.__typename === 'FacetInUseError') {\n errors.push(item.message);\n errorIds.push(selection[i]?.id);\n removedCount--;\n }\n i++;\n }\n if (0 < errorIds.length) {\n return showModalAndDelete(errorIds, errors.join('\\n')).pipe(\n map(result2 => {\n const notRemovedCount = result2.filter(\n r => r.__typename === 'FacetInUseError',\n ).length;\n return selection.length - notRemovedCount;\n }),\n );\n } else {\n return of(removedCount);\n }\n }),\n switchMap(removedCount =>\n removedCount\n ? getChannelCodeFromUserStatus(dataService).then(({ channelCode }) => ({\n channelCode,\n removedCount,\n }))\n : EMPTY,\n ),\n )\n .subscribe(({ removedCount, channelCode }) => {\n if (removedCount) {\n hostComponent.refresh();\n clearSelection();\n notificationService.success(_('catalog.notify-remove-facets-from-channel-success'), {\n count: removedCount,\n channelCode,\n });\n }\n });\n },\n};\n\nexport const duplicateFacetsBulkAction: BulkAction<\n ItemOf<GetFacetListQuery, 'facets'>,\n FacetListComponent\n> = {\n location: 'facet-list',\n label: _('common.duplicate'),\n icon: 'copy',\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(DuplicateEntityDialogComponent<ItemOf<GetFacetListQuery, 'facets'>>, {\n locals: {\n entities: selection,\n entityName: 'Facet',\n title: _('catalog.duplicate-facets'),\n getEntityName: entity => entity.name,\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n hostComponent.refresh();\n }\n });\n },\n};\n", "import { Component, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n FACET_WITH_VALUE_LIST_FRAGMENT,\n GetFacetListDocument,\n GetFacetListQuery,\n ItemOf,\n LanguageCode,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nexport const FACET_LIST_QUERY = gql`\n query GetFacetList($options: FacetListOptions, $facetValueListOptions: FacetValueListOptions) {\n facets(options: $options) {\n items {\n ...FacetWithValueList\n }\n totalItems\n }\n }\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-facet-list',\n templateUrl: './facet-list.component.html',\n styleUrls: ['./facet-list.component.scss'],\n standalone: false\n})\nexport class FacetListComponent\n extends TypedBaseListComponent<typeof GetFacetListDocument, 'facets'>\n implements OnInit\n{\n readonly initialLimit = 3;\n displayLimit: { [id: string]: number } = {};\n\n dataTableListId = 'facet-list';\n readonly customFields = this.getCustomFieldConfig('Facet');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilter({\n name: 'visibility',\n type: { kind: 'boolean' },\n label: _('common.visibility'),\n toFilterInput: value => ({\n isPrivate: { eq: !value },\n }),\n })\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n\n readonly sorts = this.createSortCollection()\n .defaultSort('createdAt', 'DESC')\n .addSort({ name: 'id' })\n .addSort({ name: 'createdAt' })\n .addSort({ name: 'updatedAt' })\n .addSort({ name: 'name' })\n .addSort({ name: 'code' })\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor(protected dataService: DataService) {\n super();\n super.configure({\n document: GetFacetListDocument,\n getItems: data => data.facets,\n setVariables: (skip, take) => ({\n options: {\n skip,\n take,\n filter: {\n name: {\n contains: this.searchTermControl.value,\n },\n ...this.filters.createFilterInput(),\n },\n sort: this.sorts.createSortInput(),\n },\n facetValueListOptions: {\n take: 100,\n },\n }),\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\n });\n }\n\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\n if (this.displayLimit[facet.id] === facet.valueList.items.length) {\n this.displayLimit[facet.id] = this.initialLimit;\n } else {\n this.displayLimit[facet.id] = facet.valueList.items.length;\n }\n }\n\n setLanguage(code: LanguageCode) {\n this.dataService.client.setContentLanguage(code).subscribe();\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"facet-list\" />\n <a\n class=\"btn btn-primary\"\n [routerLink]=\"['./create']\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-facet' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"facet-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-data-table-2\n class=\"mt-2\"\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"facet-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n ></vdr-bulk-action-menu>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\n ></vdr-dt2-search>\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\n <ng-template let-facet=\"item\">\n {{ facet.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-facet=\"item\">\n {{ facet.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-facet=\"item\">\n {{ facet.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\n <ng-template let-facet=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', facet.id]\"\n ><span>{{ facet.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\">\n <ng-template let-facet=\"item\">\n {{ facet.code }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\n <ng-template let-facet=\"item\">\n <vdr-chip *ngIf=\"facet.isPrivate\" colorType=\"warning\">{{\n 'common.private' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!facet.isPrivate\" colorType=\"success\">{{\n 'common.public' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.values' | translate\" id=\"values\">\n <ng-template let-facet=\"item\">\n <div class=\"facet-values-list\">\n <vdr-facet-value-chip\n *ngFor=\"let value of facet.valueList.items | slice : 0 : displayLimit[facet.id] || 3\"\n [facetValue]=\"value\"\n [removable]=\"false\"\n [displayFacetName]=\"false\"\n ></vdr-facet-value-chip>\n <vdr-chip *ngIf=\"displayLimit[facet.id] < facet.valueList.totalItems && (displayLimit[facet.id] || 0) === facet.valueList.items.length\">\n ... + {{ facet.valueList.totalItems - facet.valueList.items.length }}\n </vdr-chip>\n <button\n class=\"button-small\"\n *ngIf=\"facet.valueList.items.length > initialLimit\"\n (click)=\"toggleDisplayLimit(facet)\"\n >\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.valueList.items.length; else collapse\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ facet.valueList.totalItems - initialLimit }}\n </ng-container>\n <ng-template #collapse>\n <clr-icon shape=\"minus\"></clr-icon>\n </ng-template>\n </button>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column *ngFor=\"let customField of customFields\" [customField]=\"customField\" [sorts]=\"sorts\" />\n</vdr-data-table-2>\n", "import { Component, ElementRef, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\nimport { AbstractControl, FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport {\n CurrencyCode,\n DataService,\n GetStockLocationListDocument,\n GetStockLocationListQuery,\n ItemOf,\n} from '@vendure/admin-ui/core';\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { OptionValueInputComponent } from '../option-value-input/option-value-input.component';\n\nconst DEFAULT_VARIANT_CODE = '__DEFAULT_VARIANT__';\nexport type CreateVariantValues = {\n optionValues: string[];\n enabled: boolean;\n sku: string;\n price: number;\n stock: number;\n};\nexport type CreateProductVariantsConfig = {\n groups: Array<{ name: string; values: string[] }>;\n variants: CreateVariantValues[];\n stockLocationId: string;\n};\n\n@Component({\n selector: 'vdr-generate-product-variants',\n templateUrl: './generate-product-variants.component.html',\n styleUrls: ['./generate-product-variants.component.scss'],\n standalone: false\n})\nexport class GenerateProductVariantsComponent implements OnInit {\n @Output() variantsChange = new EventEmitter<CreateProductVariantsConfig>();\n @ViewChildren('optionGroupName', { read: ElementRef }) groupNameInputs: QueryList<ElementRef>;\n optionGroups: Array<{ name: string; values: Array<{ name: string; locked: boolean }> }> = [];\n currencyCode: CurrencyCode;\n variants: Array<{ id: string; values: string[] }>;\n variantFormValues: {\n [id: string]: FormGroup<{\n optionValues: FormControl<string[]>;\n enabled: FormControl<boolean>;\n price: FormControl<number>;\n sku: FormControl<string>;\n stock: FormControl<number>;\n }>;\n } = {};\n stockLocations$: Observable<Array<ItemOf<GetStockLocationListQuery, 'stockLocations'>>>;\n selectedStockLocationId: string | null = null;\n constructor(\n private dataService: DataService,\n private formBuilder: FormBuilder,\n ) {}\n\n ngOnInit() {\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\n });\n this.stockLocations$ = this.dataService\n .query(GetStockLocationListDocument, {\n options: {\n take: 999,\n },\n })\n .refetchOnChannelChange()\n .mapStream(({ stockLocations }) => stockLocations.items)\n .pipe(\n tap(items => {\n if (items.length) {\n this.selectedStockLocationId = items[0].id;\n this.onFormChange();\n }\n }),\n );\n\n this.generateVariants();\n }\n\n addOption() {\n this.optionGroups.push({ name: '', values: [] });\n const index = this.optionGroups.length - 1;\n setTimeout(() => {\n const input = this.groupNameInputs.get(index)?.nativeElement;\n input?.focus();\n });\n }\n\n removeOption(name: string) {\n this.optionGroups = this.optionGroups.filter(g => g.name !== name);\n this.generateVariants();\n }\n\n generateVariants() {\n const totalValuesCount = this.optionGroups.reduce((sum, group) => sum + group.values.length, 0);\n const groups = totalValuesCount\n ? this.optionGroups.map(g => g.values.map(v => v.name))\n : [[DEFAULT_VARIANT_CODE]];\n this.variants = generateAllCombinations(groups).map(values => ({ id: values.join('|'), values }));\n\n this.variants.forEach((variant, index) => {\n if (!this.variantFormValues[variant.id]) {\n const formGroup = this.formBuilder.nonNullable.group({\n optionValues: [variant.values],\n enabled: true as boolean,\n price: this.copyFromDefault(variant.id, 'price', 0),\n sku: this.copyFromDefault(variant.id, 'sku', ''),\n stock: this.copyFromDefault(variant.id, 'stock', 0),\n });\n formGroup.valueChanges.subscribe(() => this.onFormChange());\n if (index === 0) {\n formGroup.get('price')?.valueChanges.subscribe(value => {\n this.copyValuesToPristine('price', formGroup.get('price'));\n });\n formGroup.get('sku')?.valueChanges.subscribe(value => {\n this.copyValuesToPristine('sku', formGroup.get('sku'));\n });\n formGroup.get('stock')?.valueChanges.subscribe(value => {\n this.copyValuesToPristine('stock', formGroup.get('stock'));\n });\n }\n this.variantFormValues[variant.id] = formGroup;\n }\n });\n this.onFormChange();\n }\n\n trackByFn(index: number, variant: { name: string; values: string[] }) {\n return variant.values.join('|');\n }\n\n handleEnter(event: KeyboardEvent, optionValueInputComponent: OptionValueInputComponent) {\n event.preventDefault();\n event.stopPropagation();\n optionValueInputComponent.focus();\n }\n\n copyValuesToPristine(field: 'price' | 'sku' | 'stock', formControl: AbstractControl | null) {\n if (!formControl) {\n return;\n }\n Object.values(this.variantFormValues).forEach(formGroup => {\n const correspondingFormControl = formGroup.get(field) as FormControl;\n if (correspondingFormControl && correspondingFormControl.pristine) {\n correspondingFormControl.setValue(formControl.value, { emitEvent: false });\n }\n });\n }\n\n onFormChange() {\n const variantsToCreate = this.variants\n .map(v => this.variantFormValues[v.id].value as CreateVariantValues)\n .filter(v => v.enabled);\n this.variantsChange.emit({\n groups: this.optionGroups.map(og => ({ name: og.name, values: og.values.map(v => v.name) })),\n variants: variantsToCreate,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n stockLocationId: this.selectedStockLocationId!,\n });\n }\n\n private copyFromDefault<T extends keyof CreateVariantValues>(\n variantId: string,\n prop: T,\n value: CreateVariantValues[T],\n ): CreateVariantValues[T] {\n return variantId !== DEFAULT_VARIANT_CODE\n ? (this.variantFormValues[DEFAULT_VARIANT_CODE].get(prop)?.value as CreateVariantValues[T])\n : value;\n }\n}\n", "<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\n <div class=\"name\">\n <label>{{ 'catalog.option' | translate }}</label>\n <input\n #optionGroupName\n placeholder=\"e.g. Size\"\n clrInput\n [(ngModel)]=\"group.name\"\n name=\"name\"\n required\n (keydown.enter)=\"handleEnter($event, optionValueInputComponent)\"\n />\n </div>\n <div class=\"values\">\n <label>{{ 'catalog.option-values' | translate }}</label>\n <vdr-option-value-input\n #optionValueInputComponent\n [(ngModel)]=\"group.values\"\n (ngModelChange)=\"generateVariants()\"\n (edit)=\"generateVariants()\"\n [groupName]=\"group.name\"\n [disabled]=\"group.name === ''\"\n ></vdr-option-value-input>\n </div>\n <div class=\"remove-group\">\n <button\n class=\"button-small mt-2\"\n [title]=\"'catalog.remove-option' | translate\"\n (click)=\"removeOption(group.name)\"\n >\n <clr-icon shape=\"trash\"></clr-icon>\n </button>\n </div>\n</div>\n<button class=\"button mb-2\" (click)=\"addOption()\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-option' | translate }}\n</button>\n\n<ng-container *ngIf=\"stockLocations$ | async as stockLocations\">\n <clr-alert *ngIf=\"stockLocations.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ 'catalog.no-stock-locations-available-on-current-channel' | translate }}\n </span>\n </clr-alert-item>\n </clr-alert>\n\n <div class=\"form-grid mb-2\">\n <vdr-form-field *ngIf=\"stockLocations.length\" [label]=\"'catalog.add-stock-to-location' | translate\">\n <select [(ngModel)]=\"selectedStockLocationId\">\n <option *ngFor=\"let location of stockLocations\" [value]=\"location.id\">\n {{ location.name }}\n </option>\n </select>\n </vdr-form-field>\n </div>\n\n <div class=\"variants-preview\" *ngIf=\"0 < stockLocations.length\">\n <table class=\"table\">\n <thead>\n <tr>\n <th *ngIf=\"1 < variants.length\">{{ 'common.create' | translate }}</th>\n <th *ngIf=\"1 < variants.length\">{{ 'catalog.variant' | translate }}</th>\n <th>{{ 'catalog.sku' | translate }}</th>\n <th>{{ 'catalog.price' | translate }}</th>\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\n </tr>\n </thead>\n <tr\n *ngFor=\"let variant of variants; trackBy: trackByFn\"\n [class.disabled]=\"!variantFormValues[variant.id].value.enabled === false\"\n [formGroup]=\"variantFormValues[variant.id]\"\n >\n <td *ngIf=\"1 < variants.length\">\n <input type=\"checkbox\" formControlName=\"enabled\" clrCheckbox />\n </td>\n <td *ngIf=\"1 < variants.length\">\n {{ variant.values.join(' ') }}\n </td>\n <td>\n <vdr-form-field>\n <input type=\"text\" formControlName=\"sku\" [placeholder]=\"'catalog.sku' | translate\" />\n </vdr-form-field>\n </td>\n <td>\n <vdr-form-field>\n <vdr-currency-input\n formControlName=\"price\"\n [currencyCode]=\"currencyCode\"\n ></vdr-currency-input>\n </vdr-form-field>\n </td>\n <td>\n <vdr-form-field>\n <input type=\"number\" formControlName=\"stock\" min=\"0\" step=\"1\" />\n </vdr-form-field>\n </td>\n </tr>\n </table>\n </div>\n</ng-container>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n CreateProductInput,\n createUpdatedTranslatable,\n DataService,\n findTranslation,\n getChannelCodeFromUserStatus,\n getCustomFieldsDefaults,\n GetProductDetailDocument,\n GetProductDetailQuery,\n GetProductWithVariantsQuery,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n PRODUCT_DETAIL_FRAGMENT,\n ProductDetailFragment,\n ProductVariantFragment,\n TypedBaseDetailComponent,\n unicodePatternValidator,\n UpdateProductInput,\n UpdateProductMutation,\n UpdateProductVariantInput,\n UpdateProductVariantsMutation,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\nimport { unique } from '@vendure/common/lib/unique';\nimport { gql } from 'apollo-angular';\nimport { combineLatest, concat, EMPTY, from, Observable, of } from 'rxjs';\nimport { distinctUntilChanged, map, mergeMap, shareReplay, switchMap, take } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { CreateProductVariantsConfig } from '../generate-product-variants/generate-product-variants.component';\n\ninterface SelectedAssets {\n assets?: Asset[];\n featuredAsset?: Asset;\n}\n\nexport const GET_PRODUCT_DETAIL = gql`\n query GetProductDetail($id: ID!) {\n product(id: $id) {\n ...ProductDetail\n }\n }\n ${PRODUCT_DETAIL_FRAGMENT}\n`;\n\n@Component({\n selector: 'vdr-product-detail2',\n templateUrl: './product-detail.component.html',\n styleUrls: ['./product-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class ProductDetailComponent\n extends TypedBaseDetailComponent<typeof GetProductDetailDocument, 'product'>\n implements OnInit, OnDestroy\n{\n readonly customFields = this.getCustomFieldConfig('Product');\n detailForm = this.formBuilder.group({\n enabled: true,\n name: ['', Validators.required],\n autoUpdateVariantNames: true,\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9._-]+$/u)],\n description: '',\n facetValueIds: [[] as string[]],\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n assetChanges: SelectedAssets = {};\n productChannels$: Observable<ProductDetailFragment['channels']>;\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [], stockLocationId: '' };\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n private productDetailService: ProductDetailService,\n private formBuilder: FormBuilder,\n private modalService: ModalService,\n private notificationService: NotificationService,\n protected dataService: DataService,\n private changeDetector: ChangeDetectorRef,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n\n const productFacetValues$ = this.isNew$.pipe(\n switchMap(isNew => {\n return isNew ? of([]) : this.entity$.pipe(map(product => product.facetValues));\n }),\n );\n const productGroup = this.detailForm;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const formFacetValueIdChanges$ = productGroup.get('facetValueIds')!.valueChanges.pipe(\n distinctUntilChanged(),\n switchMap(ids =>\n this.dataService.facet\n .getFacetValues({ filter: { id: { in: ids } } })\n .mapSingle(({ facetValues }) => facetValues.items),\n ),\n shareReplay(1),\n );\n this.facetValues$ = concat(\n productFacetValues$.pipe(take(1)),\n productFacetValues$.pipe(switchMap(() => formFacetValueIdChanges$)),\n );\n this.productChannels$ = this.entity$.pipe(map(p => p.channels));\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n isDefaultChannel(channelCode: string): boolean {\n return channelCode === DEFAULT_CHANNEL_CODE;\n }\n\n assignToChannel() {\n this.productChannels$\n .pipe(\n take(1),\n switchMap(channels =>\n this.modalService.fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productIds: [this.id],\n currentChannelIds: channels.map(c => c.id),\n },\n }),\n ),\n )\n .subscribe();\n }\n\n removeFromChannel(channelId: string) {\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\n .pipe(\n switchMap(({ channelCode }) =>\n this.modalService.dialog({\n title: _('catalog.remove-product-from-channel'),\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n {\n type: 'danger',\n label: _('catalog.remove-from-channel'),\n translationVars: { channelCode },\n returnValue: true,\n },\n ],\n }),\n ),\n switchMap(response =>\n response\n ? this.dataService.product.removeProductsFromChannel({\n channelId,\n productIds: [this.id],\n })\n : EMPTY,\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('catalog.notify-remove-product-from-channel-success'));\n },\n err => {\n this.notificationService.error(_('catalog.notify-remove-product-from-channel-error'));\n },\n );\n }\n\n assignVariantToChannel(variant: ProductVariantFragment) {\n return this.modalService\n .fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productIds: [this.id],\n productVariantIds: [variant.id],\n currentChannelIds: variant.channels.map(c => c.id),\n },\n })\n .subscribe();\n }\n\n removeVariantFromChannel({ channelId, variant }: { channelId: string; variant: ProductVariantFragment }) {\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\n .pipe(\n switchMap(({ channelCode }) =>\n this.modalService.dialog({\n title: _('catalog.remove-product-variant-from-channel'),\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n {\n type: 'danger',\n label: _('catalog.remove-from-channel'),\n translationVars: { channelCode },\n returnValue: true,\n },\n ],\n }),\n ),\n switchMap(response =>\n response\n ? this.dataService.product.removeVariantsFromChannel({\n channelId,\n productVariantIds: [variant.id],\n })\n : EMPTY,\n ),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('catalog.notify-remove-variant-from-channel-success'));\n },\n err => {\n this.notificationService.error(_('catalog.notify-remove-variant-from-channel-error'));\n },\n );\n }\n\n assetsChanged(): boolean {\n return !!Object.values(this.assetChanges).length;\n }\n\n /**\n * If creating a new product, automatically generate the slug based on the product name.\n */\n updateSlug(nameValue: string) {\n const slugControl = this.detailForm.get('slug');\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\n }\n }\n\n selectProductFacetValue() {\n this.displayFacetValueModal().subscribe(facetValueIds => {\n if (facetValueIds) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(unique([...currentFacetValueIds, ...facetValueIds]));\n facetValueIdsControl.markAsDirty();\n }\n });\n }\n\n removeProductFacetValue(facetValueId: string) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(currentFacetValueIds.filter(id => id !== facetValueId));\n facetValueIdsControl.markAsDirty();\n }\n\n private displayFacetValueModal(): Observable<string[] | undefined> {\n return this.modalService\n .fromComponent(ApplyFacetDialogComponent, {\n size: 'md',\n closable: true,\n })\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\n }\n\n create() {\n const productGroup = this.detailForm;\n if (!productGroup.dirty) {\n return;\n }\n\n const newProduct = this.getUpdatedProduct(\n {\n id: '',\n createdAt: '',\n updatedAt: '',\n enabled: true,\n languageCode: this.languageCode,\n name: '',\n slug: '',\n featuredAsset: null,\n assets: [],\n description: '',\n translations: [],\n optionGroups: [],\n facetValues: [],\n channels: [],\n },\n productGroup as UntypedFormGroup,\n this.languageCode,\n ) as CreateProductInput;\n this.productDetailService\n .createProductWithVariants(newProduct, this.createVariantsConfig, this.languageCode)\n .subscribe(\n ({ createProductVariants, productId }) => {\n this.notificationService.success(_('common.notify-create-success'), {\n entity: 'Product',\n });\n this.assetChanges = {};\n this.detailForm.markAsPristine();\n this.router.navigate(['../', productId], { relativeTo: this.route });\n },\n err => {\n // eslint-disable-next-line no-console\n console.error(err);\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Product',\n });\n },\n );\n }\n\n save() {\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([product, languageCode]) => {\n const productGroup = this.detailForm;\n let productInput: UpdateProductInput | undefined;\n let variantsInput: UpdateProductVariantInput[] | undefined;\n\n if (productGroup.dirty || this.assetsChanged()) {\n productInput = this.getUpdatedProduct(\n product,\n productGroup as UntypedFormGroup,\n languageCode,\n ) as UpdateProductInput;\n }\n\n return this.productDetailService.updateProduct({\n product,\n languageCode,\n autoUpdate: this.detailForm.get(['autoUpdateVariantNames'])?.value ?? false,\n productInput,\n variantsInput,\n });\n }),\n )\n .subscribe(\n result => {\n this.updateSlugAfterSave(result);\n this.detailForm.markAsPristine();\n this.assetChanges = {};\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'Product',\n });\n this.changeDetector.markForCheck();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Product',\n });\n },\n );\n }\n\n canDeactivate(): boolean {\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\n }\n\n /**\n * Sets the values of the form on changes to the product or current language.\n */\n protected setFormValues(\n product: NonNullable<GetProductWithVariantsQuery['product']>,\n languageCode: LanguageCode,\n ) {\n const currentTranslation = findTranslation(product, languageCode);\n this.detailForm.patchValue({\n enabled: product.enabled,\n name: currentTranslation ? currentTranslation.name : '',\n slug: currentTranslation ? currentTranslation.slug : '',\n description: currentTranslation ? currentTranslation.description : '',\n facetValueIds: product.facetValues.map(fv => fv.id),\n });\n\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get(['customFields']),\n product,\n currentTranslation,\n );\n }\n }\n\n /**\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\n * can then be persisted to the API.\n */\n private getUpdatedProduct(\n product: NonNullable<GetProductDetailQuery['product']>,\n productFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductInput | CreateProductInput {\n const updatedProduct = createUpdatedTranslatable({\n translatable: product,\n updatedFields: productFormGroup.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: product.name || '',\n slug: product.slug || '',\n description: product.description || '',\n },\n });\n return {\n ...updatedProduct,\n assetIds: this.assetChanges.assets?.map(a => a.id),\n featuredAssetId: this.assetChanges.featuredAsset?.id,\n facetValueIds: productFormGroup.controls.facetValueIds.dirty\n ? productFormGroup.value.facetValueIds\n : undefined,\n } as UpdateProductInput | CreateProductInput;\n }\n\n /**\n * The server may alter the slug value in order to normalize and ensure uniqueness upon saving.\n */\n private updateSlugAfterSave(results: Array<UpdateProductMutation | UpdateProductVariantsMutation>) {\n const firstResult = results[0];\n const slugControl = this.detailForm.get(['product', 'slug']);\n\n function isUpdateMutation(input: any): input is UpdateProductMutation {\n return input.hasOwnProperty('updateProduct');\n }\n\n if (slugControl && isUpdateMutation(firstResult)) {\n slugControl.setValue(firstResult.updateProduct.slug, { emitEvent: false });\n }\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <div class=\"flex clr-flex-row\"></div>\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"product-detail\"></vdr-action-bar-items>\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"detailForm.invalid || detailForm.pristine || createVariantsConfig.variants.length === 0\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n *vdrIfPermissions=\"updatePermissions\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"product-detail\"></vdr-action-bar-dropdown-menu>\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermissions\">\n <input\n type=\"checkbox\"\n clrToggle\n name=\"enabled\"\n [formControl]=\"detailForm.get(['enabled'])\"\n />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <ng-container *ngIf=\"!(isNew$ | async)\">\n <vdr-card *vdrIfMultichannel [title]=\"'common.channels' | translate\">\n <vdr-form-item *vdrIfDefaultChannelActive>\n <div class=\"flex channel-assignment\">\n <div class=\"mb-2\">\n <ng-container *ngFor=\"let channel of productChannels$ | async\">\n <vdr-chip\n *ngIf=\"!isDefaultChannel(channel.code)\"\n icon=\"times-circle\"\n (iconClick)=\"removeFromChannel(channel.id)\"\n >\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\n {{ channel.code | channelCodeToLabel }}\n </vdr-chip>\n </ng-container>\n </div>\n <button class=\"button-small\" (click)=\"assignToChannel()\">\n <clr-icon shape=\"layers\"></clr-icon>\n {{ 'common.assign-to-channel' | translate }}\n </button>\n </div>\n </vdr-form-item>\n </vdr-card>\n </ng-container>\n <vdr-card *ngIf=\"entity?.optionGroups.length\" [title]=\"'catalog.product-options' | translate\">\n <div class=\"options\">\n <vdr-chip\n *ngFor=\"let optionGroup of entity?.optionGroups | sort : 'id'\"\n [colorFrom]=\"optionGroup.code\"\n [invert]=\"true\"\n >\n {{ optionGroup.name }}\n </vdr-chip>\n </div>\n <div>\n <a [routerLink]=\"['options']\" class=\"button-small mt-2\" *vdrIfPermissions=\"updatePermissions\">\n <clr-icon shape=\"pencil\"></clr-icon>\n {{ 'catalog.edit-options' | translate }}\n </a>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'catalog.facets' | translate\">\n <div class=\"facets\">\n <vdr-facet-value-chip\n *ngFor=\"let facetValue of facetValues$ | async\"\n [facetValue]=\"facetValue\"\n [removable]=\"updatePermissions | hasPermission\"\n (remove)=\"removeProductFacetValue(facetValue.id)\"\n ></vdr-facet-value-chip>\n </div>\n <div>\n <button\n class=\"button-small mt-2\"\n *vdrIfPermissions=\"updatePermissions\"\n (click)=\"selectProductFacetValue()\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-facets' | translate }}\n </button>\n </div>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\n </vdr-card>\n </vdr-page-detail-sidebar>\n\n <vdr-page-block>\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\n <vdr-card>\n <div class=\"form-grid\">\n <div>\n <vdr-form-field [label]=\"'catalog.product-name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n (input)=\"updateSlug($event.target.value)\"\n />\n </vdr-form-field>\n <div *ngIf=\"(isNew$ | async) === false && detailForm.get(['name'])?.dirty\">\n <clr-checkbox-wrapper>\n <input\n clrCheckbox\n type=\"checkbox\"\n id=\"auto-update\"\n formControlName=\"autoUpdateVariantNames\"\n />\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\n </clr-checkbox-wrapper>\n </div>\n </div>\n <vdr-form-field\n [label]=\"'catalog.slug' | translate\"\n for=\"slug\"\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\n >\n <input\n id=\"slug\"\n type=\"text\"\n formControlName=\"slug\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field\n class=\"form-grid-span\"\n [label]=\"'common.description' | translate\"\n for=\"slug\"\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\n >\n <vdr-rich-text-editor\n formControlName=\"description\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n ></vdr-rich-text-editor>\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"Product\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n <vdr-custom-detail-component-host\n locationId=\"product-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n <vdr-card [title]=\"'catalog.assets' | translate\">\n <vdr-assets\n [assets]=\"assetChanges.assets || entity?.assets\"\n [featuredAsset]=\"assetChanges.featuredAsset || entity?.featuredAsset\"\n [updatePermissions]=\"updatePermissions\"\n (change)=\"assetChanges = $event\"\n ></vdr-assets>\n </vdr-card>\n\n <vdr-card [title]=\"'catalog.product-variants' | translate\" [paddingX]=\"isNew$ | async\">\n <div *ngIf=\"isNew$ | async; else variantList\">\n <vdr-generate-product-variants\n (variantsChange)=\"createVariantsConfig = $event\"\n ></vdr-generate-product-variants>\n </div>\n <ng-template #variantList>\n <vdr-product-variant-list\n [productId]=\"this.id\"\n dataTableId=\"product-detail-variants-list\"\n [hideLanguageSelect]=\"true\"\n ></vdr-product-variant-list>\n </ng-template>\n <div class=\"mx-3\" *ngIf=\"(isNew$ | async) === false\">\n <a class=\"button\" [routerLink]=\"['manage-variants']\">\n <clr-icon shape=\"add-text\"></clr-icon>\n {{ 'catalog.manage-variants' | translate }}</a\n >\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { Component, Input, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataTableLocationId,\n ProductVariantFilterParameter,\n ProductVariantListQueryDocument,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-product-variant-list',\n templateUrl: './product-variant-list.component.html',\n styleUrls: ['./product-variant-list.component.scss'],\n standalone: false,\n})\nexport class ProductVariantListComponent\n extends TypedBaseListComponent<typeof ProductVariantListQueryDocument, 'productVariants'>\n implements OnInit\n{\n @Input() productId?: string;\n @Input() hideLanguageSelect = false;\n pageLocationId = 'product-variant-list' as const;\n @Input() dataTableId: DataTableLocationId | undefined;\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilters([\n {\n name: 'name',\n type: { kind: 'text' },\n label: _('common.name'),\n filterField: 'name',\n },\n {\n name: 'enabled',\n type: { kind: 'boolean' },\n label: _('common.enabled'),\n filterField: 'enabled',\n },\n {\n name: 'sku',\n type: { kind: 'text' },\n label: _('catalog.sku'),\n filterField: 'sku',\n },\n {\n name: 'price',\n type: { kind: 'number', inputType: 'currency' },\n label: _('common.price'),\n filterField: 'price',\n },\n {\n name: 'priceWithTax',\n type: { kind: 'number', inputType: 'currency' },\n label: _('common.price-with-tax'),\n filterField: 'priceWithTax',\n },\n ])\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n\n readonly sorts = this.createSortCollection()\n .addSorts([\n { name: 'id' },\n { name: 'createdAt' },\n { name: 'updatedAt' },\n { name: 'name' },\n { name: 'sku' },\n { name: 'price' },\n { name: 'priceWithTax' },\n ])\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor() {\n super();\n this.configure({\n document: ProductVariantListQueryDocument,\n getItems: data => data.productVariants,\n setVariables: (skip, take) => {\n const searchTerm = this.searchTermControl.value;\n const filterParam: ProductVariantFilterParameter = { _and: [] };\n const filterInput = this.filters.createFilterInput();\n if (Object.keys(filterInput).length) {\n filterParam._and?.push(filterInput);\n }\n if (searchTerm) {\n filterParam._and?.push({\n _or: [\n {\n name: { contains: searchTerm },\n },\n {\n sku: { contains: searchTerm },\n },\n ],\n });\n }\n if (this.productId) {\n filterParam._and?.push({\n productId: {\n eq: this.productId,\n },\n });\n }\n return {\n options: {\n skip,\n take,\n filter: filterParam,\n sort: this.sorts.createSortInput(),\n },\n };\n },\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\n });\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector *ngIf=\"!hideLanguageSelect\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items [locationId]=\"pageLocationId\" />\n <vdr-action-bar-dropdown-menu [locationId]=\"pageLocationId\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-data-table-2\n class=\"mt-2\"\n [id]=\"dataTableId || 'product-variant-list'\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"product-variant-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n />\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'settings.search-by-product-name-or-sku' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\n <ng-template let-variant=\"item\">\n {{ variant.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-variant=\"item\">\n {{ variant.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-variant=\"item\">\n {{ variant.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\n <ng-template let-variant=\"item\">\n <div class=\"image-placeholder\">\n <img\n *ngIf=\"variant.featuredAsset as asset; else imagePlaceholder\"\n [src]=\"asset | assetPreview : 'tiny'\"\n />\n <ng-template #imagePlaceholder>\n <div class=\"placeholder\">\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\n <ng-template let-variant=\"item\">\n <a\n class=\"button-ghost\"\n [routerLink]=\"['/catalog/products', variant.productId, 'variants', variant.id]\"\n ><span>{{ variant.name }}</span\n >\n <clr-icon shape=\"arrow right\"\n />\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [sort]=\"sorts.get('sku')\">\n <ng-template let-variant=\"item\">\n {{ variant.sku }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-variant=\"item\">\n <vdr-chip *ngIf=\"variant.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}\n </vdr-chip>\n <vdr-chip *ngIf=\"!variant.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}\n </vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.price' | translate\" id=\"price\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('price')\"\n >\n <ng-template let-variant=\"item\">\n {{ variant.price | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\"\n [sort]=\"sorts.get('priceWithTax')\">\n <ng-template let-variant=\"item\">\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\n </ng-template>\n </vdr-dt2-column>\n\n <vdr-dt2-column [heading]=\"'catalog.stock-on-hand' | translate\" id=\"stock-on-hand\" [hiddenByDefault]=\"false\">\n <ng-template let-variant=\"item\">\n <vdr-chip *ngFor=\"let stockLevel of variant.stockLevels\" [title]=\"stockLevel.stockLocation?.name\">\n <div class=\"flex center\">\n <div>\n {{\n stockLevel.stockOnHand\n }}<span class=\"ml-1\" *ngIf=\"stockLevel.stockAllocated\"\n >({{ stockLevel.stockAllocated }} allocated)</span\n >\n </div>\n </div>\n </vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column *ngFor=\"let field of customFields\" [customField]=\"field\" [sorts]=\"sorts\" />\n</vdr-data-table-2>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkRemoveFromChannelAction,\n DataService,\n DeletionResult,\n DuplicateEntityDialogComponent,\n GetProductListQuery,\n isMultiChannel,\n ItemOf,\n ModalService,\n NotificationService,\n Permission,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { BulkAddFacetValuesDialogComponent } from '../bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\n\nimport { ProductListComponent } from './product-list.component';\n\nexport const deleteProductsBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('common.delete'),\n icon: 'trash',\n iconClass: 'is-danger',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteProduct) ||\n userPermissions.includes(Permission.DeleteCatalog),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n modalService\n .dialog({\n title: _('catalog.confirm-bulk-delete-products'),\n translationVars: {\n count: selection.length,\n },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response =>\n response ? dataService.product.deleteProducts(unique(selection.map(p => p.id))) : EMPTY,\n ),\n )\n .subscribe(result => {\n let deleted = 0;\n const errors: string[] = [];\n for (const item of result.deleteProducts) {\n if (item.result === DeletionResult.DELETED) {\n deleted++;\n } else if (item.message) {\n errors.push(item.message);\n }\n }\n if (0 < deleted) {\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\n count: deleted,\n });\n }\n if (0 < errors.length) {\n notificationService.error(errors.join('\\n'));\n }\n hostComponent.refresh();\n clearSelection();\n });\n },\n};\n\nexport const assignProductsToChannelBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('common.assign-to-channel'),\n icon: 'layers',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\n onClick: ({ injector, selection, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productIds: unique(selection.map(p => p.id)),\n currentChannelIds: [],\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n }\n });\n },\n};\n\nexport const removeProductsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetProductListQuery, 'products'>\n>({\n location: 'product-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, productIds, channelId) =>\n dataService.product\n .removeProductsFromChannel({\n channelId: channelId,\n productIds,\n })\n .pipe(map(res => res.removeProductsFromChannel)),\n});\n\nexport const assignFacetValuesToProductsBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('catalog.edit-facet-values'),\n icon: 'tag',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const notificationService = injector.get(NotificationService);\n const mode = 'product';\n const ids = unique(selection.map(p => p.id));\n return modalService\n .fromComponent(BulkAddFacetValuesDialogComponent, {\n size: 'xl',\n locals: {\n mode,\n ids,\n },\n })\n .subscribe(result => {\n if (result) {\n notificationService.success(_('common.notify-bulk-update-success'), {\n count: selection.length,\n entity: mode === 'product' ? 'Products' : 'ProductVariants',\n });\n clearSelection();\n }\n });\n },\n};\n\nexport const duplicateProductsBulkAction: BulkAction<\n ItemOf<GetProductListQuery, 'products'>,\n ProductListComponent\n> = {\n location: 'product-list',\n label: _('common.duplicate'),\n icon: 'copy',\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(DuplicateEntityDialogComponent<ItemOf<GetProductListQuery, 'products'>>, {\n locals: {\n entities: selection,\n entityName: 'Product',\n title: _('catalog.duplicate-products'),\n getEntityName: entity => entity.name,\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n hostComponent.refresh();\n }\n });\n },\n};\n", "import { Component, OnInit } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n FacetValueFormInputComponent,\n JobQueueService,\n JobState,\n LogicalOperator,\n ModalService,\n NotificationService,\n ProductListQueryDocument,\n TypedBaseListComponent,\n} from '@vendure/admin-ui/core';\nimport { EMPTY, lastValueFrom } from 'rxjs';\nimport { delay, switchMap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-products-list',\n templateUrl: './product-list.component.html',\n styleUrls: ['./product-list.component.scss'],\n standalone: false,\n})\nexport class ProductListComponent\n extends TypedBaseListComponent<typeof ProductListQueryDocument, 'products'>\n implements OnInit\n{\n pendingSearchIndexUpdates = 0;\n dataTableListId = 'product-list';\n pageLocationId = 'product-list' as const;\n readonly customFields = this.getCustomFieldConfig('Product');\n readonly filters = this.createFilterCollection()\n .addIdFilter()\n .addDateFilters()\n .addFilters([\n {\n name: 'enabled',\n type: { kind: 'boolean' },\n label: _('common.enabled'),\n filterField: 'enabled',\n },\n {\n name: 'slug',\n type: { kind: 'text' },\n label: _('common.slug'),\n filterField: 'slug',\n },\n ])\n .addFilter({\n name: 'facetValues',\n type: {\n kind: 'custom',\n component: FacetValueFormInputComponent,\n serializeValue: value => value.map(v => v.id).join(','),\n deserializeValue: value => value.split(',').map(id => ({ id })),\n getLabel: value => {\n if (value.length === 0) {\n return '';\n }\n if (value[0].name) {\n return value.map(v => v.name).join(', ');\n } else {\n return lastValueFrom(\n this.dataService.facet\n .getFacetValues({ filter: { id: { in: value.map(v => v.id) } } })\n .mapSingle(({ facetValues }) =>\n facetValues.items.map(fv => fv.name).join(', '),\n ),\n );\n }\n },\n },\n label: _('catalog.facet-values'),\n toFilterInput: (value: any[]) => ({\n facetValueId: {\n in: value.map(v => v.id),\n },\n }),\n })\n .addCustomFieldFilters(this.customFields)\n .connectToRoute(this.route);\n\n readonly sorts = this.createSortCollection()\n .defaultSort('createdAt', 'DESC')\n .addSorts([\n { name: 'id' },\n { name: 'createdAt' },\n { name: 'updatedAt' },\n { name: 'name' },\n { name: 'slug' },\n ])\n .addCustomFieldSorts(this.customFields)\n .connectToRoute(this.route);\n\n constructor(\n protected dataService: DataService,\n private modalService: ModalService,\n private notificationService: NotificationService,\n private jobQueueService: JobQueueService,\n ) {\n super();\n this.configure({\n document: ProductListQueryDocument,\n getItems: data => data.products,\n setVariables: (skip, take) => {\n const searchTerm = this.searchTermControl.value;\n let filterInput = this.filters.createFilterInput();\n if (searchTerm) {\n filterInput = {\n name: {\n contains: searchTerm,\n },\n sku: {\n contains: searchTerm,\n },\n };\n }\n return {\n options: {\n skip,\n take,\n filter: {\n ...(filterInput ?? {}),\n },\n filterOperator: searchTerm ? LogicalOperator.OR : LogicalOperator.AND,\n sort: this.sorts.createSortInput(),\n },\n };\n },\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\n });\n }\n\n rebuildSearchIndex() {\n this.dataService.product.reindex().subscribe(({ reindex }) => {\n this.notificationService.info(_('catalog.reindexing'));\n this.jobQueueService.addJob(reindex.id, job => {\n if (job.state === JobState.COMPLETED) {\n const time = new Intl.NumberFormat().format(job.duration || 0);\n this.notificationService.success(_('catalog.reindex-successful'), {\n count: job.result.indexedItemCount,\n time,\n });\n this.refresh();\n } else {\n this.notificationService.error(_('catalog.reindex-error'));\n }\n });\n });\n }\n\n deleteProduct(productId: string) {\n this.modalService\n .dialog({\n title: _('catalog.confirm-delete-product'),\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response => (response ? this.dataService.product.deleteProduct(productId) : EMPTY)),\n // Short delay to allow the product to be removed from the search index before\n // refreshing.\n delay(500),\n )\n .subscribe(\n () => {\n this.notificationService.success(_('common.notify-delete-success'), {\n entity: 'Product',\n });\n this.refresh();\n },\n err => {\n this.notificationService.error(_('common.notify-delete-error'), {\n entity: 'Product',\n });\n },\n );\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items [locationId]=\"pageLocationId\"></vdr-action-bar-items>\n <a\n class=\"btn btn-primary mr-1\"\n [routerLink]=\"['./create']\"\n *vdrIfPermissions=\"['CreateCatalog', 'CreateProduct']\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.create-new-product' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu [alwaysShow]=\"true\" [locationId]=\"pageLocationId\">\n <button type=\"button\" vdrDropdownItem (click)=\"rebuildSearchIndex()\">\n <clr-icon shape=\"refresh\" class=\"\"></clr-icon>\n {{ 'catalog.rebuild-search-index' | translate }}\n </button>\n </vdr-action-bar-dropdown-menu>\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<vdr-data-table-2\n class=\"mt-2\"\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n [locationId]=\"dataTableListId\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n ></vdr-bulk-action-menu>\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'settings.search-by-product-name-or-sku' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\n <ng-template let-product=\"item\">\n {{ product.id }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-product=\"item\">\n {{ product.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-product=\"item\">\n {{ product.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\n <ng-template let-product=\"item\">\n <div class=\"image-placeholder\">\n <img\n *ngIf=\"product.featuredAsset as asset; else imagePlaceholder\"\n [src]=\"asset | assetPreview : 'tiny'\"\n />\n <ng-template #imagePlaceholder>\n <div class=\"placeholder\">\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\n <ng-template let-product=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', product.id]\"\n ><span>{{ product.name }}</span\n ><clr-icon shape=\"arrow right\"\n /></a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\n <ng-template let-product=\"item\">\n {{ product.slug }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-product=\"item\">\n <vdr-chip *ngIf=\"product.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!product.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'catalog.number-of-variants' | translate\" id=\"number-of-variants\">\n <ng-template let-product=\"item\">\n {{ 'catalog.variant-count' | translate : { count: product.variantList?.totalItems } }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n</vdr-data-table-2>\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, UntypedFormGroup } from '@angular/forms';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n CreateProductVariantInput,\n createUpdatedTranslatable,\n CurrencyCode,\n DataService,\n findTranslation,\n getCustomFieldsDefaults,\n GetProductVariantDetailDocument,\n GetProductVariantDetailQuery,\n GlobalFlag,\n ItemOf,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n ProductOptionFragment,\n ProductVariantUpdateMutationDocument,\n TypedBaseDetailComponent,\n UpdateProductVariantInput,\n} from '@vendure/admin-ui/core';\nimport { pick } from '@vendure/common/lib/pick';\nimport { unique } from '@vendure/common/lib/unique';\nimport { combineLatest, concat, Observable } from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n mergeMap,\n shareReplay,\n skip,\n switchMap,\n switchMapTo,\n take,\n tap,\n} from 'rxjs/operators';\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\n\ninterface SelectedAssets {\n assets?: Asset[];\n featuredAsset?: Asset;\n}\n\ninterface VariantFormValue {\n id: string;\n enabled: boolean;\n sku: string;\n name: string;\n taxCategoryId: string;\n stockOnHand: number;\n useGlobalOutOfStockThreshold: boolean;\n outOfStockThreshold: number;\n trackInventory: GlobalFlag;\n facetValueIds: string[][];\n customFields?: any;\n}\ntype T = NonNullable<GetProductVariantDetailQuery['productVariant']>;\ntype T1 = T['stockLevels'];\n@Component({\n selector: 'vdr-product-variant-detail',\n templateUrl: './product-variant-detail.component.html',\n styleUrls: ['./product-variant-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductVariantDetailComponent\n extends TypedBaseDetailComponent<typeof GetProductVariantDetailDocument, 'productVariant'>\n implements OnInit, OnDestroy\n{\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\n readonly customPriceFields = this.getCustomFieldConfig('ProductVariantPrice');\n readonly customOptionFields = this.getCustomFieldConfig('ProductOption');\n stockLevels$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['stockLevels']>;\n detailForm = this.formBuilder.group<VariantFormValue>({\n id: '',\n enabled: false,\n sku: '',\n name: '',\n taxCategoryId: '',\n stockOnHand: 0,\n useGlobalOutOfStockThreshold: true,\n outOfStockThreshold: 0,\n trackInventory: GlobalFlag.TRUE,\n facetValueIds: [],\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\n });\n stockLevelsForm = this.formBuilder.array<\n FormGroup<{\n stockLocationId: FormControl<string | null>;\n stockLocationName: FormControl<string | null>;\n stockOnHand: FormControl<number | null>;\n stockAllocated: FormControl<number | null>;\n }>\n >([]);\n pricesForm = this.formBuilder.array<\n FormGroup<{\n price: FormControl<number | null>;\n currencyCode: FormControl<CurrencyCode | null>;\n delete: FormControl<boolean | null>;\n customFields: FormGroup<any>; //TODO: Add type\n }>\n >([]);\n assetChanges: SelectedAssets = {};\n taxCategories$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'taxCategories'>>>;\n unusedStockLocation$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'stockLocations'>>>;\n unusedCurrencyCodes$: Observable<string[]>;\n channelPriceIncludesTax$: Observable<boolean>;\n readonly GlobalFlag = GlobalFlag;\n globalTrackInventory: boolean;\n globalOutOfStockThreshold: number;\n facetValues$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['facetValues']>;\n channelDefaultCurrencyCode: CurrencyCode;\n\n constructor(\n private productDetailService: ProductDetailService,\n private formBuilder: FormBuilder,\n private modalService: ModalService,\n private notificationService: NotificationService,\n protected dataService: DataService,\n private changeDetector: ChangeDetectorRef,\n ) {\n super();\n }\n\n ngOnInit() {\n this.init();\n this.dataService.settings.getGlobalSettings('cache-first').single$.subscribe(({ globalSettings }) => {\n this.globalTrackInventory = globalSettings.trackInventory;\n this.globalOutOfStockThreshold = globalSettings.outOfStockThreshold;\n this.changeDetector.markForCheck();\n });\n this.taxCategories$ = this.result$.pipe(map(data => data.taxCategories.items));\n const availableCurrencyCodes$ = this.result$.pipe(\n tap(data => (this.channelDefaultCurrencyCode = data.activeChannel.defaultCurrencyCode)),\n map(data => data.activeChannel.availableCurrencyCodes),\n );\n this.unusedCurrencyCodes$ = combineLatest(this.pricesForm.valueChanges, availableCurrencyCodes$).pipe(\n map(([prices, currencyCodes]) =>\n currencyCodes.filter(code => !prices.map(p => p.currencyCode).includes(code)),\n ),\n );\n const stockLocations$ = this.result$.pipe(map(data => data.stockLocations.items));\n this.unusedStockLocation$ = combineLatest(this.entity$, stockLocations$).pipe(\n map(([entity, stockLocations]) => {\n const usedIds = entity.stockLevels.map(l => l.stockLocation.id);\n return stockLocations.filter(l => !usedIds.includes(l.id));\n }),\n );\n this.channelPriceIncludesTax$ = this.dataService.settings\n .getActiveChannel('cache-first')\n .refetchOnChannelChange()\n .mapStream(data => data.activeChannel.pricesIncludeTax)\n .pipe(shareReplay(1));\n this.stockLevels$ = this.entity$.pipe(map(entity => entity?.stockLevels ?? []));\n const facetValues$ = this.entity$.pipe(map(variant => variant.facetValues ?? []));\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const formFacetValueIdChanges$ = this.detailForm.get('facetValueIds')!.valueChanges.pipe(\n skip(1),\n distinctUntilChanged(),\n switchMap(ids =>\n this.dataService.facet\n .getFacetValues({ filter: { id: { in: ids } } })\n .mapSingle(({ facetValues }) => facetValues.items),\n ),\n shareReplay(1),\n );\n this.facetValues$ = concat(\n facetValues$.pipe(take(1)),\n facetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\n );\n }\n\n ngOnDestroy() {\n this.destroy();\n }\n\n addPriceInCurrency(currencyCode: CurrencyCode) {\n this.pricesForm.push(\n this.formBuilder.group({\n currencyCode,\n price: 0,\n delete: false as boolean,\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customPriceFields)),\n }),\n );\n }\n\n toggleDeletePrice(deleteFormControl: FormControl) {\n deleteFormControl.setValue(!deleteFormControl.value);\n deleteFormControl.markAsDirty();\n }\n\n addStockLocation(stockLocation: ItemOf<GetProductVariantDetailQuery, 'stockLocations'>) {\n this.stockLevelsForm.push(\n this.formBuilder.group({\n stockLocationId: stockLocation.id,\n stockLocationName: stockLocation.name,\n stockOnHand: 0,\n stockAllocated: 0,\n }),\n );\n }\n\n save() {\n combineLatest(this.entity$, this.languageCode$)\n .pipe(\n take(1),\n mergeMap(([variant, languageCode]) => {\n const input = pick(\n this.getUpdatedVariant(\n variant,\n this.detailForm,\n languageCode,\n ) as UpdateProductVariantInput,\n [\n 'id',\n 'enabled',\n 'translations',\n 'sku',\n 'taxCategoryId',\n 'facetValueIds',\n 'featuredAssetId',\n 'assetIds',\n 'trackInventory',\n 'outOfStockThreshold',\n 'useGlobalOutOfStockThreshold',\n 'customFields',\n ],\n ) as UpdateProductVariantInput;\n if (this.stockLevelsForm.dirty) {\n input.stockLevels = this.stockLevelsForm.controls\n .filter(control => control.dirty)\n .map(control => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n stockLocationId: control.value.stockLocationId!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n stockOnHand: control.value.stockOnHand!,\n }));\n }\n if (this.pricesForm.dirty) {\n input.prices = this.pricesForm.controls\n .filter(control => control.dirty)\n .map(control => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n price: control.value.price!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n currencyCode: control.value.currencyCode!,\n delete: control.value.delete === true,\n customFields: control.get('customFields')?.value,\n }));\n }\n return this.dataService.mutate(ProductVariantUpdateMutationDocument, {\n input: [input],\n });\n }),\n )\n .subscribe(\n result => {\n this.detailForm.markAsPristine();\n this.stockLevelsForm.markAsPristine();\n this.pricesForm.markAsPristine();\n this.assetChanges = {};\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductVariant',\n });\n this.changeDetector.markForCheck();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductVariant',\n });\n },\n );\n }\n\n assetsChanged(): boolean {\n return !!Object.values(this.assetChanges).length;\n }\n\n inventoryIsNotTracked(formGroup: UntypedFormGroup): boolean {\n const trackInventory = formGroup.get('trackInventory')?.value;\n return (\n trackInventory === GlobalFlag.FALSE ||\n (trackInventory === GlobalFlag.INHERIT && this.globalTrackInventory === false)\n );\n }\n\n optionGroupCode(optionGroupId: string): string | undefined {\n const group = this.entity?.product.optionGroups.find(g => g.id === optionGroupId);\n return group?.code;\n }\n\n optionName(option: ProductOptionFragment) {\n const translation =\n option.translations.find(t => t.languageCode === this.languageCode) ?? option.translations[0];\n return translation.name;\n }\n\n removeFacetValue(facetValueId: string) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(currentFacetValueIds.filter(id => id !== facetValueId));\n facetValueIdsControl.markAsDirty();\n }\n\n selectFacetValue() {\n this.displayFacetValueModal().subscribe(facetValueIds => {\n if (facetValueIds) {\n const facetValueIdsControl = this.detailForm.controls.facetValueIds;\n const currentFacetValueIds = facetValueIdsControl.value ?? [];\n facetValueIdsControl.setValue(unique([...currentFacetValueIds, ...facetValueIds]));\n facetValueIdsControl.markAsDirty();\n }\n });\n }\n\n private displayFacetValueModal(): Observable<string[] | undefined> {\n return this.modalService\n .fromComponent(ApplyFacetDialogComponent, {\n size: 'md',\n closable: true,\n })\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\n }\n\n protected setFormValues(\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\n languageCode: LanguageCode,\n ): void {\n const variantTranslation = findTranslation(variant, languageCode);\n const facetValueIds = variant.facetValues.map(fv => fv.id);\n this.detailForm.patchValue({\n id: variant.id,\n enabled: variant.enabled,\n sku: variant.sku,\n name: variantTranslation ? variantTranslation.name : '',\n taxCategoryId: variant.taxCategory.id,\n stockOnHand: variant.stockLevels[0]?.stockOnHand ?? 0,\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\n outOfStockThreshold: variant.outOfStockThreshold,\n trackInventory: variant.trackInventory,\n facetValueIds,\n });\n this.stockLevelsForm.clear();\n for (const stockLevel of variant.stockLevels) {\n this.stockLevelsForm.push(\n this.formBuilder.group({\n stockLocationId: stockLevel.stockLocation.id,\n stockLocationName: stockLevel.stockLocation.name,\n stockOnHand: stockLevel.stockOnHand,\n stockAllocated: stockLevel.stockAllocated,\n }),\n );\n }\n this.pricesForm.clear();\n for (const price of variant.prices) {\n const priceForm = this.formBuilder.group({\n price: price.price,\n currencyCode: price.currencyCode,\n delete: false as boolean,\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customPriceFields)),\n });\n if (this.customPriceFields.length) {\n this.setCustomFieldFormValues(this.customPriceFields, priceForm.get(['customFields']), price);\n }\n this.pricesForm.push(priceForm);\n }\n if (this.customFields.length) {\n this.setCustomFieldFormValues(\n this.customFields,\n this.detailForm.get('customFields'),\n variant,\n variantTranslation,\n );\n }\n }\n\n /**\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\n * can then be persisted to the API.\n */\n private getUpdatedVariant(\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\n variantFormGroup: typeof this.detailForm,\n languageCode: LanguageCode,\n ): UpdateProductVariantInput | CreateProductVariantInput {\n const updatedProduct = createUpdatedTranslatable({\n translatable: variant,\n updatedFields: variantFormGroup.value,\n customFieldConfig: this.customFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: variant.name || '',\n },\n });\n return {\n ...updatedProduct,\n assetIds: this.assetChanges.assets?.map(a => a.id),\n featuredAssetId: this.assetChanges.featuredAsset?.id,\n facetValueIds: variantFormGroup.controls.facetValueIds.dirty\n ? variantFormGroup.value.facetValueIds\n : undefined,\n taxCategoryId: variantFormGroup.controls.taxCategoryId.dirty\n ? variantFormGroup.value.taxCategoryId\n : undefined,\n } as UpdateProductVariantInput | CreateProductVariantInput;\n }\n}\n", "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left [grow]=\"true\">\n <div class=\"flex center\">\n <ng-container *ngIf=\"availableLanguages$ | async as availableLanguages\">\n <vdr-language-selector\n *ngIf=\"availableLanguages.length > 1\"\n class=\"mr-2\"\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </ng-container>\n <vdr-product-variant-quick-jump [productId]=\"entity?.product.id\" />\n </div>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"product-variant-detail\"></vdr-action-bar-items>\n <button\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n (detailForm.invalid ||\n stockLevelsForm.invalid ||\n pricesForm.invalid ||\n (detailForm.pristine && stockLevelsForm.pristine && pricesForm.pristine)) &&\n !assetsChanged()\n \"\n >\n {{ 'common.update' | translate }}\n </button>\n <vdr-action-bar-dropdown-menu locationId=\"product-variant-detail\"></vdr-action-bar-dropdown-menu>\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as variant\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar\n ><vdr-card>\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\n <clr-toggle-wrapper *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\">\n <input\n type=\"checkbox\"\n clrToggle\n name=\"enabled\"\n [formControl]=\"detailForm.get(['enabled'])\"\n />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-form-field>\n </vdr-card>\n <vdr-card *ngIf=\"variant.options.length\" [title]=\"'catalog.product-options' | translate\">\n <div class=\"options\">\n <vdr-chip\n *ngFor=\"let option of variant.options | sort : 'groupId'\"\n [colorFrom]=\"optionGroupCode(option.groupId)\"\n [invert]=\"true\"\n >\n <span>{{ optionGroupCode(option.groupId) }}:</span>\n {{ optionName(option) }}\n </vdr-chip>\n </div>\n <div>\n <a\n [routerLink]=\"['../../', 'options']\"\n class=\"button-small mt-2\"\n *vdrIfPermissions=\"updatePermissions\"\n >\n <clr-icon shape=\"pencil\"></clr-icon>\n {{ 'catalog.edit-options' | translate }}\n </a>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'catalog.facets' | translate\">\n <div class=\"facets\">\n <vdr-facet-value-chip\n *ngFor=\"let facetValue of facetValues$ | async\"\n [facetValue]=\"facetValue\"\n [removable]=\"updatePermissions | hasPermission\"\n (remove)=\"removeFacetValue(facetValue.id)\"\n ></vdr-facet-value-chip>\n </div>\n <div>\n <button\n class=\"button-small mt-2\"\n *vdrIfPermissions=\"updatePermissions\"\n (click)=\"selectFacetValue()\"\n >\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-facets' | translate }}\n </button>\n </div>\n </vdr-card>\n\n <vdr-card>\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n\n <vdr-page-block>\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-field [label]=\"'catalog.sku' | translate\" for=\"sku\">\n <input\n id=\"sku\"\n type=\"text\"\n formControlName=\"sku\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\n <vdr-tabbed-custom-fields\n entityName=\"ProductVariant\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-card>\n <vdr-custom-detail-component-host\n locationId=\"product-variant-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n />\n <vdr-card [title]=\"'catalog.assets' | translate\">\n <vdr-assets\n [assets]=\"assetChanges.assets || variant.assets\"\n [featuredAsset]=\"assetChanges.featuredAsset || variant.featuredAsset\"\n [updatePermissions]=\"updatePermissions\"\n (change)=\"assetChanges = $event\"\n />\n </vdr-card>\n <vdr-card [title]=\"'catalog.price-and-tax' | translate\">\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'catalog.tax-category' | translate\" for=\"taxCategory\">\n <select name=\"taxCategory\" formControlName=\"taxCategoryId\">\n <option\n *ngFor=\"let taxCategory of taxCategories$ | async\"\n [value]=\"taxCategory.id\"\n >\n {{ taxCategory.name }}\n </option>\n </select>\n </vdr-form-field>\n </div>\n <div class=\"form-grid prices\" *ngFor=\"let price of pricesForm.controls\" [formGroup]=\"price\">\n <vdr-form-field\n [label]=\"\n ('catalog.price' | translate) +\n (1 < pricesForm.length ? ' (' + price.value.currencyCode + ')' : '')\n \"\n [tooltip]=\"\n 1 < pricesForm.length && price.value.currencyCode === channelDefaultCurrencyCode\n ? ('catalog.default-currency' | translate)\n : undefined\n \"\n for=\"price\"\n >\n <div class=\"price-wrapper\" [class.pending-deletion]=\"price.value.delete === true\">\n <vdr-currency-input\n name=\"price\"\n [currencyCode]=\"price.value.currencyCode\"\n [readonly]=\"\n !(updatePermissions | hasPermission) || price.value.delete === true\n \"\n formControlName=\"price\"\n />\n <div *ngIf=\"1 < pricesForm.controls.length\">\n <button\n class=\"button-small delete-button\"\n [disabled]=\"price.value.currencyCode === channelDefaultCurrencyCode\"\n (click)=\"toggleDeletePrice(price.get('delete'))\"\n >\n <clr-icon shape=\"trash\"></clr-icon>\n </button>\n </div>\n </div>\n </vdr-form-field>\n <vdr-variant-price-detail\n [price]=\"price.value.price\"\n [currencyCode]=\"price.value.currencyCode\"\n [priceIncludesTax]=\"channelPriceIncludesTax$ | async\"\n [taxCategoryId]=\"detailForm.get('taxCategoryId')!.value\"\n />\n\n <div class=\"form-grid-span\" *ngIf=\"customPriceFields.length\">\n <div class=\"title-row\">\n <span class=\"title\">{{ 'common.custom-fields' | translate }}</span>\n </div>\n <vdr-tabbed-custom-fields\n entityName=\"ProductVariantPrice\"\n [customFields]=\"customPriceFields\"\n [customFieldsFormGroup]=\"price.get(['customFields'])\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </div>\n </div>\n\n <vdr-variant-price-strategy-detail\n [channelPriceIncludesTax]=\"channelPriceIncludesTax$ | async\"\n [channelDefaultCurrencyCode]=\"channelDefaultCurrencyCode\"\n [variant]=\"variant\"\n />\n\n <ng-container *ngIf=\"unusedCurrencyCodes$ | async as unusedCurrencyCodes\">\n <div *ngIf=\"unusedCurrencyCodes.length\">\n <vdr-dropdown>\n <button class=\"button mt-2\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-price-in-another-currency' | translate }}\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu>\n <button\n vdrDropdownItem\n *ngFor=\"let currencyCode of unusedCurrencyCodes\"\n (click)=\"addPriceInCurrency(currencyCode)\"\n >\n {{ currencyCode | localeCurrencyName }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </ng-container>\n </vdr-card>\n <vdr-card [title]=\"'catalog.stock-levels' | translate\">\n <div class=\"form-grid\">\n <vdr-form-field\n for=\"track-inventory\"\n [label]=\"'catalog.track-inventory' | translate\"\n [tooltip]=\"'catalog.track-inventory-tooltip' | translate\"\n >\n <select\n name=\"track-inventory\"\n formControlName=\"trackInventory\"\n [disabled]=\"!(updatePermissions | hasPermission)\"\n >\n <option [value]=\"GlobalFlag.TRUE\">\n {{ 'catalog.track-inventory-true' | translate }}\n </option>\n <option [value]=\"GlobalFlag.FALSE\">\n {{ 'catalog.track-inventory-false' | translate }}\n </option>\n <option [value]=\"GlobalFlag.INHERIT\">\n {{ 'catalog.track-inventory-inherit' | translate }}\n </option>\n </select>\n </vdr-form-field>\n\n <vdr-form-item\n [label]=\"'catalog.out-of-stock-threshold' | translate\"\n [tooltip]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\n >\n <input\n type=\"number\"\n formControlName=\"outOfStockThreshold\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n [vdrDisabled]=\"\n detailForm.get('useGlobalOutOfStockThreshold')?.value !== false ||\n inventoryIsNotTracked(detailForm)\n \"\n />\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n name=\"useGlobalOutOfStockThreshold\"\n formControlName=\"useGlobalOutOfStockThreshold\"\n [vdrDisabled]=\"\n !(updatePermissions | hasPermission) || inventoryIsNotTracked(detailForm)\n \"\n />\n <label\n >{{ 'catalog.use-global-value' | translate }} ({{\n globalOutOfStockThreshold\n }})</label\n >\n </clr-toggle-wrapper>\n </vdr-form-item>\n </div>\n <div\n class=\"form-grid stock-levels\"\n *ngFor=\"let stockLevel of stockLevelsForm.controls\"\n [formGroup]=\"stockLevel\"\n >\n <vdr-form-field\n [label]=\"\n stockLevel.get('stockLocationName')?.value +\n ': ' +\n ('catalog.stock-on-hand' | translate)\n \"\n [for]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\n >\n <input\n [id]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\n type=\"number\"\n formControlName=\"stockOnHand\"\n [readonly]=\"!(updatePermissions | hasPermission)\"\n />\n </vdr-form-field>\n <vdr-form-item\n [label]=\"\n stockLevel.get('stockLocationName')?.value +\n ': ' +\n ('catalog.stock-allocated' | translate)\n \"\n >\n {{ stockLevel.get('stockAllocated')?.value }}\n </vdr-form-item>\n </div>\n <ng-container *ngIf=\"unusedStockLocation$ | async as unusedStockLocations\">\n <div *ngIf=\"unusedStockLocations.length\">\n <vdr-dropdown>\n <button class=\"button mt-2\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'catalog.add-stock-location' | translate }}\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\n </button>\n <vdr-dropdown-menu>\n <button\n vdrDropdownItem\n *ngFor=\"let stockLocation of unusedStockLocations\"\n (click)=\"addStockLocation(stockLocation)\"\n >\n <clr-icon shape=\"map-marker\"></clr-icon> {{ stockLocation.name }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </ng-container>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", "import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { DataService } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-variant-price-detail',\n templateUrl: './variant-price-detail.component.html',\n styleUrls: ['./variant-price-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class VariantPriceDetailComponent implements OnInit, OnChanges {\n @Input() priceIncludesTax: boolean;\n @Input() price: number;\n @Input() currencyCode: string;\n @Input() taxCategoryId: string;\n\n grossPrice$: Observable<number>;\n taxRate$: Observable<number>;\n\n private priceChange$ = new BehaviorSubject<number>(0);\n private taxCategoryIdChange$ = new BehaviorSubject<string>('');\n\n constructor(private dataService: DataService) {}\n\n ngOnInit() {\n const taxRates$ = this.dataService.settings\n .getTaxRatesSimple(999, 0, 'cache-first')\n .mapStream(data => data.taxRates.items);\n const activeChannel$ = this.dataService.settings\n .getActiveChannel('cache-first')\n .refetchOnChannelChange()\n .mapStream(data => data.activeChannel);\n\n this.taxRate$ = combineLatest(activeChannel$, taxRates$, this.taxCategoryIdChange$).pipe(\n map(([channel, taxRates, taxCategoryId]) => {\n const defaultTaxZone = channel.defaultTaxZone;\n if (!defaultTaxZone) {\n return 0;\n }\n const applicableRate = taxRates.find(\n taxRate => taxRate.zone.id === defaultTaxZone.id && taxRate.category.id === taxCategoryId,\n );\n\n if (!applicableRate) {\n return 0;\n }\n return applicableRate.value;\n }),\n );\n\n this.grossPrice$ = combineLatest(this.taxRate$, this.priceChange$).pipe(\n map(([taxRate, price]) => Math.round(price * ((100 + taxRate) / 100))),\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ('price' in changes) {\n this.priceChange$.next(changes.price.currentValue);\n }\n if ('taxCategoryId' in changes) {\n this.taxCategoryIdChange$.next(changes.taxCategoryId.currentValue);\n }\n }\n}\n", "<label class=\"clr-control-label\">{{ 'catalog.taxes' | translate }}</label>\n<div *ngIf=\"priceIncludesTax\" class=\"value\">\n {{ 'catalog.price-includes-tax-at' | translate: { rate: taxRate$ | async } }}\n</div>\n<div *ngIf=\"!priceIncludesTax\" class=\"value\">\n {{\n 'catalog.price-with-tax-in-default-zone'\n | translate: { price: grossPrice$ | async | localeCurrency: currencyCode, rate: taxRate$ | async }\n }}\n</div>\n", "import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport {\n CurrencyCode,\n ProductVariantDetailQueryProductVariantFragmentFragment,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-variant-price-strategy-detail',\n templateUrl: './variant-price-strategy-detail.component.html',\n styleUrls: ['./variant-price-strategy-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class VariantPriceStrategyDetailComponent {\n @Input() channelPriceIncludesTax: boolean;\n @Input() variant: ProductVariantDetailQueryProductVariantFragmentFragment;\n @Input() channelDefaultCurrencyCode: CurrencyCode;\n\n calculatedPriceDiffersFromInputPrice(): boolean {\n const defaultPrice =\n this.variant.prices.find(p => p.currencyCode === this.channelDefaultCurrencyCode) ??\n this.variant.prices[0];\n if (!defaultPrice) {\n return false;\n }\n if (this.channelPriceIncludesTax) {\n return this.variant.priceWithTax !== defaultPrice.price;\n } else {\n return this.variant.price !== defaultPrice.price;\n }\n }\n}\n", "<div *ngIf=\"calculatedPriceDiffersFromInputPrice()\" class=\"price-strategy-detail\">\n <vdr-form-item\n [label]=\"'catalog.calculated-price' | translate\"\n [tooltip]=\"'catalog.calculated-price-tooltip' | translate\"\n for=\"price\"\n >\n </vdr-form-item>\n <div class=\"form-grid mt-2\">\n <vdr-form-item [label]=\"'common.price' | translate\">\n {{ variant.price | localeCurrency : variant.currencyCode }}\n </vdr-form-item>\n <vdr-form-item [label]=\"'common.price-with-tax' | translate\">\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\n </vdr-form-item>\n </div>\n</div>\n", "import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n DataService,\n GetProductVariantsQuickJumpDocument,\n GetProductVariantsQuickJumpQuery,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\nimport { Observable } from 'rxjs';\n\nconst GET_PRODUCT_VARIANTS_QUICK_JUMP = gql`\n query GetProductVariantsQuickJump($id: ID!) {\n product(id: $id) {\n id\n variants {\n id\n name\n sku\n }\n }\n }\n`;\n\n@Component({\n selector: 'vdr-product-variant-quick-jump',\n templateUrl: './product-variant-quick-jump.component.html',\n styleUrls: ['./product-variant-quick-jump.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductVariantQuickJumpComponent implements OnInit {\n @Input() productId: string;\n selectedVariantId: string | undefined;\n variants$: Observable<NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants']>;\n constructor(\n private dataService: DataService,\n private router: Router,\n ) {}\n\n ngOnInit() {\n this.variants$ = this.dataService\n .query(GetProductVariantsQuickJumpDocument, {\n id: this.productId,\n })\n .mapStream(data => data.product?.variants ?? []);\n }\n\n searchFn = (\n term: string,\n item: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number],\n ) =>\n item.name.toLowerCase().includes(term.toLowerCase()) ||\n item.sku.toLowerCase().includes(term.toLowerCase());\n\n onSelect(item?: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number]) {\n if (item) {\n this.router\n .navigate(['catalog', 'products', this.productId, 'variants', item.id])\n .then(() => (this.selectedVariantId = undefined));\n }\n }\n}\n", "<ng-select\n *ngIf=\"(variants$ | async)?.length > 1\"\n [items]=\"variants$ | async\"\n appendTo=\"body\"\n bindValue=\"id\"\n [(ngModel)]=\"selectedVariantId\"\n [searchFn]=\"searchFn\"\n [clearable]=\"false\"\n [placeholder]=\"'catalog.quick-jump-placeholder' | translate\"\n (change)=\"onSelect($event)\"\n>\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\n {{ item.name }} ({{ item.sku }})\n </ng-template>\n</ng-select>\n", "import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BulkAction,\n createBulkRemoveFromChannelAction,\n DataService,\n DeletionResult,\n GetProductVariantListQuery,\n isMultiChannel,\n ItemOf,\n ModalService,\n NotificationService,\n Permission,\n ProductVariant,\n} from '@vendure/admin-ui/core';\nimport { unique } from '@vendure/common/lib/unique';\nimport { EMPTY } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nimport { BulkAddFacetValuesDialogComponent } from '../bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\nimport { ProductVariantListComponent } from './product-variant-list.component';\n\nexport const assignProductVariantsToChannelBulkAction: BulkAction<\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\n ProductVariantListComponent\n> = {\n location: 'product-variant-list',\n label: _('common.assign-to-channel'),\n icon: 'layers',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\n onClick: ({ injector, selection, clearSelection }) => {\n const modalService = injector.get(ModalService);\n modalService\n .fromComponent(AssignProductsToChannelDialogComponent, {\n size: 'lg',\n locals: {\n productVariantIds: unique(selection.map(p => p.id)),\n currentChannelIds: [],\n },\n })\n .subscribe(result => {\n if (result) {\n clearSelection();\n }\n });\n },\n};\n\nexport const removeProductVariantsFromChannelBulkAction = createBulkRemoveFromChannelAction<\n ItemOf<GetProductVariantListQuery, 'productVariants'>\n>({\n location: 'product-variant-list',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n getItemName: item => item.name,\n bulkRemoveFromChannel: (dataService, ids, channelId) =>\n dataService.product\n .removeVariantsFromChannel({\n channelId: channelId,\n productVariantIds: ids,\n })\n .pipe(map(res => res.removeProductVariantsFromChannel)),\n});\n\nexport const deleteProductVariantsBulkAction: BulkAction<ProductVariant, ProductVariantListComponent> = {\n location: 'product-variant-list',\n label: _('common.delete'),\n icon: 'trash',\n iconClass: 'is-danger',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.DeleteProduct) ||\n userPermissions.includes(Permission.DeleteCatalog),\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const dataService = injector.get(DataService);\n const notificationService = injector.get(NotificationService);\n modalService\n .dialog({\n title: _('common.confirm-bulk-delete'),\n translationVars: {\n count: selection.length,\n },\n buttons: [\n { type: 'secondary', label: _('common.cancel') },\n { type: 'danger', label: _('common.delete'), returnValue: true },\n ],\n })\n .pipe(\n switchMap(response =>\n response\n ? dataService.product.deleteProductVariants(unique(selection.map(p => p.id)))\n : EMPTY,\n ),\n )\n .subscribe(result => {\n let deleted = 0;\n const errors: string[] = [];\n for (const item of result.deleteProductVariants) {\n if (item.result === DeletionResult.DELETED) {\n deleted++;\n } else if (item.message) {\n errors.push(item.message);\n }\n }\n if (0 < deleted) {\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\n count: deleted,\n });\n }\n if (0 < errors.length) {\n notificationService.error(errors.join('\\n'));\n }\n hostComponent.refresh();\n clearSelection();\n });\n },\n};\n\nexport const assignFacetValuesToProductVariantsBulkAction: BulkAction<\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\n ProductVariantListComponent\n> = {\n location: 'product-variant-list',\n label: _('catalog.edit-facet-values'),\n icon: 'tag',\n requiresPermission: userPermissions =>\n userPermissions.includes(Permission.UpdateCatalog) ||\n userPermissions.includes(Permission.UpdateProduct),\n onClick: ({ injector, selection, clearSelection }) => {\n const modalService = injector.get(ModalService);\n const notificationService = injector.get(NotificationService);\n const mode = 'variant';\n const ids = unique(selection.map(p => p.id));\n return modalService\n .fromComponent(BulkAddFacetValuesDialogComponent, {\n size: 'xl',\n locals: {\n mode,\n ids,\n },\n })\n .subscribe(result => {\n if (result) {\n notificationService.success(_('common.notify-bulk-update-success'), {\n count: selection.length,\n entity: mode === 'variant' ? 'Products' : 'ProductVariants',\n });\n clearSelection();\n }\n });\n },\n};\n", "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { UntypedFormArray, UntypedFormGroup } from '@angular/forms';\nimport { Asset, Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\n\ninterface SelectedAssets {\n assets?: Asset[];\n featuredAsset?: Asset;\n}\n\ninterface PaginationConfig {\n totalItems: number;\n currentPage: number;\n itemsPerPage: number;\n}\n\n@Component({\n selector: 'vdr-product-variants-table',\n templateUrl: './product-variants-table.component.html',\n styleUrls: ['./product-variants-table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ProductVariantsTableComponent implements OnInit, OnDestroy {\n @Input('productVariantsFormArray') formArray: UntypedFormArray;\n @Input() variants: ProductVariantFragment[];\n @Input() paginationConfig: PaginationConfig;\n @Input() channelPriceIncludesTax: boolean;\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\n formGroupMap = new Map<string, UntypedFormGroup>();\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n private subscription: Subscription;\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n\n ngOnInit() {\n this.subscription = this.formArray.valueChanges\n .pipe(\n map(value => value.length),\n debounceTime(1),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n this.buildFormGroupMap();\n });\n\n this.buildFormGroupMap();\n }\n\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n trackByFn(index: number, item: any) {\n if ((item as any).id != null) {\n return (item as any).id;\n } else {\n return index;\n }\n }\n\n getFeaturedAsset(variant: ProductVariantFragment) {\n return this.pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset;\n }\n\n optionGroupName(optionGroupId: string): string | undefined {\n const group = this.optionGroups.find(g => g.id === optionGroupId);\n return group && group.name;\n }\n\n private buildFormGroupMap() {\n this.formGroupMap.clear();\n for (const controlGroup of this.formArray.controls) {\n this.formGroupMap.set(controlGroup.value.id, controlGroup as UntypedFormGroup);\n }\n this.changeDetector.markForCheck();\n }\n}\n", "<table class=\"table\">\n <thead>\n <tr>\n <th></th>\n <th>{{ 'common.name' | translate }}</th>\n <th>{{ 'catalog.sku' | translate }}</th>\n <ng-container *ngFor=\"let optionGroup of optionGroups | sort: 'id'\">\n <th>{{ optionGroup.name }}</th>\n </ng-container>\n <th>{{ 'catalog.price' | translate }}</th>\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\n <th>{{ 'common.enabled' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let variant of variants | paginate: paginationConfig; index as i; trackBy: trackByFn\">\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <div class=\"card-img\">\n <div class=\"featured-asset\">\n <img\n *ngIf=\"getFeaturedAsset(variant) as featuredAsset; else placeholder\"\n [src]=\"featuredAsset | assetPreview: 'tiny'\"\n />\n <ng-template #placeholder>\n <div class=\"placeholder\">\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\n </div>\n </ng-template>\n </div>\n </div>\n </td>\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <input\n clrInput\n type=\"text\"\n formControlName=\"name\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n [placeholder]=\"'common.name' | translate\"\n />\n </clr-input-container>\n </td>\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <input\n clrInput\n type=\"text\"\n formControlName=\"sku\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n [placeholder]=\"'catalog.sku' | translate\"\n />\n </clr-input-container>\n </td>\n <ng-container *ngFor=\"let option of variant.options | sort: 'groupId'\">\n <td\n class=\"left align-middle\"\n [class.disabled]=\"!formGroup.get('enabled')!.value\"\n [style.color]=\"optionGroupName(option.groupId) | stringToColor\"\n >\n {{ option.name }}\n </td>\n </ng-container>\n <td class=\"left align-middle price\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <vdr-currency-input\n *ngIf=\"!channelPriceIncludesTax\"\n clrInput\n [currencyCode]=\"variant.currencyCode\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"price\"\n ></vdr-currency-input>\n <vdr-currency-input\n *ngIf=\"channelPriceIncludesTax\"\n clrInput\n [currencyCode]=\"variant.currencyCode\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n formControlName=\"priceWithTax\"\n ></vdr-currency-input>\n </clr-input-container>\n </td>\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-input-container>\n <input\n clrInput\n type=\"number\"\n min=\"0\"\n step=\"1\"\n formControlName=\"stockOnHand\"\n [readonly]=\"!(updatePermission | hasPermission)\"\n />\n </clr-input-container>\n </td>\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\n <clr-toggle-wrapper>\n <input\n type=\"checkbox\"\n clrToggle\n name=\"enabled\"\n formControlName=\"enabled\"\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\n />\n </clr-toggle-wrapper>\n </td>\n </ng-container>\n </tr>\n </tbody>\n</table>\n", "import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport {\n CustomFieldConfig,\n LanguageCode,\n ProductVariantFragment,\n UpdateProductOptionInput,\n createUpdatedTranslatable,\n Dialog,\n} from '@vendure/admin-ui/core';\n\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\n\n@Component({\n selector: 'vdr-update-product-option-dialog',\n templateUrl: './update-product-option-dialog.component.html',\n styleUrls: ['./update-product-option-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class UpdateProductOptionDialogComponent\n implements Dialog<UpdateProductOptionInput & { autoUpdate: boolean }>, OnInit\n{\n resolveWith: (result?: UpdateProductOptionInput & { autoUpdate: boolean }) => void;\n updateVariantName = true;\n // Provided by caller\n productOption: ProductVariantFragment['options'][number];\n activeLanguage: LanguageCode;\n name: string;\n code: string;\n customFields: CustomFieldConfig[];\n codeInputTouched = false;\n customFieldsForm: UntypedFormGroup;\n\n ngOnInit(): void {\n const currentTranslation = this.productOption.translations.find(\n t => t.languageCode === this.activeLanguage,\n );\n this.name = currentTranslation?.name ?? '';\n this.code = this.productOption.code;\n this.customFieldsForm = new UntypedFormGroup({});\n if (this.customFields) {\n const cfCurrentTranslation =\n (currentTranslation && (currentTranslation as any).customFields) || {};\n\n for (const fieldDef of this.customFields) {\n const key = fieldDef.name;\n const value =\n fieldDef.type === 'localeString'\n ? cfCurrentTranslation[key]\n : (this.productOption as any).customFields[key];\n this.customFieldsForm.addControl(fieldDef.name, new UntypedFormControl(value));\n }\n }\n }\n\n update() {\n const result = createUpdatedTranslatable({\n translatable: this.productOption,\n languageCode: this.activeLanguage,\n updatedFields: {\n code: this.code,\n name: this.name,\n customFields: this.customFieldsForm.value,\n },\n customFieldConfig: this.customFields,\n defaultTranslation: {\n languageCode: this.activeLanguage,\n name: '',\n },\n });\n this.resolveWith({ ...result, autoUpdate: this.updateVariantName });\n }\n\n cancel() {\n this.resolveWith();\n }\n\n updateCode(nameValue: string) {\n if (!this.codeInputTouched && !this.productOption.code) {\n this.code = normalizeString(nameValue, '-');\n }\n }\n}\n", "<ng-template vdrDialogTitle>{{ 'catalog.update-product-option' | translate }}</ng-template>\n<vdr-form-field [label]=\"'catalog.option-name' | translate\" for=\"name\">\n <input\n id=\"name\"\n type=\"text\"\n #nameInput=\"ngModel\"\n [(ngModel)]=\"name\"\n required\n (input)=\"updateCode($event.target.value)\"\n />\n</vdr-form-field>\n<vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\n <input id=\"code\" type=\"text\" #codeInput=\"ngModel\" required [(ngModel)]=\"code\" pattern=\"[a-z0-9_-]+\" />\n</vdr-form-field>\n<clr-checkbox-wrapper>\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"updateVariantName\" />\n <label>{{ 'catalog.auto-update-option-variant-name' | translate }}</label>\n</clr-checkbox-wrapper>\n<section *ngIf=\"customFields.length\">\n <label>{{ 'common.custom-fields' | translate }}</label>\n <vdr-tabbed-custom-fields\n entityName=\"ProductOption\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"customFieldsForm\"\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n</section>\n\n<ng-template vdrDialogButtons>\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\n <button\n type=\"submit\"\n (click)=\"update()\"\n [disabled]=\"\n nameInput.invalid ||\n codeInput.invalid ||\n (nameInput.pristine && codeInput.pristine && customFieldsForm.pristine)\n \"\n class=\"btn btn-primary\"\n >\n {{ 'catalog.update-product-option' | translate }}\n </button>\n</ng-template>\n", "import { gql } from 'apollo-angular';\n\nconst PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT = gql`\n fragment ProductListQueryProductFragment on Product {\n id\n createdAt\n updatedAt\n enabled\n languageCode\n name\n slug\n featuredAsset {\n id\n createdAt\n updatedAt\n preview\n focalPoint {\n x\n y\n }\n }\n variantList {\n totalItems\n }\n }\n`;\n\nexport const PRODUCT_LIST_QUERY = gql`\n query ProductListQuery($options: ProductListOptions) {\n products(options: $options) {\n items {\n ...ProductListQueryProductFragment\n }\n totalItems\n }\n }\n ${PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT}\n`;\n", "import {\n ASSET_FRAGMENT,\n PRODUCT_OPTION_FRAGMENT,\n PRODUCT_VARIANT_PRICE_FRAGMENT,\n} from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nexport const PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\n fragment ProductVariantDetailQueryProductVariantFragment on ProductVariant {\n id\n createdAt\n updatedAt\n enabled\n languageCode\n name\n price\n currencyCode\n prices {\n ...ProductVariantPrice\n }\n priceWithTax\n stockOnHand\n stockAllocated\n trackInventory\n outOfStockThreshold\n useGlobalOutOfStockThreshold\n taxRateApplied {\n id\n name\n value\n }\n taxCategory {\n id\n name\n }\n sku\n options {\n ...ProductOption\n }\n stockLevels {\n id\n createdAt\n updatedAt\n stockOnHand\n stockAllocated\n stockLocationId\n stockLocation {\n id\n createdAt\n updatedAt\n name\n }\n }\n facetValues {\n id\n code\n name\n facet {\n id\n name\n }\n }\n featuredAsset {\n ...Asset\n }\n assets {\n ...Asset\n }\n translations {\n id\n languageCode\n name\n }\n channels {\n id\n code\n }\n product {\n id\n name\n optionGroups {\n id\n name\n code\n translations {\n id\n languageCode\n name\n }\n }\n }\n }\n ${PRODUCT_VARIANT_PRICE_FRAGMENT}\n`;\n\nexport const PRODUCT_VARIANT_DETAIL_QUERY = gql`\n query GetProductVariantDetail($id: ID!) {\n productVariant(id: $id) {\n ...ProductVariantDetailQueryProductVariantFragment\n }\n stockLocations(options: { take: 100 }) {\n items {\n id\n createdAt\n updatedAt\n name\n description\n }\n }\n taxCategories(options: { take: 100 }) {\n items {\n id\n createdAt\n updatedAt\n name\n isDefault\n }\n totalItems\n }\n activeChannel {\n id\n availableCurrencyCodes\n defaultCurrencyCode\n }\n }\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\n`;\n\nexport const PRODUCT_VARIANT_UPDATE_MUTATION = gql`\n mutation ProductVariantUpdateMutation($input: [UpdateProductVariantInput!]!) {\n updateProductVariants(input: $input) {\n ...ProductVariantDetailQueryProductVariantFragment\n }\n }\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\n`;\n", "import { ASSET_FRAGMENT } from '@vendure/admin-ui/core';\nimport { gql } from 'apollo-angular';\n\nconst PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\n fragment ProductVariantListQueryProductVariantFragment on ProductVariant {\n id\n createdAt\n updatedAt\n productId\n enabled\n languageCode\n name\n price\n currencyCode\n priceWithTax\n trackInventory\n outOfStockThreshold\n stockLevels {\n id\n createdAt\n updatedAt\n stockLocationId\n stockOnHand\n stockAllocated\n stockLocation {\n id\n createdAt\n updatedAt\n name\n }\n }\n useGlobalOutOfStockThreshold\n sku\n featuredAsset {\n ...Asset\n }\n }\n\n ${ASSET_FRAGMENT}\n`;\n\nexport const PRODUCT_VARIANT_LIST_QUERY = gql`\n query ProductVariantListQuery($options: ProductVariantListOptions!) {\n productVariants(options: $options) {\n items {\n ...ProductVariantListQueryProductVariantFragment\n }\n totalItems\n }\n }\n ${PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT}\n`;\n"],
5
5
  "mappings": "izFAgFA,IAAYA,GAAZ,SAAYA,EAAc,CACxBA,OAAAA,EAAA,4BAAA,8BACAA,EAAA,MAAA,QACAA,EAAA,UAAA,YAHUA,CAIZ,EAJYA,KAAcC,EAAAD,eAAdA,GAAc,CAAA,EAAA,EAmKdE,GAAZ,SAAYA,EAAS,CACnBA,OAAAA,EAAA,OAAA,SACAA,EAAA,MAAA,QACAA,EAAA,MAAA,QAHUA,CAIZ,EAJYA,KAASD,EAAAC,UAATA,GAAS,CAAA,EAAA,EAwvBTC,GAAZ,SAAYA,EAAY,CAEtBA,OAAAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EAAA,IAAA,MAEAA,EA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,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,MAAA,QAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA,KAEAA,EAAA,GAAA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",
6
6
  "names": ["AdjustmentType", "exports", "AssetType", "CurrencyCode", "DeletionResult", "ErrorCode", "GlobalFlag", "HistoryEntryType", "JobState", "LanguageCode", "LogicalOperator", "MetricInterval", "MetricType", "OrderType", "Permission", "SortOrder", "StockMovementType", "import_generated_types", "import_normalize_string", "import_shared_utils", "replaceLast", "target", "search", "replace", "lastIndex", "lastIndexOf", "head", "substr", "tail", "ProductDetailService", "constructor", "dataService", "getTaxCategories", "settings", "mapSingle", "data", "taxCategories", "items", "pipe", "shareReplay", "createProductWithVariants", "input", "createVariantsConfig", "languageCode", "createProduct$", "product", "createProduct", "nonEmptyOptionGroups", "groups", "filter", "g", "values", "length", "createOptionGroups$", "createProductOptionGroups", "forkJoin", "mergeMap", "optionGroups", "map", "optionGroup", "addOptionGroupToProduct", "productId", "id", "optionGroupId", "of", "variants", "v", "optionIds", "optionValues", "optionName", "index", "option", "options", "find", "o", "name", "Error", "__spreadProps", "__spreadValues", "og", "reduce", "flat", "createProductVariants", "stockLocationId", "c", "code", "normalizeString", "translations", "createProductOptionGroup", "variantData", "notNullOrUndefined", "join", "price", "sku", "stockLevels", "stockOnHand", "stock", "updateProduct", "updateOptions", "autoUpdate", "productInput", "variantsInput", "updateOperations", "updateVariantsInput", "getProductVariantsForProduct", "productVariants", "push", "productOldName", "findTranslation", "productNewName", "variant", "currentVariantName", "variantInput", "existingVariantInput", "i", "variantTranslation", "replaceLast", "updateProductVariants", "updateProductOptions", "inputs", "autoUpdateProductNames", "updateProductVariantNames$", "replacementMap", "Map", "newOptionName", "oldOptionName", "includes", "set", "variantsToUpdate", "size", "oldOptionNames", "Array", "from", "keys", "variantName", "some", "updatedVariantName", "get", "updateProductOption", "deleteProductVariant", "switchMap", "result", "DeletionResult", "DELETED", "getProduct", "single$", "throwError", "message", "\u0275\u0275inject", "DataService", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "save", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "detailForm", "pristine", "invalid", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementContainerStart", "\u0275\u0275element", "optionGroupCustomFields", "optionGroup_r3", "get", "updatePermission", "optionControl_r5", "value", "id", "\u0275\u0275pipeBind2", "optionControl_r6", "createdAt", "optionControl_r7", "updatedAt", "optionControl_r8", "optionControl_r9", "optionCustomFields", "optionControl_r10", "$event", "_r4", "$implicit", "paginationSettings", "currentPage", "itemsPerPage", "\u0275\u0275template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_3_Template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_6_Template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_9_Template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_12_Template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_15_Template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_18_Template", "options_r11", "length", "ProductOptionsEditorComponent_form_22_vdr_card_2_ng_container_11_Template", "ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_Template", "i_r12", "code", "getOptions", "ProductOptionsEditorComponent_form_22_vdr_card_2_Template", "getOptionGroups", "ProductOptionsEditorComponent", "BaseDetailComponent", "constructor", "route", "router", "serverConfigService", "dataService", "permissionsService", "productDetailService", "formBuilder", "changeDetector", "notificationService", "autoUpdateVariantNames", "Permission", "UpdateCatalog", "UpdateProduct", "getCustomFieldConfig", "ngOnInit", "optionGroups$", "snapshot", "data", "entity", "pipe", "map", "product", "optionGroups", "tap", "group", "UntypedFormGroup", "UntypedFormArray", "init", "controls", "optionGroup", "$product", "getProduct", "mapSingle", "combineLatest", "entity$", "languageCode$", "take", "mergeMap", "languageCode", "updateOperations", "updatedProductOptionInputs", "optionGroupForm", "dirty", "optionGroupEntity", "find", "og", "input", "getUpdatedOptionGroup", "push", "updateProductOptionGroup", "optionForm", "options", "o", "getUpdatedOption", "updateProductOptions", "forkJoin", "subscribe", "markAsPristine", "markForCheck", "success", "err", "error", "optionGroupFormGroup", "createUpdatedTranslatable", "translatable", "updatedFields", "customFieldConfig", "defaultTranslation", "name", "option", "optionFormGroup", "setFormValues", "groupsForm", "groupTranslation", "findTranslation", "groupForm", "setOptionGroupForm", "setCustomFieldsForm", "optionsForm", "array", "addControl", "optionTranslation", "setOptionForm", "customFields", "formGroup", "currentTranslation", "customValueFieldsGroup", "reduce", "hash", "field", "__spreadProps", "__spreadValues", "setCustomFieldFormValues", "control", "setValue", "\u0275\u0275directiveInject", "ActivatedRoute", "Router", "ServerConfigService", "DataService", "PermissionsService", "ProductDetailService", "UntypedFormBuilder", "ChangeDetectorRef", "NotificationService", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "setLanguage", "\u0275\u0275twoWayListener", "i0", "\u0275\u0275twoWayBindingSet", "ProductOptionsEditorComponent_button_20_Template", "ProductOptionsEditorComponent_form_22_Template", "\u0275\u0275textInterpolate", "availableLanguages$", "\u0275\u0275twoWayProperty", "import_normalize_string", "import_unique", "import_normalize_string", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "\u0275\u0275elementEnd", "confirm", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "\u0275\u0275property", "form", "invalid", "CreateProductOptionGroupDialogComponent", "constructor", "formBuilder", "group", "name", "Validators", "required", "code", "updateCode", "nameControl", "get", "codeControl", "pristine", "setValue", "normalizeString", "value", "resolveWith", "options", "translations", "languageCode", "\u0275\u0275directiveInject", "FormBuilder", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "CreateProductOptionGroupDialogComponent_ng_template_0_Template", "\u0275\u0275element", "CreateProductOptionGroupDialogComponent_ng_template_8_Template", "import_shared_utils", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275property", "optionGroup_r1", "name", "\u0275\u0275advance", "options", "code", "\u0275\u0275textInterpolate3", "ctx_r1", "existingVariant", "sku", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "confirm", "\u0275\u0275textInterpolate", "form", "invalid", "product", "optionGroups", "length", "CreateProductVariantDialogComponent", "constructor", "formBuilder", "group", "Validators", "required", "price", "record", "ngOnInit", "currencyCode", "variants", "optionGroup", "get", "addControl", "FormControl", "valueChanges", "subscribe", "value", "nameControl", "Object", "values", "every", "v", "dirty", "entries", "map", "groupCode", "optionId", "find", "og", "o", "id", "join", "setValue", "groupId", "getGroupIdFromCode", "optionIds", "filter", "notNullOrUndefined", "resolveWith", "productId", "Number", "translations", "languageCode", "getGroupCodeFromId", "\u0275\u0275directiveInject", "FormBuilder", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "CreateProductVariantDialogComponent_ng_template_0_Template", "CreateProductVariantDialogComponent_vdr_form_field_3_Template", "CreateProductVariantDialogComponent_clr_alert_4_Template", "CreateProductVariantDialogComponent_div_5_Template", "CreateProductVariantDialogComponent_ng_template_16_Template", "import_unique", "\u0275\u0275elementStart", "\u0275\u0275listener", "option_r4", "\u0275\u0275restoreView", "_r3", "$implicit", "ctx_r4", "\u0275\u0275nextContext", "\u0275\u0275resetView", "removeOption", "$event", "i_r6", "index", "updateOption", "i0", "cancelBubble", "\u0275\u0275elementEnd", "editName", "\u0275\u0275text", "\u0275\u0275classProp", "isLast_r7", "lastSelected", "locked", "\u0275\u0275property", "groupName", "\u0275\u0275advance", "editingIndex", "name", "id", "\u0275\u0275textInterpolate", "\u0275\u0275template", "OptionValueInputComponent_div_1_vdr_chip_1_Template", "optionValues", "OPTION_VALUE_INPUT_VALUE_ACCESSOR", "provide", "NG_VALUE_ACCESSOR", "useExisting", "forwardRef", "OptionValueInputComponent", "multi", "formValue", "options", "constructor", "changeDetector", "add", "EventEmitter", "remove", "edit", "disabled", "input", "isFocussed", "registerOnChange", "fn", "onChangeFn", "registerOnTouched", "onTouchFn", "setDisabledState", "isDisabled", "markForCheck", "writeValue", "obj", "focus", "textArea", "nativeElement", "event", "optionValue", "nameInputs", "get", "setTimeout", "newName", "target", "value", "emit", "option", "filter", "o", "handleKey", "key", "addOptionValue", "preventDefault", "removeLastOption", "handleBlur", "parseInputIntoOptions", "find", "unique", "split", "map", "s", "trim", "length", "\u0275\u0275directiveInject", "ChangeDetectorRef", "selectors", "viewQuery", "rf", "ctx", "ElementRef", "decls", "vars", "consts", "template", "_r1", "textArea_r2", "\u0275\u0275reference", "OptionValueInputComponent_div_1_Template", "\u0275\u0275twoWayListener", "\u0275\u0275twoWayBindingSet", "\u0275\u0275twoWayProperty", "\u0275\u0275elementStart", "\u0275\u0275twoWayListener", "$event", "group_r2", "\u0275\u0275restoreView", "_r1", "$implicit", "i0", "\u0275\u0275twoWayBindingSet", "name", "\u0275\u0275resetView", "\u0275\u0275elementEnd", "\u0275\u0275listener", "i_r3", "index", "ctx_r3", "\u0275\u0275nextContext", "addOption", "removeOption", "removeOptionGroup", "\u0275\u0275element", "\u0275\u0275advance", "\u0275\u0275property", "\u0275\u0275pipeBind1", "\u0275\u0275twoWayProperty", "isNew", "values", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "variant_r5", "id", "\u0275\u0275pipeBind2", "variant_r6", "createdAt", "variant_r7", "updatedAt", "variant_r8", "variant_r9", "sku", "optionGroup_r11", "code", "\u0275\u0275textInterpolate", "option_r10", "_r12", "variant_r13", "item", "setOptionToAddToVariant", "addOptionToVariant", "options", "\u0275\u0275classProp", "optionsToAddToVariant", "\u0275\u0275template", "ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_vdr_chip_0_Template", "ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_ng_template_1_Template", "\u0275\u0275templateRefExtractor", "getOption", "selectOption_r14", "ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_Template", "variant_r15", "price", "currencyCode", "variant_r16", "priceWithTax", "variant_r18", "_r17", "deleteVariant", "GeneratedVariant", "constructor", "config", "key", "Object", "keys", "ProductVariantsEditorComponent", "route", "dataService", "productDetailService", "notificationService", "modalService", "changeDetector", "formValueChanged", "optionsChanged", "itemsPerPage", "currentPage", "searchTermControl", "FormControl", "selectionManager", "SelectionManager", "multiSelect", "itemsAreEqual", "a", "b", "additiveMode", "refresh$", "Subject", "ngOnInit", "languageCode", "snapshot", "paramMap", "get", "getDefaultUiLanguage", "settings", "getActiveChannel", "single$", "subscribe", "data", "activeChannel", "defaultCurrencyCode", "product$", "pipe", "switchMap", "product", "getProductVariantsOptions", "parent", "mapSingle", "startWith", "variants$", "valueChanges", "map", "term", "variants", "filter", "v", "toLowerCase", "includes", "optionGroups$", "optionGroups", "totalItems$", "length", "p", "allUsedOptionIds", "option", "flat", "allUsedOptionGroupIds", "groupId", "og", "locked", "o", "setItemsPerPage", "setPageNumber", "page", "onFormChanged", "variantInfo", "enabled", "canDeactivate", "addOptionGroup", "fromComponent", "CreateProductOptionGroupDialogComponent", "locals", "result", "createProductOptionGroups", "createProductOptionGroup", "addOptionGroupToProduct", "optionGroupId", "productId", "EMPTY", "success", "entity", "next", "markForCheck", "optionGroup", "usedByVariantsCount", "dialog", "title", "body", "translationVars", "count", "buttons", "type", "label", "returnValue", "val", "removeOptionGroupFromProduct", "force", "__typename", "error", "message", "optionName", "group", "addOptionToGroup", "productOptionGroupId", "normalizeString", "translations", "createProductOption", "deleteProductOption", "DeletionResult", "DELETED", "variantId", "optionId", "variant", "optionIds", "updateProductVariants", "unique", "response", "deleteProductVariant", "err", "createNewVariant", "CreateProductVariantDialogComponent", "createProductVariants", "find", "\u0275\u0275directiveInject", "ActivatedRoute", "DataService", "ProductDetailService", "NotificationService", "ModalService", "ChangeDetectorRef", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "ProductVariantsEditorComponent_div_2_Template", "ProductVariantsEditorComponent_ng_template_20_Template", "ProductVariantsEditorComponent_ng_template_23_Template", "ProductVariantsEditorComponent_ng_template_26_Template", "ProductVariantsEditorComponent_ng_template_29_Template", "ProductVariantsEditorComponent_ng_template_32_Template", "ProductVariantsEditorComponent_vdr_dt2_column_33_Template", "ProductVariantsEditorComponent_ng_template_37_Template", "ProductVariantsEditorComponent_ng_template_40_Template", "ProductVariantsEditorComponent_ng_template_43_Template", "ProductVariantsResolver", "BaseEntityResolver", "constructor", "router", "dataService", "__typename", "id", "createdAt", "updatedAt", "name", "languageCode", "optionGroups", "variants", "product", "getProductVariantsOptions", "mapStream", "data", "\u0275\u0275inject", "Router", "DataService", "factory", "\u0275fac", "providedIn", "createRoutes", "pageService", "path", "component", "PageComponent", "data", "locationId", "breadcrumb", "children", "getPageTabRoutes", "redirectTo", "label", "link", "ProductVariantsEditorComponent", "canDeactivate", "CanDeactivateDetailGuard", "product", "name", "resolve", "route", "inject", "DataService", "getProductVariantsOptions", "parent", "params", "id", "mapSingle", "ProductOptionsEditorComponent", "createResolveData", "ProductVariantsResolver", "productOptionsEditorBreadcrumb", "entity", "pipe", "map", "\u0275\u0275text", "\u0275\u0275textInterpolate", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "\u0275\u0275elementEnd", "selectValues", "\u0275\u0275advance", "\u0275\u0275property", "selectedValues", "length", "\u0275\u0275textInterpolate1", "ApplyFacetDialogComponent", "constructor", "changeDetector", "ngAfterViewInit", "setTimeout", "selector", "focus", "resolveWith", "\u0275\u0275directiveInject", "ChangeDetectorRef", "selectors", "viewQuery", "rf", "ctx", "FacetValueSelectorComponent", "\u0275\u0275template", "ApplyFacetDialogComponent_ng_template_0_Template", "$event", "ApplyFacetDialogComponent_ng_template_2_Template", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "save", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "detailForm", "invalid", "pristine", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "ASSET_DETAIL_QUERY", "gql", "ASSET_FRAGMENT", "TAG_FRAGMENT", "AssetDetailComponent", "TypedBaseDetailComponent", "constructor", "notificationService", "dataService", "formBuilder", "customFields", "getCustomFieldConfig", "FormGroup", "name", "FormControl", "tags", "group", "getCustomFieldsDefaults", "ngOnInit", "init", "ngOnDestroy", "destroy", "onAssetChange", "event", "get", "setValue", "markAsDirty", "product", "updateAsset", "id", "value", "subscribe", "success", "entity", "err", "error", "setFormValues", "languageCode", "map", "t", "length", "setCustomFieldFormValues", "\u0275\u0275directiveInject", "NotificationService", "DataService", "UntypedFormBuilder", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275template", "AssetDetailComponent_button_5_Template", "$event", "\u0275\u0275pureFunction0", "_c0", "entity$", "AssetListComponent", "BaseListComponent", "constructor", "notificationService", "modalService", "dataService", "router", "route", "searchTerm$", "BehaviorSubject", "undefined", "filterByTags$", "uploading", "setQueryFn", "args", "product", "getAssetList", "refetchOnChannelChange", "data", "assets", "skip", "take", "searchTerm", "value", "tags", "map", "t", "options", "__spreadProps", "__spreadValues", "filter", "name", "contains", "sort", "createdAt", "SortOrder", "DESC", "tagsOperator", "LogicalOperator", "AND", "ngOnInit", "paginationConfig$", "combineLatest", "itemsPerPage$", "currentPage$", "totalItems$", "pipe", "itemsPerPage", "currentPage", "totalItems", "debounceTime", "takeUntil", "destroy$", "subscribe", "refresh", "allTags$", "getTagList", "mapStream", "items", "filesSelected", "files", "length", "createAssets", "finalize", "successCount", "result", "__typename", "error", "message", "success", "count", "deleteAssets", "showModalAndDelete", "a", "id", "switchMap", "response", "DeletionResult", "DELETED", "r", "entity", "err", "assetIds", "dialog", "title", "translationVars", "body", "buttons", "type", "label", "returnValue", "res", "EMPTY", "\u0275\u0275directiveInject", "NotificationService", "ModalService", "DataService", "Router", "ActivatedRoute", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275listener", "$event", "next", "\u0275\u0275elementEnd", "setItemsPerPage", "setPageNumber", "\u0275\u0275advance", "\u0275\u0275property", "\u0275\u0275pipeBind1", "\u0275\u0275pipeBind2", "items$", "\u0275\u0275pureFunction0", "_c0", "_c1", "\u0275\u0275elementContainerStart", "\u0275\u0275text", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "\u0275\u0275pipeBind1", "\u0275\u0275template", "AssignProductsToChannelDialogComponent_ng_template_0_ng_container_0_Template", "AssignProductsToChannelDialogComponent_ng_template_0_ng_template_1_Template", "\u0275\u0275templateRefExtractor", "\u0275\u0275property", "ctx_r1", "isProductVariantMode", "productModeTitle_r1", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind2", "\u0275\u0275pureFunction1", "_c0", "selectedChannel", "code", "row_r3", "pricePreview", "defaultCurrencyCode", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "AssignProductsToChannelDialogComponent_tr_33_ng_template_7_Template", "AssignProductsToChannelDialogComponent_tr_33_ng_template_8_Template", "name", "price", "currentChannel", "noChannelSelected_r4", "_c1", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r5", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "assign", "AssignProductsToChannelDialogComponent_ng_template_35_ng_template_4_Template", "AssignProductsToChannelDialogComponent_ng_template_35_ng_template_5_Template", "noSelection_r6", "AssignProductsToChannelDialogComponent", "productVariantIds", "constructor", "dataService", "notificationService", "priceFactorControl", "UntypedFormControl", "selectedChannelIdControl", "ngOnInit", "activeChannelId$", "client", "userStatus", "mapSingle", "activeChannelId", "allChannels$", "settings", "getChannels", "data", "channels", "combineLatest", "subscribe", "items", "find", "c", "id", "availableChannels", "valueChanges", "ids", "selectChannel", "variantsPreview$", "from", "getTopVariants", "pipe", "startWith", "map", "variants", "factor", "v", "channelIds", "product", "assignVariantsToChannel", "channelId", "priceFactor", "value", "success", "channel", "count", "length", "resolveWith", "assignProductsToChannel", "productIds", "take", "__async", "lastValueFrom", "getProductVariants", "filterOperator", "LogicalOperator", "OR", "filter", "productId", "in", "single$", "productVariants", "\u0275\u0275directiveInject", "DataService", "NotificationService", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "AssignProductsToChannelDialogComponent_ng_template_0_Template", "\u0275\u0275element", "AssignProductsToChannelDialogComponent_ng_template_29_Template", "AssignProductsToChannelDialogComponent_ng_template_30_Template", "AssignProductsToChannelDialogComponent_tr_33_Template", "AssignProductsToChannelDialogComponent_ng_template_35_Template", "currentChannelIds", "noSelection_r7", "import_unique", "GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS", "gql", "GET_VARIANTS_WITH_FACET_VALUES_BY_IDS", "UPDATE_PRODUCTS_BULK", "UPDATE_VARIANTS_BULK", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "item_r2", "sku", "\u0275\u0275listener", "facetValue_r4", "\u0275\u0275restoreView", "_r3", "$implicit", "\u0275\u0275nextContext", "ctx_r4", "\u0275\u0275resetView", "removeFacetValue", "id", "\u0275\u0275property", "\u0275\u0275template", "BulkAddFacetValuesDialogComponent_table_7_tr_2_div_4_Template", "BulkAddFacetValuesDialogComponent_table_7_tr_2_vdr_facet_value_chip_6_Template", "name", "facetValues", "BulkAddFacetValuesDialogComponent_table_7_tr_2_Template", "items", "\u0275\u0275element", "_r6", "cancel", "addFacetValues", "selectedValues", "length", "facetValuesRemoved", "BulkAddFacetValuesDialogComponent", "constructor", "dataService", "changeDetectorRef", "mode", "state", "ngOnInit", "fetchData$", "query", "GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS", "ids", "mapSingle", "products", "map", "p", "__spreadProps", "__spreadValues", "GET_VARIANTS_WITH_FACET_VALUES_BY_IDS", "productVariants", "subscription", "subscribe", "next", "markForCheck", "ngOnDestroy", "unsubscribe", "resolveWith", "item", "facetValueId", "filter", "fv", "selectedFacetValueIds", "sv", "mutate", "UPDATE_PRODUCTS_BULK", "input", "product", "facetValueIds", "unique", "UPDATE_VARIANTS_BULK", "result", "\u0275\u0275directiveInject", "DataService", "ChangeDetectorRef", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "BulkAddFacetValuesDialogComponent_ng_template_0_Template", "$event", "i0", "_r1", "BulkAddFacetValuesDialogComponent_table_7_Template", "BulkAddFacetValuesDialogComponent_ng_template_8_Template", "\u0275\u0275templateRefExtractor", "BulkAddFacetValuesDialogComponent_ng_template_10_Template", "placeholder_r7", "\u0275\u0275elementContainer", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "variant_r1", "id", "\u0275\u0275pipeBind2", "variant_r2", "createdAt", "variant_r3", "updatedAt", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275property", "\u0275\u0275pureFunction1", "_c1", "variant_r4", "productId", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "name", "variant_r5", "sku", "CollectionContentsComponent", "constructor", "route", "router", "dataService", "previewUpdatedFilters", "filterTermControl", "UntypedFormControl", "isLoading", "collectionIdChange$", "BehaviorSubject", "parentIdChange$", "filterChanges$", "inheritFiltersChanges$", "refresh$", "destroy$", "Subject", "ngOnInit", "contentsCurrentPage$", "queryParamMap", "pipe", "map", "qpm", "get", "page", "startWith", "distinctUntilChanged", "contentsItemsPerPage$", "perPage", "filterTerm$", "valueChanges", "debounceTime", "tap", "setContentsPageNumber", "asObservable", "filter", "inheritFilters", "collection$", "combineLatest", "takeUntil", "switchMap", "parentId", "currentPage", "itemsPerPage", "filterTerm", "filters", "take", "skip", "length", "filterClause", "contains", "undefined", "collection", "previewCollectionVariants", "mapSingle", "data", "catchError", "of", "items", "totalItems", "getCollectionContents", "productVariants", "finalize", "contents$", "result", "contentsTotalItems$", "ngOnChanges", "changes", "next", "collectionId", "currentValue", "updatedFilters", "ngOnDestroy", "complete", "setParam", "setContentsItemsPerPage", "refresh", "key", "value", "navigate", "relativeTo", "queryParams", "queryParamsHandling", "replaceUrl", "\u0275\u0275directiveInject", "ActivatedRoute", "Router", "DataService", "selectors", "contentQueries", "rf", "ctx", "dirIndex", "TemplateRef", "\u0275\u0275template", "CollectionContentsComponent_ng_container_3_Template", "\u0275\u0275listener", "$event", "CollectionContentsComponent_ng_template_14_Template", "CollectionContentsComponent_ng_template_17_Template", "CollectionContentsComponent_ng_template_20_Template", "CollectionContentsComponent_ng_template_23_Template", "CollectionContentsComponent_ng_template_26_Template", "\u0275\u0275classProp", "headerTemplate", "_c0", "\u0275\u0275pipeBind1", "\u0275\u0275element", "\u0275\u0275property", "ctx_r1", "filters", "id", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "onToggleAllClick", "\u0275\u0275elementEnd", "\u0275\u0275advance", "selectionManager", "areAllCurrentItemsSelected", "\u0275\u0275text", "\u0275\u0275textInterpolate", "sort_r5", "sortOrder", "_r4", "ngIf", "toggleSortOrder", "\u0275\u0275template", "CollectionDataTableComponent_th_8_div_5_clr_icon_2_Template", "CollectionDataTableComponent_th_8_div_5_clr_icon_3_Template", "CollectionDataTableComponent_th_8_div_5_clr_icon_4_Template", "CollectionDataTableComponent_th_8_div_5_div_5_Template", "\u0275\u0275classProp", "CollectionDataTableComponent_th_8_div_5_Template", "column_r6", "expand", "align", "heading", "sort", "\u0275\u0275elementContainer", "activeFilter_r8", "\u0275\u0275elementContainerStart", "CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_2_Template", "CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_3_Template", "activeFilters", "length", "_r7", "toggleSearchFilterRow", "CollectionDataTableComponent_tr_13_ng_container_6_Template", "CollectionDataTableComponent_tr_13_ng_container_7_Template", "CollectionDataTableComponent_tr_13_ng_container_8_Template", "showSearchFilterRow", "\u0275\u0275pipeBind1", "searchComponent", "template", "customSearchTemplate", "collectionRowTmp_r11", "\u0275\u0275pureFunction2", "_c4", "item_r9", "i_r10", "emptyStateLabel", "$event", "_r12", "itemsPerPageChange", "emit", "itemsPerPage", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind2", "\u0275\u0275pureFunction3", "_c5", "currentStart", "currentEnd", "totalItems", "_r13", "pageChange", "currentPage", "_r14", "item_r15", "item", "onRowClick", "activeIndex", "absoluteIndex", "isSelected", "CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_ng_container_1_Template", "componentConfig_r16", "config", "component", "\u0275\u0275pureFunction1", "_c7", "injector", "CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_ng_container_0_Template", "column_r17", "_c8", "depth_r19", "CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_Template", "CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_Template", "\u0275\u0275templateRefExtractor", "customComponents", "get", "defaultComponent_r20", "CollectionDataTableComponent_ng_template_23_ng_container_5_ng_container_1_Template", "subCollection_r21", "CollectionDataTableComponent_ng_template_23_td_2_Template", "CollectionDataTableComponent_ng_template_23_td_3_Template", "CollectionDataTableComponent_ng_template_23_ng_container_5_Template", "_c6", "visibleSortedColumns", "getSubcollections", "CollectionDataTableComponent", "DataTable2Component", "constructor", "changeDetectorRef", "dataService", "changeOrder", "EventEmitter", "dragRefs", "sortPredicate", "index", "dropList", "getSortedItems", "data", "collection", "parentId", "ngOnChanges", "changes", "subCollections", "items", "allCollections", "push", "subCollectionMatches", "flat", "forEach", "ngAfterViewInit", "collectionRowList", "subscribe", "val", "removeItem", "ref", "toArray", "dropContainer", "_dragRef", "_withDropContainer", "_dropListRef", "addItem", "filter", "c", "onDrop", "event", "isTopLevel", "breadcrumbs", "pageIndexOffset", "parentIndex", "findIndex", "i", "adjustedIndex", "currentIndex", "collectionId", "splice", "previousIndex", "parent", "find", "adjustedPreviousIndex", "markForCheck", "\u0275\u0275directiveInject", "ChangeDetectorRef", "DataService", "selectors", "viewQuery", "rf", "ctx", "CdkDropList", "CdkDrag", "CollectionDataTableComponent_vdr_data_table_filter_presets_0_Template", "\u0275\u0275projection", "CollectionDataTableComponent_th_7_Template", "CollectionDataTableComponent_th_8_Template", "i0", "_r1", "onColumnReorder", "onColumnsReset", "CollectionDataTableComponent_tr_13_Template", "CollectionDataTableComponent_ng_container_15_Template", "CollectionDataTableComponent_tr_18_Template", "CollectionDataTableComponent_vdr_items_per_page_controls_20_Template", "CollectionDataTableComponent_div_21_Template", "CollectionDataTableComponent_vdr_pagination_controls_22_Template", "CollectionDataTableComponent_ng_template_23_Template", "disableSelect", "selection", "uiLanguage$", "sortedColumns", "\u0275\u0275pureFunction4", "_c3", "trackByFn", "bind", "import_normalize_string", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "create", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "detailForm", "invalid", "pristine", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "_r4", "save", "assetsChanged", "\u0275\u0275template", "CollectionDetailComponent_ng_template_11_button_0_Template", "updatePermission", "\u0275\u0275elementContainerStart", "\u0275\u0275textInterpolate", "\u0275\u0275element", "entity_r5", "\u0275\u0275pureFunction0", "_c2", "\u0275\u0275pureFunction1", "_c3", "breadcrumb_r6", "id", "name", "CollectionDetailComponent_vdr_page_block_29_li_3_a_1_Template", "CollectionDetailComponent_vdr_page_block_29_li_3_a_2_Template", "CollectionDetailComponent_vdr_page_block_29_li_3_ng_container_3_Template", "isFirst_r7", "isLast_r8", "CollectionDetailComponent_vdr_page_block_29_li_3_Template", "entity_r9", "breadcrumbs", "customFields", "get", "i_r11", "_r10", "index", "removeFilter", "filter_r12", "getFilterDefinition", "filter_r14", "_r13", "$implicit", "addFilter", "description", "CollectionDetailComponent_div_65_button_9_Template", "allFilters", "_r15", "toggleLivePreview", "\u0275\u0275textInterpolate2", "\u0275\u0275pipeBind2", "_c4", "count_r16", "\u0275\u0275classProp", "tmp_7_0", "_c5", "tmp_9_0", "livePreview", "COLLECTION_DETAIL_QUERY", "gql", "COLLECTION_FRAGMENT", "CollectionDetailComponent", "TypedBaseDetailComponent", "constructor", "changeDetector", "dataService", "formBuilder", "notificationService", "modalService", "localStorageService", "getCustomFieldConfig", "group", "Validators", "required", "slug", "unicodePatternValidator", "visible", "inheritFilters", "filters", "array", "getCustomFieldsDefaults", "assetChanges", "Permission", "UpdateCatalog", "UpdateCollection", "filterRemoved$", "Subject", "ngOnInit", "init", "collection", "getCollectionFilters", "single$", "subscribe", "res", "collectionFilters", "filtersFormArray", "inheritFiltersControl", "inheritFilters$", "valueChanges", "pipe", "distinctUntilChanged", "updatedFilters$", "merge", "statusChanges", "debounceTime", "filter", "touched", "map", "mapOperationsToInputs", "value", "_filter", "arg", "arguments", "parentId$", "route", "paramMap", "pm", "undefined", "switchMap", "parentId", "of", "entity$", "parent", "ngOnDestroy", "destroy", "find", "f", "code", "Object", "values", "length", "updateSlug", "nameValue", "slugControl", "currentTranslation", "entity", "findTranslation", "languageCode", "currentSlugIsEmpty", "setValue", "normalizeString", "collectionFilter", "filtersArray", "argsHash", "args", "reduce", "output", "__spreadProps", "__spreadValues", "getConfigArgValue", "push", "control", "a", "removeAt", "markAsDirty", "markAsTouched", "splice", "next", "dirty", "input", "getUpdatedCollection", "createdAt", "updatedAt", "isPrivate", "featuredAsset", "assets", "translations", "children", "snapshot", "createCollection", "data", "success", "markAsPristine", "markForCheck", "router", "navigate", "relativeTo", "err", "error", "combineLatest", "languageCode$", "take", "mergeMap", "category", "updateCollection", "contentsComponent", "refresh", "canDeactivate", "set", "trackByFn", "item", "JSON", "stringify", "setFormValues", "patchValue", "formArray", "clear", "forEach", "setCustomFieldFormValues", "form", "updatedCategory", "createUpdatedTranslatable", "translatable", "updatedFields", "customFieldConfig", "defaultTranslation", "assetIds", "featuredAssetId", "operations", "formValueOperations", "o", "i", "entries", "j", "encodeConfigArgValue", "\u0275\u0275directiveInject", "ChangeDetectorRef", "DataService", "FormBuilder", "NotificationService", "ModalService", "LocalStorageService", "selectors", "viewQuery", "rf", "ctx", "$event", "i0", "_r1", "setLanguage", "CollectionDetailComponent_button_9_Template", "CollectionDetailComponent_ng_template_11_Template", "\u0275\u0275templateRefExtractor", "CollectionDetailComponent_ng_container_24_Template", "CollectionDetailComponent_ng_template_25_Template", "CollectionDetailComponent_vdr_card_27_Template", "CollectionDetailComponent_vdr_page_block_29_Template", "target", "CollectionDetailComponent_vdr_card_47_Template", "CollectionDetailComponent_ng_container_60_Template", "CollectionDetailComponent_ng_template_61_Template", "CollectionDetailComponent_ng_container_64_Template", "CollectionDetailComponent_div_65_Template", "CollectionDetailComponent_ng_template_73_Template", "isNew$", "availableLanguages$", "updateButton_r17", "private_r18", "_c1", "noInherit_r19", "CollectionBreadcrumbPipe", "transform", "value", "breadcrumbs", "slice", "pure", "standalone", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "collection_r1", "id", "\u0275\u0275element", "\u0275\u0275classProp", "depth_r3", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r4", "collection_r5", "\u0275\u0275nextContext", "item", "ctx_r5", "\u0275\u0275resetView", "toggleExpanded", "\u0275\u0275template", "MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_1_Template", "MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_2_Template", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "expandedIds", "includes", "MoveCollectionsDialogComponent_ng_template_14_clr_icon_1_Template", "MoveCollectionsDialogComponent_ng_template_14_button_2_Template", "MoveCollectionsDialogComponent_ng_template_14_button_3_Template", "_r2", "resolveWith", "children", "length", "parentId", "\u0275\u0275textInterpolate", "\u0275\u0275pipeBind2", "\u0275\u0275pureFunction1", "_c0", "name", "item_r7", "\u0275\u0275elementContainerStart", "MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_div_1_Template", "breadcrumbs_r8", "MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_Template", "MoveCollectionsDialogComponent_ng_template_17_ng_container_1_span_2_Template", "MoveCollectionsDialogComponent_ng_template_17_ng_container_1_Template", "collection_r9", "collection_r10", "slug", "MoveCollectionsDialogComponent", "constructor", "dataService", "i18nService", "searchTermControl", "FormControl", "currentPage$", "BehaviorSubject", "itemsPerPage$", "expandedIds$", "Subject", "ngOnInit", "getCollectionsResult", "collection", "getCollections", "searchTerm$", "valueChanges", "pipe", "debounceTime", "distinctUntilChanged", "startWith", "combineLatest", "subscribe", "searchTerm", "currentPage", "itemsPerPage", "topLevelOnly", "ref", "refetch", "options", "skip", "take", "filter", "contains", "rootCollectionId$", "mapSingle", "data", "collections", "items", "items$", "mapStream", "map", "rootCollectionId", "translate", "position", "featuredAsset", "breadcrumbs", "isPrivate", "createdAt", "updatedAt", "totalItems$", "totalItems", "subCollections$", "tap", "val", "switchMap", "ids", "in", "of", "push", "next", "\u0275\u0275directiveInject", "DataService", "I18nService", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "MoveCollectionsDialogComponent_ng_template_0_Template", "$event", "MoveCollectionsDialogComponent_ng_template_11_Template", "MoveCollectionsDialogComponent_ng_template_14_Template", "MoveCollectionsDialogComponent_ng_template_17_Template", "MoveCollectionsDialogComponent_ng_template_20_Template", "deleteCollectionsBulkAction", "createBulkDeleteAction", "location", "requiresPermission", "userPermissions", "includes", "Permission", "DeleteCollection", "DeleteCatalog", "getItemName", "item", "name", "bulkDelete", "dataService", "ids", "collection", "deleteCollections", "pipe", "map", "res", "moveCollectionsBulkAction", "label", "icon", "UpdateCatalog", "UpdateCollection", "onClick", "injector", "selection", "hostComponent", "clearSelection", "modalService", "get", "ModalService", "DataService", "notificationService", "NotificationService", "fromComponent", "MoveCollectionsDialogComponent", "size", "closable", "switchMap", "result", "inputs", "c", "collectionId", "id", "parentId", "index", "moveCollection", "EMPTY", "subscribe", "success", "count", "length", "refresh", "assignCollectionsToChannelBulkAction", "createBulkAssignToChannelAction", "bulkAssignToChannel", "collectionIds", "channelIds", "channelId", "assignCollectionsToChannel", "removeCollectionsFromChannelBulkAction", "createBulkRemoveFromChannelAction", "bulkRemoveFromChannel", "removeCollectionsFromChannel", "duplicateCollectionsBulkAction", "DuplicateEntityDialogComponent", "locals", "entities", "entityName", "title", "getEntityName", "entity", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pureFunction0", "_c1", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "collection_r3", "id", "\u0275\u0275pipeBind2", "collection_r4", "createdAt", "collection_r5", "updatedAt", "collection_r6", "position", "\u0275\u0275classProp", "depth_r7", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r8", "collection_r9", "\u0275\u0275nextContext", "item", "ctx_r1", "\u0275\u0275resetView", "toggleExpanded", "\u0275\u0275template", "CollectionListComponent_ng_template_12_ng_template_24_button_2_clr_icon_1_Template", "CollectionListComponent_ng_template_12_ng_template_24_button_2_clr_icon_2_Template", "expandedIds", "includes", "CollectionListComponent_ng_template_12_ng_template_24_clr_icon_1_Template", "CollectionListComponent_ng_template_12_ng_template_24_button_2_Template", "children", "length", "\u0275\u0275pureFunction1", "_c2", "\u0275\u0275textInterpolate", "name", "item_r10", "\u0275\u0275elementContainerStart", "CollectionListComponent_ng_template_12_ng_template_27_ng_container_1_ng_container_1_div_1_Template", "breadcrumbs_r11", "CollectionListComponent_ng_template_12_ng_template_27_ng_container_1_ng_container_1_Template", "CollectionListComponent_ng_template_12_ng_template_27_ng_container_1_span_2_Template", "CollectionListComponent_ng_template_12_ng_template_27_ng_container_1_Template", "collection_r12", "collection_r13", "slug", "CollectionListComponent_ng_template_12_ng_template_33_vdr_chip_0_Template", "CollectionListComponent_ng_template_12_ng_template_33_vdr_chip_1_Template", "collection_r14", "isPrivate", "_c3", "collection_r15", "_c4", "customField_r16", "sorts", "$event", "_r1", "setPageNumber", "setItemsPerPage", "onRearrange", "setVisibleColumns", "CollectionListComponent_ng_template_12_ng_template_12_Template", "CollectionListComponent_ng_template_12_ng_template_15_Template", "CollectionListComponent_ng_template_12_ng_template_18_Template", "CollectionListComponent_ng_template_12_ng_template_21_Template", "CollectionListComponent_ng_template_12_ng_template_24_Template", "CollectionListComponent_ng_template_12_ng_template_27_Template", "CollectionListComponent_ng_template_12_ng_template_30_Template", "CollectionListComponent_ng_template_12_ng_template_33_Template", "CollectionListComponent_ng_template_12_ng_template_36_Template", "CollectionListComponent_ng_template_12_vdr_dt2_custom_field_column_37_Template", "dataTableListId", "items$", "subCollections$", "itemsPerPage$", "totalItems$", "currentPage$", "filters", "activeCollectionIndex$", "selectionManager", "searchTermControl", "get", "customFields", "activeCollectionId$", "CollectionListComponent_ng_template_13_ng_container_0_Template", "CollectionListComponent", "TypedBaseListComponent", "constructor", "dataService", "notificationService", "getCustomFieldConfig", "createFilterCollection", "addIdFilter", "addDateFilters", "addFilter", "label", "type", "kind", "filterField", "toFilterInput", "value", "eq", "addCustomFieldFilters", "connectToRoute", "route", "createSortCollection", "defaultSort", "addSort", "addCustomFieldSorts", "configure", "document", "GetCollectionListDocument", "getItems", "data", "collections", "setVariables", "skip", "_take", "topLevelOnly", "activeFilters", "undefined", "options", "take", "filter", "__spreadValues", "contains", "createFilterInput", "sort", "createSortInput", "refreshListOnChanges", "valueChanges", "ngOnInit", "paramMap", "pipe", "map", "pm", "distinctUntilChanged", "expandedIds$", "queryParamMap", "qpm", "ids", "split", "takeUntil", "destroy$", "subscribe", "combineLatest", "refresh$", "switchMap", "collection", "getCollections", "parentId", "in", "mapStream", "items", "of", "activeCollectionTitle$", "subCollections", "match", "find", "c", "allCollections", "push", "subCollectionMatches", "findIndex", "event", "moveCollection", "next", "success", "refresh", "error", "err", "closeContents", "params", "snapshot", "contents", "router", "navigate", "relativeTo", "queryParamsHandling", "setLanguage", "code", "client", "setContentLanguage", "queryParams", "expanded", "join", "\u0275\u0275directiveInject", "DataService", "NotificationService", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "CollectionListComponent_a_8_Template", "CollectionListComponent_ng_template_12_Template", "CollectionListComponent_ng_template_13_Template", "availableLanguages$", "contentLanguage$", "_c0", "CollectionTreeService", "constructor", "allMoveListItems", "_rearrange$", "Subject", "_delete$", "rearrange$", "asObservable", "delete$", "ngOnDestroy", "complete", "setCollectionTree", "tree", "collectionTree", "resetMoveList", "getMoveListItems", "collection", "length", "calculateAllMoveListItems", "filter", "item", "id", "ancestorIdPath", "has", "parent", "onDrop", "event", "data", "newParentId", "container", "Error", "next", "collectionId", "parentId", "index", "currentIndex", "onMove", "onDelete", "visit", "node", "parentPath", "output", "path", "concat", "name", "push", "slice", "join", "children", "forEach", "child", "Set", "factory", "\u0275fac", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r5", "collection_r3", "\u0275\u0275nextContext", "$implicit", "ctx_r3", "\u0275\u0275resetView", "toggleExpanded", "\u0275\u0275template", "CollectionTreeNodeComponent_div_3_button_5_clr_icon_1_Template", "CollectionTreeNodeComponent_div_3_button_5_clr_icon_2_Template", "\u0275\u0275elementEnd", "\u0275\u0275property", "expandAll", "\u0275\u0275advance", "expanded", "\u0275\u0275text", "\u0275\u0275textInterpolate", "\u0275\u0275pipeBind1", "\u0275\u0275pureFunction1", "_c6", "_c5", "id", "\u0275\u0275textInterpolate1", "item_r10", "_r9", "move", "hasUpdatePermission$", "path", "activeCollectionId", "selectionManager", "$event", "_r2", "toggleSelection", "CollectionTreeNodeComponent_div_3_button_5_Template", "CollectionTreeNodeComponent_div_3_ng_template_6_Template", "\u0275\u0275templateRefExtractor", "CollectionTreeNodeComponent_div_3_vdr_chip_10_Template", "CollectionTreeNodeComponent_div_3_div_19_Template", "getMoveListItems", "CollectionTreeNodeComponent_div_3_a_24_Template", "ctx_r5", "i_r7", "index", "moveUp", "ctx_r7", "moveDown", "CollectionTreeNodeComponent_div_3_button_39_Template", "delete", "CollectionTreeNodeComponent_div_3_vdr_collection_tree_node_46_Template", "\u0275\u0275classProp", "isPrivate", "depth", "isSelected", "children", "length", "folderSpacer_r11", "name", "_c1", "_c0", "_c2", "\u0275\u0275pureFunction0", "_c3", "_c4", "collectionTree", "moveListItems", "hasDeletePermission$", "CollectionTreeNodeComponent", "constructor", "parent", "dataService", "collectionTreeService", "router", "route", "changeDetectorRef", "ngOnInit", "parentName", "permissions$", "client", "userStatus", "mapStream", "data", "permissions", "pipe", "shareReplay", "map", "perms", "includes", "Permission", "UpdateCatalog", "UpdateCollection", "DeleteCatalog", "DeleteCollection", "subscription", "selectionChanges$", "subscribe", "markForCheck", "ngOnChanges", "changes", "expandAllChange", "previousValue", "currentValue", "forEach", "c", "ngOnDestroy", "unsubscribe", "trackByFn", "item", "collection", "expandedIds", "snapshot", "queryParamMap", "get", "split", "push", "filter", "navigate", "queryParams", "join", "queryParamsHandling", "relativeTo", "parentId", "onMove", "collectionId", "currentIndex", "drop", "event", "moveItemInArray", "previousIndex", "onDrop", "onDelete", "\u0275\u0275directiveInject", "DataService", "CollectionTreeService", "Router", "ActivatedRoute", "ChangeDetectorRef", "selectors", "inputs", "standalone", "features", "\u0275\u0275NgOnChangesFeature", "decls", "vars", "consts", "template", "rf", "ctx", "i0", "_r1", "CollectionTreeNodeComponent_div_3_Template", "AsyncPipe", "TranslatePipe", "styles", "changeDetection", "arrayToTree", "nodes", "currentState", "expandedIds", "topLevelNodes", "mappedArr", "currentStateMap", "treeToMap", "node", "id", "__spreadProps", "__spreadValues", "children", "map", "n", "hasOwnProperty", "mappedElem", "expanded", "get", "includes", "parent", "push", "length", "undefined", "tree", "nodeMap", "Map", "visit", "set", "forEach", "\u0275\u0275element", "\u0275\u0275property", "ctx_r0", "expandAll", "collectionTree", "selectionManager", "activeCollectionId", "CollectionTreeComponent", "constructor", "collectionTreeService", "expandedIds", "rearrange", "EventEmitter", "deleteCollection", "ngOnChanges", "changes", "collections", "arrayToTree", "setCollectionTree", "resetMoveList", "ngOnInit", "rearrange$", "subscribe", "event", "emit", "delete$", "id", "\u0275\u0275directiveInject", "CollectionTreeService", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275ProvidersFeature", "\u0275\u0275NgOnChangesFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "CollectionTreeComponent_vdr_collection_tree_node_0_Template", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate2", "variant_r1", "name", "sku", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "confirm", "\u0275\u0275textInterpolate", "ConfirmVariantDeletionDialogComponent", "constructor", "variants", "resolveWith", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "ConfirmVariantDeletionDialogComponent_ng_template_0_Template", "ConfirmVariantDeletionDialogComponent_li_4_Template", "ConfirmVariantDeletionDialogComponent_ng_template_5_Template", "\u0275\u0275property", "import_normalize_string", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "\u0275\u0275elementEnd", "confirm", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "\u0275\u0275property", "form", "invalid", "CreateFacetValueDialogComponent", "constructor", "formBuilder", "group", "name", "Validators", "required", "code", "updateCode", "nameControl", "get", "codeControl", "pristine", "setValue", "normalizeString", "value", "resolveWith", "facetId", "translations", "languageCode", "\u0275\u0275directiveInject", "FormBuilder", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "CreateFacetValueDialogComponent_ng_template_0_Template", "\u0275\u0275element", "CreateFacetValueDialogComponent_ng_template_8_Template", "import_generated_types", "import_normalize_string", "import_shared_utils", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "create", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "detailForm", "invalid", "pristine", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "_r4", "save", "\u0275\u0275template", "FacetDetailComponent_ng_template_11_button_0_Template", "updatePermission", "\u0275\u0275elementContainerStart", "\u0275\u0275textInterpolate", "\u0275\u0275element", "entity_r5", "customFields", "get", "filterControl", "customValueFields", "\u0275\u0275pureFunction1", "_c3", "value_r8", "id", "$event", "_r7", "$implicit", "updateValueCode", "code", "target", "value", "FacetDetailComponent_vdr_card_43_ng_container_3_tr_14_td_8_Template", "deleteFacetValue", "_c2", "length", "FacetDetailComponent_vdr_card_43_ng_container_3_ng_container_11_Template", "FacetDetailComponent_vdr_card_43_ng_container_3_tr_14_Template", "_r6", "setItemsPerPage", "setCurrentPage", "\u0275\u0275pipeBind2", "filteredValues_r9", "\u0275\u0275pureFunction3", "_c1", "currentPage", "itemsPerPage", "totalItems", "_r10", "addFacetValue", "FacetDetailComponent_vdr_card_43_ng_template_2_Template", "FacetDetailComponent_vdr_card_43_ng_container_3_Template", "FacetDetailComponent_vdr_card_43_button_6_Template", "values$", "\u0275\u0275pureFunction0", "_c0", "FACET_DETAIL_QUERY", "gql", "FACET_WITH_VALUE_LIST_FRAGMENT", "FacetDetailComponent", "TypedBaseDetailComponent", "constructor", "changeDetector", "dataService", "formBuilder", "notificationService", "modalService", "getCustomFieldConfig", "group", "facet", "Validators", "required", "name", "visible", "getCustomFieldsDefaults", "values", "record", "FormControl", "BehaviorSubject", "Permission", "UpdateCatalog", "UpdateFacet", "ngOnInit", "init", "valueChanges", "pipe", "debounceTime", "takeUntil", "destroy$", "subscribe", "filterTerm", "fetchFacetValues", "ngOnDestroy", "destroy", "updateCode", "currentCode", "nameValue", "codeControl", "setValue", "normalizeString", "valueId", "customValueFieldIsSet", "index", "fromComponent", "CreateFacetValueDialogComponent", "locals", "languageCode", "facetId", "switchMap", "result", "createFacetValues", "EMPTY", "success", "entity", "facetForm", "dirty", "newFacet", "getUpdatedFacet", "createdAt", "updatedAt", "isPrivate", "translations", "createFacet", "data", "markAsPristine", "markForCheck", "router", "navigate", "relativeTo", "route", "err", "error", "valuesFormRecord", "combineLatest", "entity$", "languageCode$", "take", "mergeMap", "updateOperations", "updatedFacetInput", "push", "updateFacet", "updatedValues", "getUpdatedFacetValues", "updateFacetValues", "forkJoin", "facetValueId", "showModalAndDelete", "response", "DeletionResult", "DELETED", "message", "map", "r", "deleted", "query", "GetFacetDetailDocument", "single$", "dialog", "title", "body", "buttons", "type", "label", "returnValue", "deleteFacetValues", "newPage", "facetValueListOptions", "__spreadValues", "skip", "sort", "SortOrder", "DESC", "filter", "contains", "next", "valueList", "items", "setFacetValueFormValues", "setFormValues", "currentTranslation", "findTranslation", "patchValue", "setCustomFieldFormValues", "currentValuesFormGroup", "forEach", "valueTranslation", "valueControl", "addControl", "customValueFieldsGroup", "UntypedFormGroup", "fieldDef", "key", "fieldValue", "control", "UntypedFormControl", "facetFormGroup", "input", "createUpdatedTranslatable", "translatable", "updatedFields", "customFieldConfig", "defaultTranslation", "valuesFormGroup", "Object", "controls", "c", "i", "notNullOrUndefined", "\u0275\u0275directiveInject", "ChangeDetectorRef", "DataService", "FormBuilder", "NotificationService", "ModalService", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "i0", "_r1", "setLanguage", "FacetDetailComponent_button_9_Template", "FacetDetailComponent_ng_template_11_Template", "\u0275\u0275templateRefExtractor", "FacetDetailComponent_ng_container_24_Template", "FacetDetailComponent_ng_template_25_Template", "FacetDetailComponent_vdr_page_entity_info_28_Template", "FacetDetailComponent_vdr_card_41_Template", "FacetDetailComponent_vdr_card_43_Template", "isNew$", "availableLanguages$", "updateButton_r11", "private_r12", "import_unique", "deleteFacetsBulkAction", "createBulkDeleteAction", "location", "requiresPermission", "userPermissions", "includes", "Permission", "DeleteFacet", "DeleteCatalog", "getItemName", "item", "name", "shouldRetryItem", "response", "message", "bulkDelete", "dataService", "ids", "retrying", "facet", "deleteFacets", "pipe", "map", "res", "assignFacetsToChannelBulkAction", "createBulkAssignToChannelAction", "UpdateCatalog", "UpdateFacet", "bulkAssignToChannel", "facetIds", "channelIds", "channelId", "assignFacetsToChannel", "removeFacetsFromChannelBulkAction", "createBulkRemoveFromChannelAction", "bulkRemoveFromChannel", "removeFacetsFromChannel", "force", "isErrorResult", "result", "__typename", "undefined", "removeFacetsFromChannelBulkAction2", "label", "getTranslationVars", "injector", "getChannelCodeFromUserStatus", "get", "DataService", "icon", "iconClass", "isVisible", "currentChannelIsNotDefault", "onClick", "selection", "hostComponent", "clearSelection", "modalService", "ModalService", "notificationService", "NotificationService", "activeChannelId$", "client", "userStatus", "mapSingle", "activeChannelId", "showModalAndDelete", "dialog", "title", "translationVars", "count", "length", "size", "body", "buttons", "type", "returnValue", "switchMap", "EMPTY", "res2", "unique", "f", "id", "removedCount", "errors", "errorIds", "i", "push", "join", "result2", "notRemovedCount", "filter", "r", "of", "then", "channelCode", "subscribe", "refresh", "success", "duplicateFacetsBulkAction", "fromComponent", "DuplicateEntityDialogComponent", "locals", "entities", "entityName", "getEntityName", "entity", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pureFunction0", "_c1", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "facet_r1", "id", "\u0275\u0275pipeBind2", "facet_r2", "createdAt", "facet_r3", "updatedAt", "\u0275\u0275pureFunction1", "_c2", "facet_r4", "\u0275\u0275textInterpolate", "name", "facet_r5", "code", "\u0275\u0275template", "FacetListComponent_ng_template_35_vdr_chip_0_Template", "FacetListComponent_ng_template_35_vdr_chip_1_Template", "facet_r6", "isPrivate", "value_r7", "facet_r8", "valueList", "totalItems", "items", "length", "\u0275\u0275elementContainerStart", "ctx_r9", "initialLimit", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r9", "\u0275\u0275nextContext", "item", "\u0275\u0275resetView", "toggleDisplayLimit", "FacetListComponent_ng_template_38_button_4_ng_container_1_Template", "FacetListComponent_ng_template_38_button_4_ng_template_2_Template", "\u0275\u0275templateRefExtractor", "displayLimit", "collapse_r11", "FacetListComponent_ng_template_38_vdr_facet_value_chip_1_Template", "FacetListComponent_ng_template_38_vdr_chip_3_Template", "FacetListComponent_ng_template_38_button_4_Template", "\u0275\u0275pipeBind3", "customField_r12", "sorts", "FACET_LIST_QUERY", "gql", "FACET_WITH_VALUE_LIST_FRAGMENT", "FacetListComponent", "TypedBaseListComponent", "constructor", "dataService", "dataTableListId", "customFields", "getCustomFieldConfig", "filters", "createFilterCollection", "addIdFilter", "addDateFilters", "addFilter", "type", "kind", "label", "toFilterInput", "value", "eq", "addCustomFieldFilters", "connectToRoute", "route", "createSortCollection", "defaultSort", "addSort", "addCustomFieldSorts", "configure", "document", "GetFacetListDocument", "getItems", "data", "facets", "setVariables", "skip", "take", "options", "filter", "__spreadValues", "contains", "searchTermControl", "createFilterInput", "sort", "createSortInput", "facetValueListOptions", "refreshListOnChanges", "valueChanges", "facet", "setLanguage", "client", "setContentLanguage", "subscribe", "\u0275\u0275directiveInject", "DataService", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "$event", "FacetListComponent_a_8_Template", "setPageNumber", "setItemsPerPage", "setVisibleColumns", "FacetListComponent_ng_template_20_Template", "FacetListComponent_ng_template_23_Template", "FacetListComponent_ng_template_26_Template", "FacetListComponent_ng_template_29_Template", "FacetListComponent_ng_template_32_Template", "FacetListComponent_ng_template_35_Template", "FacetListComponent_ng_template_38_Template", "FacetListComponent_vdr_dt2_custom_field_column_39_Template", "availableLanguages$", "contentLanguage$", "_c0", "items$", "itemsPerPage$", "totalItems$", "currentPage$", "selectionManager", "get", "import_shared_utils", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275twoWayListener", "$event", "group_r2", "\u0275\u0275restoreView", "_r1", "$implicit", "i0", "\u0275\u0275twoWayBindingSet", "name", "\u0275\u0275resetView", "\u0275\u0275listener", "optionValueInputComponent_r3", "\u0275\u0275reference", "ctx_r3", "\u0275\u0275nextContext", "handleEnter", "values", "generateVariants", "removeOption", "\u0275\u0275element", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "\u0275\u0275pipeBind1", "\u0275\u0275twoWayProperty", "\u0275\u0275property", "\u0275\u0275textInterpolate1", "location_r6", "id", "_r5", "selectedStockLocationId", "\u0275\u0275template", "GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_option_3_Template", "stockLocations_r7", "variant_r8", "join", "GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_1_Template", "GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_2_Template", "\u0275\u0275classProp", "variantFormValues", "value", "enabled", "variants", "length", "currencyCode", "GenerateProductVariantsComponent_ng_container_5_div_4_th_4_Template", "GenerateProductVariantsComponent_ng_container_5_div_4_th_5_Template", "GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_Template", "trackByFn", "\u0275\u0275elementContainerStart", "GenerateProductVariantsComponent_ng_container_5_clr_alert_1_Template", "GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_Template", "GenerateProductVariantsComponent_ng_container_5_div_4_Template", "DEFAULT_VARIANT_CODE", "GenerateProductVariantsComponent", "constructor", "dataService", "formBuilder", "variantsChange", "EventEmitter", "optionGroups", "ngOnInit", "settings", "getActiveChannel", "single$", "subscribe", "data", "activeChannel", "defaultCurrencyCode", "stockLocations$", "query", "GetStockLocationListDocument", "options", "take", "refetchOnChannelChange", "mapStream", "stockLocations", "items", "pipe", "tap", "onFormChange", "addOption", "push", "index", "setTimeout", "groupNameInputs", "get", "nativeElement", "focus", "filter", "g", "groups", "reduce", "sum", "group", "map", "v", "generateAllCombinations", "forEach", "variant", "formGroup", "nonNullable", "optionValues", "price", "copyFromDefault", "sku", "stock", "valueChanges", "copyValuesToPristine", "event", "optionValueInputComponent", "preventDefault", "stopPropagation", "field", "formControl", "Object", "correspondingFormControl", "pristine", "setValue", "emitEvent", "variantsToCreate", "emit", "og", "stockLocationId", "variantId", "prop", "\u0275\u0275directiveInject", "DataService", "FormBuilder", "selectors", "viewQuery", "rf", "ctx", "ElementRef", "GenerateProductVariantsComponent_div_0_Template", "GenerateProductVariantsComponent_ng_container_5_Template", "import_normalize_string", "import_shared_constants", "import_unique", "\u0275\u0275elementStart", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "setLanguage", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pipeBind1", "availableLanguages$", "contentLanguage$", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "variant_r3", "id", "\u0275\u0275pipeBind2", "variant_r4", "createdAt", "variant_r5", "updatedAt", "\u0275\u0275element", "asset_r6", "\u0275\u0275sanitizeUrl", "\u0275\u0275template", "ProductVariantListComponent_ng_template_26_img_1_Template", "ProductVariantListComponent_ng_template_26_ng_template_2_Template", "\u0275\u0275templateRefExtractor", "\u0275\u0275advance", "variant_r7", "featuredAsset", "imagePlaceholder_r8", "\u0275\u0275pureFunction2", "_c0", "variant_r9", "productId", "\u0275\u0275textInterpolate", "name", "variant_r10", "sku", "ProductVariantListComponent_ng_template_35_vdr_chip_0_Template", "ProductVariantListComponent_ng_template_35_vdr_chip_1_Template", "variant_r11", "enabled", "variant_r12", "price", "currencyCode", "variant_r13", "priceWithTax", "stockLevel_r14", "stockAllocated", "ProductVariantListComponent_ng_template_44_vdr_chip_0_span_4_Template", "stockLocation", "stockOnHand", "ProductVariantListComponent_ng_template_44_vdr_chip_0_Template", "variant_r15", "stockLevels", "field_r16", "sorts", "ProductVariantListComponent", "TypedBaseListComponent", "constructor", "hideLanguageSelect", "pageLocationId", "customFields", "getCustomFieldConfig", "filters", "createFilterCollection", "addIdFilter", "addDateFilters", "addFilters", "type", "kind", "label", "filterField", "inputType", "addCustomFieldFilters", "connectToRoute", "route", "createSortCollection", "addSorts", "addCustomFieldSorts", "configure", "document", "ProductVariantListQueryDocument", "getItems", "data", "productVariants", "setVariables", "skip", "take", "searchTerm", "searchTermControl", "value", "filterParam", "_and", "filterInput", "createFilterInput", "Object", "keys", "length", "push", "_or", "contains", "eq", "options", "filter", "sort", "createSortInput", "refreshListOnChanges", "valueChanges", "selectors", "inputs", "dataTableId", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "ProductVariantListComponent_vdr_language_selector_3_Template", "setPageNumber", "setItemsPerPage", "ProductVariantListComponent_ng_template_17_Template", "ProductVariantListComponent_ng_template_20_Template", "ProductVariantListComponent_ng_template_23_Template", "ProductVariantListComponent_ng_template_26_Template", "ProductVariantListComponent_ng_template_29_Template", "ProductVariantListComponent_ng_template_32_Template", "ProductVariantListComponent_ng_template_35_Template", "ProductVariantListComponent_ng_template_38_Template", "ProductVariantListComponent_ng_template_41_Template", "ProductVariantListComponent_ng_template_44_Template", "ProductVariantListComponent_vdr_dt2_custom_field_column_45_Template", "items$", "itemsPerPage$", "totalItems$", "currentPage$", "selectionManager", "get", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "create", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "detailForm", "invalid", "pristine", "createVariantsConfig", "variants", "length", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "_r4", "save", "assetsChanged", "\u0275\u0275template", "ProductDetailComponent_ng_template_12_button_0_Template", "updatePermissions", "\u0275\u0275element", "get", "\u0275\u0275pureFunction0", "_c2", "\u0275\u0275textInterpolate", "_r6", "channel_r7", "$implicit", "removeFromChannel", "id", "code", "\u0275\u0275elementContainerStart", "ProductDetailComponent_ng_container_22_vdr_card_1_vdr_form_item_2_ng_container_3_vdr_chip_1_Template", "isDefaultChannel", "ProductDetailComponent_ng_container_22_vdr_card_1_vdr_form_item_2_ng_container_3_Template", "_r5", "assignToChannel", "productChannels$", "ProductDetailComponent_ng_container_22_vdr_card_1_vdr_form_item_2_Template", "ProductDetailComponent_ng_container_22_vdr_card_1_Template", "optionGroup_r8", "name", "_c3", "ProductDetailComponent_vdr_card_24_vdr_chip_3_Template", "ProductDetailComponent_vdr_card_24_a_6_Template", "\u0275\u0275pipeBind2", "entity", "optionGroups", "facetValue_r10", "_r9", "removeProductFacetValue", "_r11", "selectProductFacetValue", "entity_r12", "customFields", "$event", "_r13", "_c4", "GET_PRODUCT_DETAIL", "gql", "PRODUCT_DETAIL_FRAGMENT", "ProductDetailComponent", "TypedBaseDetailComponent", "constructor", "productDetailService", "formBuilder", "modalService", "notificationService", "dataService", "changeDetector", "getCustomFieldConfig", "group", "enabled", "Validators", "required", "autoUpdateVariantNames", "slug", "unicodePatternValidator", "description", "facetValueIds", "getCustomFieldsDefaults", "assetChanges", "groups", "stockLocationId", "Permission", "UpdateCatalog", "UpdateProduct", "ngOnInit", "init", "productFacetValues$", "isNew$", "pipe", "switchMap", "isNew", "of", "entity$", "map", "product", "facetValues", "formFacetValueIdChanges$", "valueChanges", "distinctUntilChanged", "ids", "facet", "getFacetValues", "filter", "in", "mapSingle", "items", "shareReplay", "facetValues$", "concat", "take", "p", "channels", "ngOnDestroy", "destroy", "channelCode", "DEFAULT_CHANNEL_CODE", "fromComponent", "AssignProductsToChannelDialogComponent", "size", "locals", "productIds", "currentChannelIds", "c", "subscribe", "channelId", "from", "getChannelCodeFromUserStatus", "dialog", "title", "buttons", "type", "label", "translationVars", "returnValue", "response", "removeProductsFromChannel", "EMPTY", "success", "err", "error", "assignVariantToChannel", "variant", "productVariantIds", "removeVariantFromChannel", "removeVariantsFromChannel", "Object", "values", "updateSlug", "nameValue", "slugControl", "currentTranslation", "findTranslation", "languageCode", "undefined", "currentSlugIsEmpty", "setValue", "normalizeString", "displayFacetValueModal", "facetValueIdsControl", "controls", "currentFacetValueIds", "value", "unique", "markAsDirty", "facetValueId", "ApplyFacetDialogComponent", "closable", "v", "productGroup", "dirty", "newProduct", "getUpdatedProduct", "createdAt", "updatedAt", "featuredAsset", "assets", "translations", "createProductWithVariants", "createProductVariants", "productId", "markAsPristine", "router", "navigate", "relativeTo", "route", "console", "combineLatest", "languageCode$", "mergeMap", "productInput", "variantsInput", "updateProduct", "autoUpdate", "result", "updateSlugAfterSave", "markForCheck", "canDeactivate", "setFormValues", "patchValue", "fv", "setCustomFieldFormValues", "productFormGroup", "updatedProduct", "createUpdatedTranslatable", "translatable", "updatedFields", "customFieldConfig", "defaultTranslation", "__spreadProps", "__spreadValues", "assetIds", "a", "featuredAssetId", "results", "firstResult", "isUpdateMutation", "input", "hasOwnProperty", "emitEvent", "\u0275\u0275directiveInject", "ProductDetailService", "FormBuilder", "ModalService", "NotificationService", "DataService", "ChangeDetectorRef", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "i0", "_r1", "setLanguage", "ProductDetailComponent_button_10_Template", "ProductDetailComponent_ng_template_12_Template", "\u0275\u0275templateRefExtractor", "ProductDetailComponent_clr_toggle_wrapper_21_Template", "ProductDetailComponent_ng_container_22_Template", "ProductDetailComponent_vdr_card_24_Template", "ProductDetailComponent_vdr_facet_value_chip_28_Template", "ProductDetailComponent_button_31_Template", "ProductDetailComponent_vdr_card_32_Template", "target", "ProductDetailComponent_div_43_Template", "ProductDetailComponent_vdr_card_55_Template", "ProductDetailComponent_div_63_Template", "ProductDetailComponent_ng_template_65_Template", "ProductDetailComponent_div_67_Template", "availableLanguages$", "updateButton_r14", "tmp_18_0", "_c0", "\u0275\u0275pureFunction1", "_c1", "variantList_r15", "import_unique", "deleteProductsBulkAction", "location", "label", "icon", "iconClass", "requiresPermission", "userPermissions", "includes", "Permission", "DeleteProduct", "DeleteCatalog", "onClick", "injector", "selection", "hostComponent", "clearSelection", "modalService", "get", "ModalService", "dataService", "DataService", "notificationService", "NotificationService", "dialog", "title", "translationVars", "count", "length", "buttons", "type", "returnValue", "pipe", "switchMap", "response", "product", "deleteProducts", "unique", "map", "p", "id", "EMPTY", "subscribe", "result", "deleted", "errors", "item", "DeletionResult", "DELETED", "message", "push", "success", "error", "join", "refresh", "assignProductsToChannelBulkAction", "UpdateCatalog", "UpdateProduct", "isVisible", "isMultiChannel", "fromComponent", "AssignProductsToChannelDialogComponent", "size", "locals", "productIds", "currentChannelIds", "removeProductsFromChannelBulkAction", "createBulkRemoveFromChannelAction", "getItemName", "name", "bulkRemoveFromChannel", "channelId", "removeProductsFromChannel", "res", "assignFacetValuesToProductsBulkAction", "mode", "ids", "BulkAddFacetValuesDialogComponent", "entity", "duplicateProductsBulkAction", "DuplicateEntityDialogComponent", "entities", "entityName", "getEntityName", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pureFunction0", "_c1", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "product_r1", "id", "\u0275\u0275pipeBind2", "product_r2", "createdAt", "product_r3", "updatedAt", "asset_r4", "\u0275\u0275sanitizeUrl", "\u0275\u0275template", "ProductListComponent_ng_template_33_img_1_Template", "ProductListComponent_ng_template_33_ng_template_2_Template", "\u0275\u0275templateRefExtractor", "product_r5", "featuredAsset", "imagePlaceholder_r6", "\u0275\u0275pureFunction1", "_c2", "product_r7", "\u0275\u0275textInterpolate", "name", "product_r8", "slug", "ProductListComponent_ng_template_42_vdr_chip_0_Template", "ProductListComponent_ng_template_42_vdr_chip_1_Template", "product_r9", "enabled", "_c3", "product_r10", "variantList", "totalItems", "customField_r11", "ctx_r11", "sorts", "ProductListComponent", "TypedBaseListComponent", "constructor", "dataService", "modalService", "notificationService", "jobQueueService", "pendingSearchIndexUpdates", "dataTableListId", "pageLocationId", "customFields", "getCustomFieldConfig", "filters", "createFilterCollection", "addIdFilter", "addDateFilters", "addFilters", "type", "kind", "label", "filterField", "addFilter", "component", "FacetValueFormInputComponent", "serializeValue", "value", "map", "v", "join", "deserializeValue", "split", "getLabel", "length", "lastValueFrom", "facet", "getFacetValues", "filter", "in", "mapSingle", "facetValues", "items", "fv", "toFilterInput", "facetValueId", "addCustomFieldFilters", "connectToRoute", "route", "createSortCollection", "defaultSort", "addSorts", "addCustomFieldSorts", "configure", "document", "ProductListQueryDocument", "getItems", "data", "products", "setVariables", "skip", "take", "searchTerm", "searchTermControl", "filterInput", "createFilterInput", "contains", "sku", "options", "__spreadValues", "filterOperator", "LogicalOperator", "OR", "AND", "sort", "createSortInput", "refreshListOnChanges", "valueChanges", "rebuildSearchIndex", "product", "reindex", "subscribe", "info", "addJob", "job", "state", "JobState", "COMPLETED", "time", "Intl", "NumberFormat", "format", "duration", "success", "count", "result", "indexedItemCount", "refresh", "error", "deleteProduct", "productId", "dialog", "title", "buttons", "returnValue", "pipe", "switchMap", "response", "EMPTY", "delay", "entity", "err", "\u0275\u0275directiveInject", "DataService", "ModalService", "NotificationService", "JobQueueService", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "$event", "setLanguage", "ProductListComponent_a_8_Template", "setPageNumber", "setItemsPerPage", "setVisibleColumns", "ProductListComponent_ng_template_24_Template", "ProductListComponent_ng_template_27_Template", "ProductListComponent_ng_template_30_Template", "ProductListComponent_ng_template_33_Template", "ProductListComponent_ng_template_36_Template", "ProductListComponent_ng_template_39_Template", "ProductListComponent_ng_template_42_Template", "ProductListComponent_ng_template_45_Template", "ProductListComponent_vdr_dt2_custom_field_column_46_Template", "availableLanguages$", "contentLanguage$", "_c0", "items$", "itemsPerPage$", "totalItems$", "currentPage$", "selectionManager", "get", "import_pick", "import_unique", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind2", "\u0275\u0275pureFunction1", "_c0", "\u0275\u0275pipeBind1", "ctx_r0", "taxRate$", "\u0275\u0275pureFunction2", "_c1", "grossPrice$", "currencyCode", "VariantPriceDetailComponent", "constructor", "dataService", "priceChange$", "BehaviorSubject", "taxCategoryIdChange$", "ngOnInit", "taxRates$", "settings", "getTaxRatesSimple", "mapStream", "data", "taxRates", "items", "activeChannel$", "getActiveChannel", "refetchOnChannelChange", "activeChannel", "combineLatest", "pipe", "map", "channel", "taxCategoryId", "defaultTaxZone", "applicableRate", "find", "taxRate", "zone", "id", "category", "value", "price", "Math", "round", "ngOnChanges", "changes", "next", "currentValue", "\u0275\u0275directiveInject", "DataService", "selectors", "inputs", "priceIncludesTax", "standalone", "features", "\u0275\u0275NgOnChangesFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "VariantPriceDetailComponent_div_3_Template", "VariantPriceDetailComponent_div_4_Template", "\u0275\u0275textInterpolate", "\u0275\u0275property", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "\u0275\u0275pipeBind1", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind2", "ctx_r0", "variant", "price", "currencyCode", "priceWithTax", "VariantPriceStrategyDetailComponent", "calculatedPriceDiffersFromInputPrice", "defaultPrice", "prices", "find", "p", "channelDefaultCurrencyCode", "channelPriceIncludesTax", "selectors", "inputs", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "VariantPriceStrategyDetailComponent_div_0_Template", "\u0275\u0275text", "\u0275\u0275textInterpolate2", "item_r3", "name", "sku", "\u0275\u0275elementStart", "\u0275\u0275twoWayListener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "i0", "\u0275\u0275twoWayBindingSet", "selectedVariantId", "\u0275\u0275resetView", "\u0275\u0275listener", "onSelect", "\u0275\u0275template", "ProductVariantQuickJumpComponent_ng_select_0_ng_template_3_Template", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pipeBind1", "variants$", "\u0275\u0275twoWayProperty", "searchFn", "GET_PRODUCT_VARIANTS_QUICK_JUMP", "gql", "ProductVariantQuickJumpComponent", "constructor", "dataService", "router", "term", "item", "toLowerCase", "includes", "ngOnInit", "query", "GetProductVariantsQuickJumpDocument", "id", "productId", "mapStream", "data", "product", "variants", "navigate", "then", "undefined", "\u0275\u0275directiveInject", "DataService", "Router", "selectors", "inputs", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "ProductVariantQuickJumpComponent_ng_select_0_Template", "tmp_0_0", "length", "\u0275\u0275elementStart", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "setLanguage", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pipeBind1", "isNew$", "availableLanguages_r3", "languageCode$", "\u0275\u0275elementContainerStart", "\u0275\u0275template", "ProductVariantDetailComponent_ng_container_4_vdr_language_selector_1_Template", "\u0275\u0275advance", "length", "_r4", "save", "\u0275\u0275text", "detailForm", "invalid", "stockLevelsForm", "pricesForm", "pristine", "assetsChanged", "\u0275\u0275textInterpolate1", "\u0275\u0275element", "get", "\u0275\u0275pureFunction0", "_c1", "\u0275\u0275textInterpolate", "optionGroupCode", "option_r6", "groupId", "optionName", "_c2", "ProductVariantDetailComponent_form_11_vdr_card_7_vdr_chip_3_Template", "ProductVariantDetailComponent_form_11_vdr_card_7_a_6_Template", "\u0275\u0275pipeBind2", "variant_r7", "options", "updatePermissions", "facetValue_r9", "_r8", "$implicit", "removeFacetValue", "id", "_r10", "selectFacetValue", "entity_r11", "customFields", "taxCategory_r12", "name", "_r13", "price_r14", "toggleDeletePrice", "value", "currencyCode", "channelDefaultCurrencyCode", "customPriceFields", "_c3", "ProductVariantDetailComponent_form_11_div_43_div_7_Template", "ProductVariantDetailComponent_form_11_div_43_div_10_Template", "undefined", "\u0275\u0275classProp", "delete", "controls", "price", "channelPriceIncludesTax$", "currencyCode_r16", "_r15", "addPriceInCurrency", "ProductVariantDetailComponent_form_11_ng_container_46_div_1_button_8_Template", "unusedCurrencyCodes_r17", "ProductVariantDetailComponent_form_11_ng_container_46_div_1_Template", "stockLevel_r18", "tmp_5_0", "tmp_6_0", "tmp_7_0", "tmp_9_0", "tmp_10_0", "stockLocation_r20", "_r19", "addStockLocation", "ProductVariantDetailComponent_form_11_ng_container_77_div_1_button_8_Template", "unusedStockLocations_r21", "ProductVariantDetailComponent_form_11_ng_container_77_div_1_Template", "ProductVariantDetailComponent_form_11_clr_toggle_wrapper_6_Template", "ProductVariantDetailComponent_form_11_vdr_card_7_Template", "ProductVariantDetailComponent_form_11_vdr_facet_value_chip_11_Template", "ProductVariantDetailComponent_form_11_button_14_Template", "ProductVariantDetailComponent_form_11_vdr_page_entity_info_16_Template", "ProductVariantDetailComponent_form_11_vdr_card_30_Template", "_r5", "assetChanges", "ProductVariantDetailComponent_form_11_option_41_Template", "ProductVariantDetailComponent_form_11_div_43_Template", "ProductVariantDetailComponent_form_11_ng_container_46_Template", "ProductVariantDetailComponent_form_11_div_76_Template", "ProductVariantDetailComponent_form_11_ng_container_77_Template", "_c0", "facetValues$", "entity$", "assets", "featuredAsset", "taxCategories$", "unusedCurrencyCodes$", "GlobalFlag", "TRUE", "FALSE", "INHERIT", "tmp_42_0", "inventoryIsNotTracked", "\u0275\u0275textInterpolate2", "globalOutOfStockThreshold", "unusedStockLocation$", "ProductVariantDetailComponent", "TypedBaseDetailComponent", "constructor", "productDetailService", "formBuilder", "modalService", "notificationService", "dataService", "changeDetector", "Permission", "UpdateCatalog", "UpdateProduct", "getCustomFieldConfig", "customOptionFields", "group", "enabled", "sku", "taxCategoryId", "stockOnHand", "useGlobalOutOfStockThreshold", "outOfStockThreshold", "trackInventory", "facetValueIds", "getCustomFieldsDefaults", "array", "ngOnInit", "init", "settings", "getGlobalSettings", "single$", "subscribe", "globalSettings", "globalTrackInventory", "markForCheck", "result$", "pipe", "map", "data", "taxCategories", "items", "availableCurrencyCodes$", "tap", "activeChannel", "defaultCurrencyCode", "availableCurrencyCodes", "combineLatest", "valueChanges", "prices", "currencyCodes", "filter", "code", "p", "includes", "stockLocations$", "stockLocations", "entity", "usedIds", "stockLevels", "l", "stockLocation", "getActiveChannel", "refetchOnChannelChange", "mapStream", "pricesIncludeTax", "shareReplay", "stockLevels$", "variant", "facetValues", "formFacetValueIdChanges$", "skip", "distinctUntilChanged", "switchMap", "ids", "facet", "getFacetValues", "in", "mapSingle", "concat", "take", "switchMapTo", "ngOnDestroy", "destroy", "push", "deleteFormControl", "setValue", "markAsDirty", "stockLocationId", "stockLocationName", "stockAllocated", "mergeMap", "languageCode", "input", "pick", "getUpdatedVariant", "dirty", "control", "mutate", "ProductVariantUpdateMutationDocument", "result", "markAsPristine", "success", "err", "error", "Object", "values", "formGroup", "optionGroupId", "product", "optionGroups", "find", "g", "option", "translations", "t", "facetValueId", "facetValueIdsControl", "currentFacetValueIds", "displayFacetValueModal", "unique", "fromComponent", "ApplyFacetDialogComponent", "size", "closable", "v", "setFormValues", "variantTranslation", "findTranslation", "fv", "patchValue", "taxCategory", "clear", "stockLevel", "priceForm", "setCustomFieldFormValues", "variantFormGroup", "updatedProduct", "createUpdatedTranslatable", "translatable", "updatedFields", "customFieldConfig", "defaultTranslation", "__spreadProps", "__spreadValues", "assetIds", "a", "featuredAssetId", "\u0275\u0275directiveInject", "ProductDetailService", "FormBuilder", "ModalService", "NotificationService", "DataService", "ChangeDetectorRef", "selectors", "standalone", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "ProductVariantDetailComponent_ng_container_4_Template", "ProductVariantDetailComponent_button_9_Template", "ProductVariantDetailComponent_form_11_Template", "availableLanguages$", "import_unique", "assignProductVariantsToChannelBulkAction", "location", "label", "icon", "requiresPermission", "userPermissions", "includes", "Permission", "UpdateCatalog", "UpdateProduct", "isVisible", "injector", "isMultiChannel", "get", "DataService", "onClick", "selection", "clearSelection", "ModalService", "fromComponent", "AssignProductsToChannelDialogComponent", "size", "locals", "productVariantIds", "unique", "map", "p", "id", "currentChannelIds", "subscribe", "result", "removeProductVariantsFromChannelBulkAction", "createBulkRemoveFromChannelAction", "getItemName", "item", "name", "bulkRemoveFromChannel", "dataService", "ids", "channelId", "product", "removeVariantsFromChannel", "pipe", "res", "removeProductVariantsFromChannel", "deleteProductVariantsBulkAction", "iconClass", "DeleteProduct", "DeleteCatalog", "hostComponent", "modalService", "notificationService", "NotificationService", "dialog", "title", "translationVars", "count", "length", "buttons", "type", "returnValue", "switchMap", "response", "deleteProductVariants", "EMPTY", "deleted", "errors", "DeletionResult", "DELETED", "message", "push", "success", "error", "join", "refresh", "assignFacetValuesToProductVariantsBulkAction", "mode", "BulkAddFacetValuesDialogComponent", "entity", "\u0275\u0275elementContainerStart", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "optionGroup_r1", "name", "\u0275\u0275element", "\u0275\u0275property", "\u0275\u0275pipeBind2", "featuredAsset_r2", "\u0275\u0275sanitizeUrl", "\u0275\u0275styleProp", "\u0275\u0275pipeBind1", "ctx_r4", "optionGroupName", "option_r3", "groupId", "\u0275\u0275classProp", "formGroup_r4", "get", "value", "\u0275\u0275textInterpolate1", "variant_r6", "currencyCode", "updatePermission", "\u0275\u0275template", "ProductVariantsTableComponent_tr_22_ng_container_1_img_4_Template", "ProductVariantsTableComponent_tr_22_ng_container_1_ng_template_5_Template", "\u0275\u0275templateRefExtractor", "ProductVariantsTableComponent_tr_22_ng_container_1_ng_container_17_Template", "ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_21_Template", "ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_22_Template", "getFeaturedAsset", "placeholder_r7", "options", "channelPriceIncludesTax", "ProductVariantsTableComponent_tr_22_ng_container_1_Template", "formGroupMap", "id", "ProductVariantsTableComponent", "constructor", "changeDetector", "Map", "Permission", "UpdateCatalog", "UpdateProduct", "ngOnInit", "subscription", "formArray", "valueChanges", "pipe", "map", "length", "debounceTime", "distinctUntilChanged", "subscribe", "buildFormGroupMap", "ngOnDestroy", "unsubscribe", "trackByFn", "index", "item", "variant", "pendingAssetChanges", "featuredAsset", "optionGroupId", "group", "optionGroups", "find", "g", "clear", "controlGroup", "controls", "set", "markForCheck", "\u0275\u0275directiveInject", "ChangeDetectorRef", "selectors", "inputs", "variants", "paginationConfig", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "ProductVariantsTableComponent_ng_container_10_Template", "ProductVariantsTableComponent_tr_22_Template", "import_normalize_string", "\u0275\u0275text", "\u0275\u0275textInterpolate", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275advance", "\u0275\u0275property", "ctx_r1", "customFields", "customFieldsForm", "\u0275\u0275pureFunction0", "_c0", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "cancel", "update", "nameInput_r4", "invalid", "codeInput_r5", "pristine", "\u0275\u0275textInterpolate1", "UpdateProductOptionDialogComponent", "constructor", "updateVariantName", "codeInputTouched", "ngOnInit", "currentTranslation", "productOption", "translations", "find", "t", "languageCode", "activeLanguage", "name", "code", "UntypedFormGroup", "cfCurrentTranslation", "fieldDef", "key", "value", "type", "addControl", "UntypedFormControl", "result", "createUpdatedTranslatable", "translatable", "updatedFields", "customFieldConfig", "defaultTranslation", "resolveWith", "__spreadProps", "__spreadValues", "autoUpdate", "updateCode", "nameValue", "normalizeString", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "UpdateProductOptionDialogComponent_ng_template_0_Template", "\u0275\u0275twoWayListener", "$event", "i0", "_r1", "\u0275\u0275twoWayBindingSet", "target", "UpdateProductOptionDialogComponent_section_14_Template", "UpdateProductOptionDialogComponent_ng_template_15_Template", "\u0275\u0275twoWayProperty", "length", "CatalogModule", "hasRegisteredTabsAndBulkActions", "constructor", "bulkActionRegistryService", "pageService", "registerBulkAction", "assignFacetValuesToProductsBulkAction", "assignProductsToChannelBulkAction", "duplicateProductsBulkAction", "removeProductsFromChannelBulkAction", "deleteProductsBulkAction", "assignFacetValuesToProductVariantsBulkAction", "assignProductVariantsToChannelBulkAction", "removeProductVariantsFromChannelBulkAction", "deleteProductVariantsBulkAction", "assignFacetsToChannelBulkAction", "duplicateFacetsBulkAction", "removeFacetsFromChannelBulkAction", "deleteFacetsBulkAction", "moveCollectionsBulkAction", "assignCollectionsToChannelBulkAction", "duplicateCollectionsBulkAction", "removeCollectionsFromChannelBulkAction", "deleteCollectionsBulkAction", "registerPageTab", "priority", "location", "tab", "route", "component", "ProductListComponent", "detailComponentWithResolver", "ProductDetailComponent", "query", "GetProductDetailDocument", "entityKey", "getBreadcrumbs", "entity", "label", "name", "link", "id", "ProductVariantListComponent", "ProductVariantDetailComponent", "GetProductVariantDetailDocument", "product", "sku", "FacetListComponent", "FacetDetailComponent", "GetFacetDetailDocument", "variables", "facetValueListOptions", "take", "skip", "sort", "createdAt", "SortOrder", "DESC", "CollectionListComponent", "CollectionDetailComponent", "CollectionDetailQueryDocument", "AssetListComponent", "AssetDetailComponent", "AssetDetailQueryDocument", "\u0275\u0275inject", "BulkActionRegistryService", "PageService", "provide", "ROUTES", "useFactory", "createRoutes", "multi", "deps", "imports", "SharedModule", "RouterModule", "forChild", "PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT", "gql", "PRODUCT_LIST_QUERY", "PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT", "gql", "PRODUCT_VARIANT_PRICE_FRAGMENT", "PRODUCT_VARIANT_DETAIL_QUERY", "PRODUCT_VARIANT_UPDATE_MUTATION", "PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT", "gql", "ASSET_FRAGMENT", "PRODUCT_VARIANT_LIST_QUERY"]
7
7
  }