@vendure/admin-ui 2.0.0-next.2 → 2.0.0-next.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/catalog/catalog.module.d.ts +15 -11
- package/catalog/components/assign-to-channel-dialog/assign-to-channel-dialog.component.d.ts +22 -0
- package/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.d.ts +41 -0
- package/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql.d.ts +4 -0
- package/catalog/components/collection-contents/collection-contents.component.d.ts +10 -2
- package/catalog/components/collection-detail/collection-detail.component.d.ts +13 -4
- package/catalog/components/collection-list/collection-list-bulk-actions.d.ts +6 -0
- package/catalog/components/collection-list/collection-list.component.d.ts +9 -5
- package/catalog/components/collection-tree/array-to-tree.d.ts +1 -1
- package/catalog/components/collection-tree/collection-tree-node.component.d.ts +14 -6
- package/catalog/components/collection-tree/collection-tree.component.d.ts +4 -1
- package/catalog/components/facet-list/facet-list-bulk-actions.d.ts +5 -0
- package/catalog/components/facet-list/facet-list.component.d.ts +2 -1
- package/catalog/components/generate-product-variants/generate-product-variants.component.d.ts +3 -3
- package/catalog/components/option-value-input/option-value-input.component.d.ts +21 -9
- package/catalog/components/product-detail/product-detail.component.d.ts +1 -1
- package/catalog/components/product-list/product-list-bulk-actions.d.ts +6 -0
- package/catalog/components/product-list/product-list.component.d.ts +4 -2
- package/catalog/components/product-variants-editor/product-variants-editor.component.d.ts +22 -12
- package/catalog/components/product-variants-list/product-variants-list.component.d.ts +1 -0
- package/catalog/public_api.d.ts +6 -1
- package/core/common/component-registry-types.d.ts +1 -1
- package/core/common/generated-types.d.ts +3184 -195
- package/core/common/utilities/bulk-action-utils.d.ts +19 -0
- package/core/common/utilities/configurable-operation-utils.d.ts +7 -2
- package/core/common/utilities/selection-manager.d.ts +30 -0
- package/core/common/version.d.ts +1 -1
- package/core/components/app-shell/app-shell.component.d.ts +1 -0
- package/core/data/definitions/collection-definitions.d.ts +4 -0
- package/core/data/definitions/facet-definitions.d.ts +3 -0
- package/core/data/definitions/order-definitions.d.ts +14 -0
- package/core/data/definitions/product-definitions.d.ts +2 -0
- package/core/data/providers/collection-data.service.d.ts +7 -0
- package/core/data/providers/facet-data.service.d.ts +3 -0
- package/core/data/providers/order-data.service.d.ts +18 -0
- package/core/data/providers/product-data.service.d.ts +2 -0
- package/core/providers/bulk-action-registry/bulk-action-registry.service.d.ts +9 -0
- package/core/providers/bulk-action-registry/bulk-action-types.d.ts +149 -0
- package/core/providers/bulk-action-registry/register-bulk-action.d.ts +53 -0
- package/core/providers/local-storage/local-storage.service.d.ts +1 -0
- package/core/providers/modal/modal.types.d.ts +2 -0
- package/core/providers/nav-builder/nav-builder-types.d.ts +1 -0
- package/core/public_api.d.ts +24 -1
- package/core/shared/components/asset-gallery/asset-gallery.component.d.ts +27 -3
- package/core/shared/components/bulk-action-menu/bulk-action-menu.component.d.ts +32 -0
- package/core/shared/components/configurable-input/configurable-input.component.d.ts +8 -3
- package/core/shared/components/custom-field-control/custom-field-control.component.d.ts +6 -2
- package/core/shared/components/data-table/data-table.component.d.ts +29 -7
- package/core/shared/components/dropdown/dropdown-menu.component.d.ts +2 -1
- package/core/shared/components/facet-value-selector/facet-value-selector.component.d.ts +3 -2
- package/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.d.ts +38 -0
- package/{catalog → core/shared}/components/product-search-input/product-search-input.component.d.ts +1 -1
- package/core/shared/components/radio-card/radio-card-fieldset.component.d.ts +24 -0
- package/core/shared/components/radio-card/radio-card.component.d.ts +22 -0
- package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.d.ts +31 -0
- package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.d.ts +34 -0
- package/core/shared/components/rich-text-editor/prosemirror/custom-nodes.d.ts +4 -0
- package/core/shared/components/rich-text-editor/prosemirror/inputrules.d.ts +5 -5
- package/core/shared/components/rich-text-editor/prosemirror/menu/links.d.ts +1 -1
- package/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.d.ts +12 -0
- package/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.d.ts +9 -0
- package/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.d.ts +14 -0
- package/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.d.ts +7 -0
- package/core/shared/components/rich-text-editor/prosemirror/plugins/link-select-plugin.d.ts +1 -1
- package/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.d.ts +7 -0
- package/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.d.ts +13 -0
- package/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.d.ts +7 -3
- package/core/shared/components/rich-text-editor/prosemirror/types.d.ts +0 -2
- package/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.d.ts +21 -0
- package/core/shared/components/rich-text-editor/rich-text-editor.component.d.ts +6 -2
- package/core/shared/components/select-toggle/select-toggle.component.d.ts +2 -1
- package/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.d.ts +30 -0
- package/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.d.ts +22 -0
- package/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.d.ts +5 -17
- package/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.d.ts +28 -0
- package/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.d.ts +2 -0
- package/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.d.ts +23 -0
- package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +5 -1
- package/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.d.ts +6 -3
- package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +10 -2
- package/core/shared/pipes/custom-field-description.pipe.d.ts +11 -0
- package/core/shared/pipes/custom-field-label.pipe.d.ts +4 -10
- package/core/shared/shared.module.d.ts +68 -57
- package/customer/components/customer-group-list/customer-group-list.component.d.ts +6 -4
- package/customer/components/customer-group-member-list/customer-group-member-list.component.d.ts +11 -4
- package/esm2020/catalog/catalog.module.mjs +31 -10
- package/esm2020/catalog/components/apply-facet-dialog/apply-facet-dialog.component.mjs +1 -1
- package/esm2020/catalog/components/assets/assets.component.mjs +2 -2
- package/esm2020/catalog/components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component.mjs +4 -1
- package/esm2020/catalog/components/assign-to-channel-dialog/assign-to-channel-dialog.component.mjs +50 -0
- package/esm2020/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.mjs +84 -0
- package/esm2020/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql.mjs +69 -0
- package/esm2020/catalog/components/collection-contents/collection-contents.component.mjs +61 -13
- package/esm2020/catalog/components/collection-detail/collection-detail.component.mjs +70 -32
- package/esm2020/catalog/components/collection-list/collection-list-bulk-actions.mjs +143 -0
- package/esm2020/catalog/components/collection-list/collection-list.component.mjs +46 -12
- package/esm2020/catalog/components/collection-tree/array-to-tree.mjs +3 -3
- package/esm2020/catalog/components/collection-tree/collection-tree-node.component.mjs +36 -10
- package/esm2020/catalog/components/collection-tree/collection-tree.component.mjs +9 -4
- package/esm2020/catalog/components/facet-detail/facet-detail.component.mjs +3 -3
- package/esm2020/catalog/components/facet-list/facet-list-bulk-actions.mjs +202 -0
- package/esm2020/catalog/components/facet-list/facet-list.component.mjs +14 -5
- package/esm2020/catalog/components/generate-product-variants/generate-product-variants.component.mjs +12 -4
- package/esm2020/catalog/components/option-value-input/option-value-input.component.mjs +70 -11
- package/esm2020/catalog/components/product-detail/product-detail.component.mjs +36 -24
- package/esm2020/catalog/components/product-list/product-list-bulk-actions.mjs +168 -0
- package/esm2020/catalog/components/product-list/product-list.component.mjs +13 -9
- package/esm2020/catalog/components/product-variants-editor/product-variants-editor.component.mjs +130 -19
- package/esm2020/catalog/components/product-variants-list/product-variants-list.component.mjs +9 -3
- package/esm2020/catalog/providers/routing/collection-resolver.mjs +2 -1
- package/esm2020/catalog/public_api.mjs +7 -2
- package/esm2020/core/app.component.module.mjs +1 -1
- package/esm2020/core/common/base-detail.component.mjs +1 -1
- package/esm2020/core/common/component-registry-types.mjs +1 -1
- package/esm2020/core/common/deactivate-aware.mjs +1 -1
- package/esm2020/core/common/generated-types.mjs +31 -1
- package/esm2020/core/common/introspection-result.mjs +296 -189
- package/esm2020/core/common/utilities/bulk-action-utils.mjs +35 -0
- package/esm2020/core/common/utilities/configurable-operation-utils.mjs +37 -10
- package/esm2020/core/common/utilities/selection-manager.mjs +96 -0
- package/esm2020/core/common/version.mjs +2 -2
- package/esm2020/core/components/app-shell/app-shell.component.mjs +6 -5
- package/esm2020/core/components/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2020/core/components/channel-switcher/channel-switcher.component.mjs +1 -1
- package/esm2020/core/components/main-nav/main-nav.component.mjs +3 -3
- package/esm2020/core/components/user-menu/user-menu.component.mjs +1 -1
- package/esm2020/core/core.module.mjs +1 -1
- package/esm2020/core/data/definitions/collection-definitions.mjs +47 -1
- package/esm2020/core/data/definitions/facet-definitions.mjs +31 -1
- package/esm2020/core/data/definitions/order-definitions.mjs +583 -455
- package/esm2020/core/data/definitions/product-definitions.mjs +23 -1
- package/esm2020/core/data/definitions/shared-definitions.mjs +29 -28
- package/esm2020/core/data/providers/collection-data.service.mjs +20 -2
- package/esm2020/core/data/providers/customer-data.service.mjs +6 -1
- package/esm2020/core/data/providers/facet-data.service.mjs +18 -2
- package/esm2020/core/data/providers/order-data.service.mjs +43 -2
- package/esm2020/core/data/providers/product-data.service.mjs +10 -2
- package/esm2020/core/data/providers/promotion-data.service.mjs +1 -1
- package/esm2020/core/data/utils/remove-readonly-custom-fields.mjs +8 -1
- package/esm2020/core/providers/bulk-action-registry/bulk-action-registry.service.mjs +28 -0
- package/esm2020/core/providers/bulk-action-registry/bulk-action-types.mjs +2 -0
- package/esm2020/core/providers/bulk-action-registry/register-bulk-action.mjs +63 -0
- package/esm2020/core/providers/dashboard-widget/dashboard-widget.service.mjs +1 -4
- package/esm2020/core/providers/local-storage/local-storage.service.mjs +1 -1
- package/esm2020/core/providers/modal/modal.service.mjs +2 -1
- package/esm2020/core/providers/modal/modal.types.mjs +1 -1
- package/esm2020/core/providers/nav-builder/nav-builder-types.mjs +1 -1
- package/esm2020/core/public_api.mjs +25 -2
- package/esm2020/core/shared/components/action-bar/action-bar.component.mjs +7 -15
- package/esm2020/core/shared/components/address-form/address-form.component.mjs +3 -3
- package/esm2020/core/shared/components/asset-gallery/asset-gallery.component.mjs +34 -51
- package/esm2020/core/shared/components/asset-preview/asset-preview.component.mjs +4 -4
- package/esm2020/core/shared/components/asset-preview-links/asset-preview-links.component.mjs +1 -1
- package/esm2020/core/shared/components/bulk-action-menu/bulk-action-menu.component.mjs +97 -0
- package/esm2020/core/shared/components/configurable-input/configurable-input.component.mjs +22 -10
- package/esm2020/core/shared/components/custom-field-control/custom-field-control.component.mjs +18 -10
- package/esm2020/core/shared/components/data-table/data-table.component.mjs +64 -14
- package/esm2020/core/shared/components/datetime-picker/datetime-picker.component.mjs +1 -1
- package/esm2020/core/shared/components/dropdown/dropdown-menu.component.mjs +26 -23
- package/esm2020/core/shared/components/dropdown/dropdown-trigger.directive.mjs +1 -1
- package/esm2020/core/shared/components/entity-info/entity-info.component.mjs +1 -1
- package/esm2020/core/shared/components/facet-value-selector/facet-value-selector.component.mjs +13 -6
- package/esm2020/core/shared/components/formatted-address/formatted-address.component.mjs +3 -3
- package/esm2020/core/shared/components/help-tooltip/help-tooltip.component.mjs +2 -2
- package/esm2020/core/shared/components/history-entry-detail/history-entry-detail.component.mjs +1 -1
- package/esm2020/core/shared/components/language-selector/language-selector.component.mjs +3 -3
- package/esm2020/core/shared/components/object-tree/object-tree.component.mjs +1 -1
- package/esm2020/core/shared/components/order-state-label/order-state-label.component.mjs +2 -1
- package/esm2020/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.mjs +135 -0
- package/esm2020/core/shared/components/product-search-input/product-search-input.component.mjs +108 -0
- package/esm2020/core/shared/components/product-variant-selector/product-variant-selector.component.mjs +2 -2
- package/esm2020/core/shared/components/radio-card/radio-card-fieldset.component.mjs +54 -0
- package/esm2020/core/shared/components/radio-card/radio-card.component.mjs +53 -0
- package/esm2020/core/shared/components/rich-text-editor/external-image-dialog/external-image-dialog.component.mjs +3 -3
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.mjs +136 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.mjs +46 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/custom-nodes.mjs +57 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/links.mjs +4 -4
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.mjs +22 -1
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.mjs +12 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu.mjs +73 -18
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.mjs +16 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.mjs +100 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.mjs +96 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.mjs +166 -0
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.mjs +47 -18
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/types.mjs +1 -1
- package/esm2020/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.mjs +59 -0
- package/esm2020/core/shared/components/rich-text-editor/rich-text-editor.component.mjs +22 -10
- package/esm2020/core/shared/components/select-toggle/select-toggle.component.mjs +6 -3
- package/esm2020/core/shared/components/simple-dialog/simple-dialog.component.mjs +3 -3
- package/esm2020/core/shared/components/ui-extension-point/ui-extension-point.component.mjs +1 -1
- package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.mjs +57 -0
- package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.mjs +63 -0
- package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.mjs +48 -83
- package/esm2020/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.mjs +45 -0
- package/esm2020/core/shared/dynamic-form-inputs/dynamic-form-input/dynamic-form-input.component.mjs +3 -3
- package/esm2020/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.mjs +12 -3
- package/esm2020/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.mjs +48 -0
- package/esm2020/core/shared/dynamic-form-inputs/register-dynamic-input-components.mjs +7 -1
- package/esm2020/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.mjs +11 -9
- package/esm2020/core/shared/dynamic-form-inputs/relation-form-input/generic/relation-generic-input.component.mjs +1 -1
- package/esm2020/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.mjs +21 -11
- package/esm2020/core/shared/pipes/custom-field-description.pipe.mjs +30 -0
- package/esm2020/core/shared/pipes/custom-field-label.pipe.mjs +7 -19
- package/esm2020/core/shared/pipes/locale-currency.pipe.mjs +10 -2
- package/esm2020/core/shared/pipes/state-i18n-token.pipe.mjs +2 -1
- package/esm2020/core/shared/shared.module.mjs +49 -5
- package/esm2020/customer/components/address-card/address-card.component.mjs +1 -1
- package/esm2020/customer/components/customer-detail/customer-detail.component.mjs +1 -1
- package/esm2020/customer/components/customer-group-list/customer-group-list.component.mjs +33 -18
- package/esm2020/customer/components/customer-group-member-list/customer-group-member-list.component.mjs +3 -3
- package/esm2020/customer/components/customer-history/customer-history.component.mjs +1 -1
- package/esm2020/customer/components/customer-list/customer-list.component.mjs +3 -3
- package/esm2020/dashboard/components/dashboard/dashboard.component.mjs +2 -2
- package/esm2020/dashboard/components/dashboard-widget/dashboard-widget.component.mjs +2 -2
- package/esm2020/dashboard/dashboard.module.mjs +6 -2
- package/esm2020/dashboard/widgets/latest-orders-widget/latest-orders-widget.component.mjs +1 -1
- package/esm2020/dashboard/widgets/order-summary-widget/order-summary-widget.component.mjs +2 -2
- package/esm2020/login/components/login/login.component.mjs +3 -3
- package/esm2020/marketing/components/promotion-detail/promotion-detail.component.mjs +3 -3
- package/esm2020/marketing/components/promotion-list/promotion-list.component.mjs +1 -1
- package/esm2020/order/components/cancel-order-dialog/cancel-order-dialog.component.mjs +1 -1
- package/esm2020/order/components/coupon-code-selector/coupon-code-selector.component.mjs +42 -0
- package/esm2020/order/components/draft-order-detail/draft-order-detail.component.mjs +187 -0
- package/esm2020/order/components/draft-order-variant-selector/draft-order-variant-selector.component.mjs +59 -0
- package/esm2020/order/components/fulfill-order-dialog/fulfill-order-dialog.component.mjs +7 -3
- package/esm2020/order/components/fulfillment-card/fulfillment-card.component.mjs +1 -1
- package/esm2020/order/components/fulfillment-detail/fulfillment-detail.component.mjs +8 -17
- package/esm2020/order/components/line-fulfillment/line-fulfillment.component.mjs +8 -22
- package/esm2020/order/components/order-custom-fields-card/order-custom-fields-card.component.mjs +30 -6
- package/esm2020/order/components/order-detail/order-detail.component.mjs +80 -40
- package/esm2020/order/components/order-editor/order-editor.component.mjs +15 -14
- package/esm2020/order/components/order-edits-preview-dialog/order-edits-preview-dialog.component.mjs +1 -1
- package/esm2020/order/components/order-history/order-history.component.mjs +1 -1
- package/esm2020/order/components/order-list/order-list.component.mjs +40 -17
- package/esm2020/order/components/order-payment-card/order-payment-card.component.mjs +3 -3
- package/esm2020/order/components/order-table/order-table.component.mjs +29 -6
- package/esm2020/order/components/refund-order-dialog/refund-order-dialog.component.mjs +2 -2
- package/esm2020/order/components/select-address-dialog/select-address-dialog.component.mjs +89 -0
- package/esm2020/order/components/select-address-dialog/select-address-dialog.graphql.mjs +14 -0
- package/esm2020/order/components/select-customer-dialog/select-customer-dialog.component.mjs +59 -0
- package/esm2020/order/components/select-shipping-method-dialog/select-shipping-method-dialog.component.mjs +31 -0
- package/esm2020/order/order.module.mjs +20 -2
- package/esm2020/order/order.routes.mjs +23 -4
- package/esm2020/order/providers/routing/order-resolver.mjs +29 -11
- package/esm2020/order/providers/routing/order.guard.mjs +37 -0
- package/esm2020/order/public_api.mjs +9 -1
- package/esm2020/settings/components/administrator-list/administrator-list.component.mjs +1 -1
- package/esm2020/settings/components/channel-list/channel-list.component.mjs +1 -1
- package/esm2020/settings/components/country-list/country-list.component.mjs +3 -3
- package/esm2020/settings/components/payment-method-detail/payment-method-detail.component.mjs +1 -1
- package/esm2020/settings/components/payment-method-list/payment-method-list.component.mjs +1 -1
- package/esm2020/settings/components/permission-grid/permission-grid.component.mjs +1 -1
- package/esm2020/settings/components/profile/profile.component.mjs +3 -3
- package/esm2020/settings/components/role-list/role-list.component.mjs +1 -1
- package/esm2020/settings/components/shipping-method-detail/shipping-method-detail.component.mjs +4 -2
- package/esm2020/settings/components/shipping-method-list/shipping-method-list.component.mjs +1 -1
- package/esm2020/settings/components/tax-category-list/tax-category-list.component.mjs +1 -1
- package/esm2020/settings/components/tax-rate-list/tax-rate-list.component.mjs +1 -1
- package/esm2020/settings/components/zone-detail-dialog/zone-detail-dialog.component.mjs +2 -2
- package/esm2020/settings/components/zone-list/zone-list.component.mjs +3 -3
- package/esm2020/settings/components/zone-member-list/zone-member-list.component.mjs +3 -3
- package/esm2020/system/components/health-check/health-check.component.mjs +2 -2
- package/esm2020/system/components/job-list/job-list.component.mjs +1 -1
- package/fesm2015/vendure-admin-ui-catalog.mjs +1206 -228
- package/fesm2015/vendure-admin-ui-catalog.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-core.mjs +9451 -7332
- package/fesm2015/vendure-admin-ui-core.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-customer.mjs +36 -23
- package/fesm2015/vendure-admin-ui-customer.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-dashboard.mjs +11 -7
- package/fesm2015/vendure-admin-ui-dashboard.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-login.mjs +2 -2
- package/fesm2015/vendure-admin-ui-login.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-marketing.mjs +3 -3
- package/fesm2015/vendure-admin-ui-marketing.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-order.mjs +1184 -599
- package/fesm2015/vendure-admin-ui-order.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-settings.mjs +21 -19
- package/fesm2015/vendure-admin-ui-settings.mjs.map +1 -1
- package/fesm2015/vendure-admin-ui-system.mjs +3 -3
- package/fesm2020/vendure-admin-ui-catalog.mjs +1190 -230
- package/fesm2020/vendure-admin-ui-catalog.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-core.mjs +9539 -7437
- package/fesm2020/vendure-admin-ui-core.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-customer.mjs +36 -23
- package/fesm2020/vendure-admin-ui-customer.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-dashboard.mjs +11 -7
- package/fesm2020/vendure-admin-ui-dashboard.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-login.mjs +2 -2
- package/fesm2020/vendure-admin-ui-login.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-marketing.mjs +3 -3
- package/fesm2020/vendure-admin-ui-marketing.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-order.mjs +1194 -614
- package/fesm2020/vendure-admin-ui-order.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-settings.mjs +21 -19
- package/fesm2020/vendure-admin-ui-settings.mjs.map +1 -1
- package/fesm2020/vendure-admin-ui-system.mjs +3 -3
- package/order/components/coupon-code-selector/coupon-code-selector.component.d.ts +21 -0
- package/order/components/draft-order-detail/draft-order-detail.component.d.ts +52 -0
- package/order/components/draft-order-variant-selector/draft-order-variant-selector.component.d.ts +24 -0
- package/order/components/order-custom-fields-card/order-custom-fields-card.component.d.ts +4 -2
- package/order/components/order-editor/order-editor.component.d.ts +1 -6
- package/order/components/order-list/order-list.component.d.ts +2 -0
- package/order/components/order-table/order-table.component.d.ts +12 -2
- package/order/components/select-address-dialog/select-address-dialog.component.d.ts +27 -0
- package/order/components/select-address-dialog/select-address-dialog.graphql.d.ts +1 -0
- package/order/components/select-customer-dialog/select-customer-dialog.component.d.ts +25 -0
- package/order/components/select-shipping-method-dialog/select-shipping-method-dialog.component.d.ts +19 -0
- package/order/order.module.d.ts +9 -3
- package/order/providers/routing/order-resolver.d.ts +8 -3
- package/order/providers/routing/order.guard.d.ts +12 -0
- package/order/public_api.d.ts +8 -0
- package/package.json +13 -12
- package/settings/components/zone-member-list/zone-member-list.component.d.ts +3 -1
- package/static/i18n-messages/cs.json +50 -3
- package/static/i18n-messages/de.json +53 -3
- package/static/i18n-messages/en.json +55 -8
- package/static/i18n-messages/es.json +50 -3
- package/static/i18n-messages/fr.json +50 -3
- package/static/i18n-messages/it.json +50 -3
- package/static/i18n-messages/pl.json +50 -3
- package/static/i18n-messages/pt_BR.json +50 -3
- package/static/i18n-messages/pt_PT.json +50 -3
- package/static/i18n-messages/ru.json +50 -3
- package/static/i18n-messages/uk.json +50 -3
- package/static/i18n-messages/zh_Hans.json +50 -3
- package/static/i18n-messages/zh_Hant.json +50 -3
- package/static/styles/_variables.scss +4 -0
- package/static/styles/global/_forms.scss +8 -7
- package/static/styles/global/_overrides.scss +11 -1
- package/static/styles/global/_sass-overrides.scss +3 -0
- package/static/styles/global/_utilities.scss +14 -0
- package/static/styles/styles.scss +1 -0
- package/static/styles/theme/default.scss +13 -1
- package/static/styles/ui-extension-theme.scss +1 -0
- package/static/theme.min.css +1 -1
- package/core/shared/components/rich-text-editor/prosemirror/menu/images.d.ts +0 -4
- package/esm2020/catalog/components/product-search-input/product-search-input.component.mjs +0 -107
- package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/images.mjs +0 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vendure-admin-ui-catalog.mjs","sources":["../../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/assets/assets.component.ts","../../src/lib/catalog/src/components/assets/assets.component.html","../../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-detail/collection-detail.component.ts","../../src/lib/catalog/src/components/collection-detail/collection-detail.component.html","../../src/lib/catalog/src/components/collection-tree/array-to-tree.ts","../../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/collection-tree.component.ts","../../src/lib/catalog/src/components/collection-tree/collection-tree.component.html","../../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/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.component.ts","../../src/lib/catalog/src/components/facet-list/facet-list.component.html","../../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/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/providers/product-detail/replace-last.ts","../../src/lib/catalog/src/providers/product-detail/product-detail.service.ts","../../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/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-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/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/product-variants-list/product-variants-list.component.ts","../../src/lib/catalog/src/components/product-variants-list/product-variants-list.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-search-input/product-search-input.component.ts","../../src/lib/catalog/src/components/product-search-input/product-search-input.component.html","../../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-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/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/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/providers/routing/asset-resolver.ts","../../src/lib/catalog/src/providers/routing/collection-resolver.ts","../../src/lib/catalog/src/providers/routing/facet-resolver.ts","../../src/lib/catalog/src/providers/routing/product-resolver.ts","../../src/lib/catalog/src/providers/routing/product-variants-resolver.ts","../../src/lib/catalog/src/catalog.routes.ts","../../src/lib/catalog/src/catalog.module.ts","../../src/lib/catalog/src/public_api.ts","../../src/lib/catalog/src/vendure-admin-ui-catalog.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n BaseDetailComponent,\r\n CustomFieldConfig,\r\n DataService,\r\n GetAssetQuery,\r\n LanguageCode,\r\n NotificationService,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-asset-detail',\r\n templateUrl: './asset-detail.component.html',\r\n styleUrls: ['./asset-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssetDetailComponent\r\n extends BaseDetailComponent<NonNullable<GetAssetQuery['asset']>>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm = new FormGroup({});\r\n customFields: CustomFieldConfig[];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Asset');\r\n }\r\n\r\n ngOnInit() {\r\n this.detailForm = new FormGroup({\r\n name: new FormControl(''),\r\n tags: new FormControl([]),\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n this.init();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n onAssetChange(event: { id: string; name: string; tags: string[] }) {\r\n this.detailForm.get('name')?.setValue(event.name);\r\n this.detailForm.get('tags')?.setValue(event.tags);\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n save() {\r\n this.dataService.product\r\n .updateAsset({\r\n id: this.id,\r\n name: this.detailForm.value.name,\r\n tags: this.detailForm.value.tags,\r\n customFields: this.detailForm.value.customFields,\r\n })\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Asset' });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Asset',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(entity: NonNullable<GetAssetQuery['asset']>, languageCode: LanguageCode): void {\r\n this.detailForm.get('name')?.setValue(entity.name);\r\n this.detailForm.get('tags')?.setValue(entity.tags);\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get(['customFields']), entity);\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"asset-detail\"></vdr-action-bar-items>\r\n <button\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateAsset']\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<vdr-asset-preview\r\n [asset]=\"entity$ | async\"\r\n [editable]=\"true\"\r\n [customFields]=\"customFields\"\r\n [customFieldsForm]=\"detailForm.get('customFields')\"\r\n (assetChange)=\"onAssetChange($event)\"\r\n></vdr-asset-preview>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n BaseListComponent,\r\n DataService,\r\n DeletionResult,\r\n GetAssetListQuery,\r\n GetAssetListQueryVariables,\r\n ItemOf,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n SortOrder,\r\n TagFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { PaginationInstance } from 'ngx-pagination';\r\nimport { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs';\r\nimport { debounceTime, finalize, map, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-asset-list',\r\n templateUrl: './asset-list.component.html',\r\n styleUrls: ['./asset-list.component.scss'],\r\n})\r\nexport class AssetListComponent\r\n extends BaseListComponent<\r\n GetAssetListQuery,\r\n ItemOf<GetAssetListQuery, 'assets'>,\r\n GetAssetListQueryVariables\r\n >\r\n implements OnInit\r\n{\r\n searchTerm$ = new BehaviorSubject<string | undefined>(undefined);\r\n filterByTags$ = new BehaviorSubject<TagFragment[] | undefined>(undefined);\r\n uploading = false;\r\n allTags$: Observable<TagFragment[]>;\r\n paginationConfig$: Observable<PaginationInstance>;\r\n\r\n constructor(\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.product.getAssetList(...args),\r\n data => data.assets,\r\n (skip, take) => {\r\n const searchTerm = this.searchTerm$.value;\r\n const tags = this.filterByTags$.value?.map(t => t.value);\r\n return {\r\n options: {\r\n skip,\r\n take,\r\n ...(searchTerm\r\n ? {\r\n filter: {\r\n name: { contains: searchTerm },\r\n },\r\n }\r\n : {}),\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n tags,\r\n tagsOperator: LogicalOperator.AND,\r\n },\r\n };\r\n },\r\n { take: 25, skip: 0 },\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.paginationConfig$ = combineLatest(this.itemsPerPage$, this.currentPage$, this.totalItems$).pipe(\r\n map(([itemsPerPage, currentPage, totalItems]) => ({ itemsPerPage, currentPage, totalItems })),\r\n );\r\n this.searchTerm$.pipe(debounceTime(250), takeUntil(this.destroy$)).subscribe(() => this.refresh());\r\n\r\n this.filterByTags$.pipe(takeUntil(this.destroy$)).subscribe(() => this.refresh());\r\n this.allTags$ = this.dataService.product.getTagList().mapStream(data => data.tags.items);\r\n }\r\n\r\n filesSelected(files: File[]) {\r\n if (files.length) {\r\n this.uploading = true;\r\n this.dataService.product\r\n .createAssets(files)\r\n .pipe(finalize(() => (this.uploading = false)))\r\n .subscribe(({ createAssets }) => {\r\n let successCount = 0;\r\n for (const result of createAssets) {\r\n switch (result.__typename) {\r\n case 'Asset':\r\n successCount++;\r\n break;\r\n case 'MimeTypeError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n if (0 < successCount) {\r\n super.refresh();\r\n this.notificationService.success(_('asset.notify-create-assets-success'), {\r\n count: successCount,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n deleteAssets(assets: Asset[]) {\r\n this.showModalAndDelete(assets.map(a => a.id))\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(\r\n assets.map(a => a.id),\r\n response.message || '',\r\n ).pipe(map(r => r.result === DeletionResult.DELETED));\r\n }\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Assets',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Assets',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(assetIds: string[], message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-assets'),\r\n translationVars: {\r\n count: assetIds.length,\r\n },\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res => (res ? this.dataService.product.deleteAssets(assetIds, !!message) : EMPTY)),\r\n map(res => res.deleteAssets),\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <vdr-asset-search-input\r\n class=\"pr4 mt1\"\r\n [tags]=\"allTags$ | async\"\r\n (searchTermChange)=\"searchTerm$.next($event)\"\r\n (tagsChange)=\"filterByTags$.next($event)\"\r\n ></vdr-asset-search-input>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"asset-list\"></vdr-action-bar-items>\r\n <vdr-asset-file-input\r\n (selectFiles)=\"filesSelected($event)\"\r\n [uploading]=\"uploading\"\r\n dropZoneTarget=\".content-area\"\r\n ></vdr-asset-file-input>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-asset-gallery\r\n [assets]=\"(items$ | async)! | paginate: (paginationConfig$ | async) || {}\"\r\n [multiSelect]=\"true\"\r\n [canDelete]=\"['DeleteCatalog', 'DeleteAsset'] | hasPermission\"\r\n (deleteAssets)=\"deleteAssets($event)\"\r\n></vdr-asset-gallery>\r\n\r\n<div class=\"paging-controls\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n ></vdr-pagination-controls>\r\n</div>\r\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n Asset,\r\n AssetPickerDialogComponent,\r\n AssetPreviewDialogComponent,\r\n ModalService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport interface AssetChange {\r\n assets: Asset[];\r\n featuredAsset: Asset | undefined;\r\n}\r\n\r\n/**\r\n * A component which displays the Assets, and allows assets to be removed and\r\n * added, and for the featured asset to be set.\r\n *\r\n * Note: rather complex code for drag drop is due to a limitation of the default CDK implementation\r\n * which is addressed by a work-around from here: https://github.com/angular/components/issues/13372#issuecomment-483998378\r\n */\r\n@Component({\r\n selector: 'vdr-assets',\r\n templateUrl: './assets.component.html',\r\n styleUrls: ['./assets.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssetsComponent {\r\n @Input('assets') set assetsSetter(val: Asset[]) {\r\n // create a new non-readonly array of assets\r\n this.assets = (val || []).slice();\r\n }\r\n\r\n @Input() featuredAsset: Asset | undefined;\r\n @HostBinding('class.compact')\r\n @Input()\r\n compact = false;\r\n @Output() change = new EventEmitter<AssetChange>();\r\n\r\n public assets: Asset[] = [];\r\n\r\n @Input()\r\n updatePermissions: string | string[] | Permission | Permission[];\r\n\r\n constructor(private modalService: ModalService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n selectAssets() {\r\n this.modalService\r\n .fromComponent(AssetPickerDialogComponent, {\r\n size: 'xl',\r\n })\r\n .subscribe(result => {\r\n if (result && result.length) {\r\n this.assets = unique(this.assets.concat(result), 'id');\r\n if (!this.featuredAsset) {\r\n this.featuredAsset = result[0];\r\n }\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n this.changeDetector.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n setAsFeatured(asset: Asset) {\r\n this.featuredAsset = asset;\r\n this.emitChangeEvent(this.assets, asset);\r\n }\r\n\r\n isFeatured(asset: Asset): boolean {\r\n return !!this.featuredAsset && this.featuredAsset.id === asset.id;\r\n }\r\n\r\n previewAsset(asset: Asset) {\r\n this.modalService\r\n .fromComponent(AssetPreviewDialogComponent, {\r\n size: 'xl',\r\n closable: true,\r\n locals: { asset },\r\n })\r\n .subscribe();\r\n }\r\n\r\n removeAsset(asset: Asset) {\r\n this.assets = this.assets.filter(a => a.id !== asset.id);\r\n if (this.featuredAsset && this.featuredAsset.id === asset.id) {\r\n this.featuredAsset = this.assets.length > 0 ? this.assets[0] : undefined;\r\n }\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n }\r\n\r\n private emitChangeEvent(assets: Asset[], featuredAsset: Asset | undefined) {\r\n this.change.emit({\r\n assets,\r\n featuredAsset,\r\n });\r\n }\r\n\r\n dropListDropped(event: CdkDragDrop<number>) {\r\n moveItemInArray(this.assets, event.previousContainer.data, event.container.data);\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n }\r\n}\r\n","<div class=\"card\" *ngIf=\"!compact; else compactView\">\r\n <div class=\"card-img\">\r\n <div class=\"featured-asset\">\r\n <img\r\n *ngIf=\"featuredAsset\"\r\n [src]=\"featuredAsset | assetPreview:'small'\"\r\n (click)=\"previewAsset(featuredAsset)\"\r\n />\r\n <div class=\"placeholder\" *ngIf=\"!featuredAsset\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"image\" size=\"128\"></clr-icon>\r\n <div>{{ 'catalog.no-featured-asset' | translate }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-block\"><ng-container *ngTemplateOutlet=\"assetList\"></ng-container></div>\r\n <div class=\"card-footer\" *vdrIfPermissions=\"updatePermissions\">\r\n <button class=\"btn\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"attachment\"></clr-icon>\r\n {{ 'asset.add-asset' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #compactView>\r\n <div class=\"featured-asset compact\">\r\n <img\r\n *ngIf=\"featuredAsset\"\r\n [src]=\"featuredAsset | assetPreview:'thumb'\"\r\n (click)=\"previewAsset(featuredAsset)\"\r\n />\r\n\r\n <div class=\"placeholder\" *ngIf=\"!featuredAsset\" (click)=\"selectAssets()\"><clr-icon shape=\"image\" size=\"150\"></clr-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"assetList\"></ng-container>\r\n <button\r\n *vdrIfPermissions=\"updatePermissions\"\r\n class=\"compact-select btn btn-icon btn-sm btn-block\"\r\n [title]=\"'asset.add-asset' | translate\"\r\n (click)=\"selectAssets()\"\r\n >\r\n <clr-icon shape=\"attachment\"></clr-icon>\r\n {{ 'asset.add-asset' | translate }}\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #assetList>\r\n <div class=\"all-assets\" [class.compact]=\"compact\" cdkDropListGroup>\r\n <div\r\n *ngFor=\"let asset of assets; let index = index\"\r\n class=\"drop-list\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"index\"\r\n [cdkDropListDisabled]=\"!(updatePermissions | hasPermission)\"\r\n (cdkDropListDropped)=\"dropListDropped($event)\"\r\n >\r\n <vdr-dropdown cdkDrag>\r\n <div\r\n class=\"asset-thumb\"\r\n vdrDropdownTrigger\r\n [class.featured]=\"isFeatured(asset)\"\r\n [title]=\"\"\r\n tabindex=\"0\"\r\n >\r\n <img [src]=\"asset | assetPreview:'tiny'\" />\r\n </div>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button type=\"button\" vdrDropdownItem (click)=\"previewAsset(asset)\">\r\n {{ 'asset.preview' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n [disabled]=\"isFeatured(asset) || !(updatePermissions | hasPermission)\"\r\n vdrDropdownItem\r\n (click)=\"setAsFeatured(asset)\"\r\n >\r\n {{ 'asset.set-as-featured-asset' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"remove-asset\"\r\n vdrDropdownItem\r\n [disabled]=\"!(updatePermissions | hasPermission)\"\r\n (click)=\"removeAsset(asset)\"\r\n >\r\n {{ 'asset.remove-asset' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChild,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { DataService, GetCollectionContentsQuery } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n startWith,\r\n switchMap,\r\n takeUntil,\r\n tap,\r\n} from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-collection-contents',\r\n templateUrl: './collection-contents.component.html',\r\n styleUrls: ['./collection-contents.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionContentsComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() collectionId: string;\r\n @ContentChild(TemplateRef, { static: true }) headerTemplate: TemplateRef<any>;\r\n\r\n contents$: Observable<NonNullable<GetCollectionContentsQuery['collection']>['productVariants']['items']>;\r\n contentsTotalItems$: Observable<number>;\r\n contentsItemsPerPage$: Observable<number>;\r\n contentsCurrentPage$: Observable<number>;\r\n filterTermControl = new FormControl('');\r\n private collectionIdChange$ = new BehaviorSubject<string>('');\r\n private refresh$ = new BehaviorSubject<boolean>(true);\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(private route: ActivatedRoute, private router: Router, private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.contentsCurrentPage$ = this.route.paramMap.pipe(\r\n map(qpm => qpm.get('contentsPage')),\r\n map(page => (!page ? 1 : +page)),\r\n startWith(1),\r\n distinctUntilChanged(),\r\n );\r\n\r\n this.contentsItemsPerPage$ = this.route.paramMap.pipe(\r\n map(qpm => qpm.get('contentsPerPage')),\r\n map(perPage => (!perPage ? 10 : +perPage)),\r\n startWith(10),\r\n distinctUntilChanged(),\r\n );\r\n\r\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(''),\r\n );\r\n\r\n const collection$ = combineLatest(\r\n this.collectionIdChange$,\r\n this.contentsCurrentPage$,\r\n this.contentsItemsPerPage$,\r\n filterTerm$,\r\n this.refresh$,\r\n ).pipe(\r\n takeUntil(this.destroy$),\r\n switchMap(([id, currentPage, itemsPerPage, filterTerm]) => {\r\n const take = itemsPerPage;\r\n const skip = (currentPage - 1) * itemsPerPage;\r\n if (id) {\r\n return this.dataService.collection\r\n .getCollectionContents(id, take, skip, filterTerm)\r\n .mapSingle(data => data.collection);\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n );\r\n\r\n this.contents$ = collection$.pipe(map(result => (result ? result.productVariants.items : [])));\r\n this.contentsTotalItems$ = collection$.pipe(\r\n map(result => (result ? result.productVariants.totalItems : 0)),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('collectionId' in changes) {\r\n this.collectionIdChange$.next(changes.collectionId.currentValue);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n setContentsPageNumber(page: number) {\r\n this.setParam('contentsPage', page);\r\n }\r\n\r\n setContentsItemsPerPage(perPage: number) {\r\n this.setParam('contentsPerPage', perPage);\r\n }\r\n\r\n refresh() {\r\n this.refresh$.next(true);\r\n }\r\n\r\n private setParam(key: string, value: any) {\r\n this.router.navigate(['./', { ...this.route.snapshot.params, [key]: value }], {\r\n relativeTo: this.route,\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n}\r\n","<div class=\"contents-header\">\r\n <div class=\"header-title-row\">\r\n <ng-container\r\n *ngTemplateOutlet=\"headerTemplate; context: { $implicit: contentsTotalItems$ | async }\"\r\n ></ng-container>\r\n </div>\r\n <input\r\n type=\"text\"\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n [formControl]=\"filterTermControl\"\r\n />\r\n</div>\r\n<vdr-data-table\r\n [items]=\"contents$ | async\"\r\n [itemsPerPage]=\"contentsItemsPerPage$ | async\"\r\n [totalItems]=\"contentsTotalItems$ | async\"\r\n [currentPage]=\"contentsCurrentPage$ | async\"\r\n (pageChange)=\"setContentsPageNumber($event)\"\r\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\r\n>\r\n <ng-template let-variant=\"item\">\r\n <td class=\"left align-middle\">{{ variant.name }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['/catalog/products', variant.productId, { tab: 'variants' }]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n Asset,\n BaseDetailComponent,\n Collection,\n CollectionFragment,\n ConfigurableOperation,\n ConfigurableOperationDefinition,\n ConfigurableOperationInput,\n CreateCollectionInput,\n createUpdatedTranslatable,\n CustomFieldConfig,\n DataService,\n encodeConfigArgValue,\n findTranslation,\n getConfigArgValue,\n LanguageCode,\n ModalService,\n NotificationService,\n Permission,\n ServerConfigService,\n unicodePatternValidator,\n UpdateCollectionInput,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { combineLatest } from 'rxjs';\nimport { mergeMap, take } from 'rxjs/operators';\n\nimport { CollectionContentsComponent } from '../collection-contents/collection-contents.component';\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})\nexport class CollectionDetailComponent\n extends BaseDetailComponent<CollectionFragment>\n implements OnInit, OnDestroy\n{\n customFields: CustomFieldConfig[];\n detailForm: FormGroup;\n assetChanges: { assets?: Asset[]; featuredAsset?: Asset } = {};\n filters: ConfigurableOperation[] = [];\n allFilters: ConfigurableOperationDefinition[] = [];\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateCollection];\n @ViewChild('collectionContents') contentsComponent: CollectionContentsComponent;\n\n constructor(\n router: Router,\n route: ActivatedRoute,\n serverConfigService: ServerConfigService,\n private changeDetector: ChangeDetectorRef,\n protected dataService: DataService,\n private formBuilder: FormBuilder,\n private notificationService: NotificationService,\n private modalService: ModalService,\n ) {\n super(route, router, serverConfigService, dataService);\n this.customFields = this.getCustomFieldConfig('Collection');\n this.detailForm = this.formBuilder.group({\n name: ['', Validators.required],\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9_-]+$/)],\n description: '',\n visible: false,\n inheritFilters: true,\n filters: this.formBuilder.array([]),\n customFields: this.formBuilder.group(\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\n ),\n });\n }\n\n ngOnInit() {\n this.init();\n this.dataService.collection.getCollectionFilters().single$.subscribe(res => {\n this.allFilters = res.collectionFilters;\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 combineLatest(this.entity$, this.languageCode$)\n .pipe(take(1))\n .subscribe(([entity, languageCode]) => {\n const slugControl = this.detailForm.get(['slug']);\n const currentTranslation = findTranslation(entity, languageCode);\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\n }\n });\n }\n\n addFilter(collectionFilter: ConfigurableOperation) {\n const filtersArray = this.detailForm.get('filters') as FormArray;\n const index = filtersArray.value.findIndex(o => o.code === collectionFilter.code);\n if (index === -1) {\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\n removeFilter(collectionFilter: ConfigurableOperation) {\n const filtersArray = this.detailForm.get('filters') as FormArray;\n const index = filtersArray.value.findIndex(o => o.code === collectionFilter.code);\n if (index !== -1) {\n filtersArray.removeAt(index);\n this.filters.splice(index, 1);\n }\n }\n\n create() {\n if (!this.detailForm.dirty) {\n return;\n }\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 CreateCollectionInput;\n const parentId = this.route.snapshot.paramMap.get('parentId');\n if (parentId) {\n input.parentId = parentId;\n }\n return this.dataService.collection.createCollection(input);\n }),\n )\n .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 /**\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 entity.filters.forEach(f => this.addFilter(f));\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: FormGroup,\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 return {\n code: o.code,\n arguments: Object.values(formValueOperations[i].args).map((value: any, j) => ({\n name: o.args[j].name,\n value: encodeConfigArgValue(value),\n })),\n };\n });\n }\n}\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"collection-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as category\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n formControlName=\"visible\"\r\n id=\"visibility\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.visible; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'catalog.slug' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: ('catalog.slug-pattern-error' | translate) }\"\r\n >\r\n <input\r\n id=\"slug\"\r\n type=\"text\"\r\n formControlName=\"slug\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [label]=\"'common.description' | translate\"\r\n ></vdr-rich-text-editor>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Collection\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['customFields'])\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"collection-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </div>\r\n <div class=\"clr-col-md-auto\">\r\n <vdr-assets\r\n [assets]=\"category.assets\"\r\n [featuredAsset]=\"category.featuredAsset\"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </div>\r\n </div>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <label>{{ 'catalog.filters' | translate }}</label>\r\n <vdr-form-field [label]=\"'catalog.filter-inheritance' | translate\" for=\"inheritFilters\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n formControlName=\"inheritFilters\"\r\n id=\"inheritFilters\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.inheritFilters; else noInherit\">{{\r\n 'catalog.inherit-filters-from-parent' | translate\r\n }}</ng-container>\r\n <ng-template #noInherit>{{\r\n 'catalog.do-not-inherit-filters' | translate\r\n }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <div formArrayName=\"filters\">\r\n <ng-container *ngFor=\"let filter of filters; index as i\">\r\n <vdr-configurable-input\r\n (remove)=\"removeFilter($event)\"\r\n [operation]=\"filter\"\r\n [operationDefinition]=\"getFilterDefinition(filter)\"\r\n [formControlName]=\"i\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-configurable-input>\r\n </ng-container>\r\n </div>\r\n\r\n <div *vdrIfPermissions=\"updatePermission\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'marketing.add-condition' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let filter of allFilters\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"addFilter(filter)\"\r\n >\r\n {{ filter.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n <div class=\"clr-col\">\r\n <vdr-collection-contents [collectionId]=\"id\" #collectionContents>\r\n <ng-template let-count>\r\n <div class=\"contents-title\">\r\n {{ 'catalog.collection-contents' | translate }} ({{\r\n 'common.results-count' | translate: { count: count }\r\n }})\r\n </div>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </div>\r\n </div>\r\n</form>\r\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>(nodes: T[], currentState?: RootNode<T>): 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 ?? false;\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 // tslint:disable-next-line: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 { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { Injectable, OnDestroy } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { RootNode, TreeNode } from './array-to-tree';\r\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\r\n\r\n/**\r\n * Facilitates communication between the CollectionTreeComponent and child CollectionTreeNodeComponents\r\n * without introducing a cyclic dependency.\r\n */\r\n@Injectable()\r\nexport class CollectionTreeService implements OnDestroy {\r\n private allMoveListItems: Array<{ path: string; id: string; ancestorIdPath: Set<string> }> = [];\r\n private collectionTree: RootNode<CollectionPartial>;\r\n private _rearrange$ = new Subject<RearrangeEvent>();\r\n private _delete$ = new Subject<string>();\r\n\r\n public rearrange$: Observable<RearrangeEvent>;\r\n public delete$: Observable<string>;\r\n\r\n constructor() {\r\n this.rearrange$ = this._rearrange$.asObservable();\r\n this.delete$ = this._delete$.asObservable();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._rearrange$.complete();\r\n this._delete$.complete();\r\n }\r\n\r\n setCollectionTree(tree: RootNode<CollectionPartial>) {\r\n this.collectionTree = tree;\r\n }\r\n\r\n resetMoveList() {\r\n this.allMoveListItems = [];\r\n }\r\n\r\n getMoveListItems(collection: CollectionPartial) {\r\n if (this.allMoveListItems.length === 0) {\r\n this.allMoveListItems = this.calculateAllMoveListItems();\r\n }\r\n return this.allMoveListItems.filter(\r\n item =>\r\n item.id !== collection.id &&\r\n !item.ancestorIdPath.has(collection.id) &&\r\n item.id !== collection.parent?.id,\r\n );\r\n }\r\n\r\n onDrop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\r\n const item = event.item.data as CollectionPartial;\r\n const newParent = event.container.data;\r\n const newParentId = newParent.id;\r\n if (newParentId == null) {\r\n throw new Error(`Could not determine the ID of the root Collection`);\r\n }\r\n this._rearrange$.next({\r\n collectionId: item.id,\r\n parentId: newParentId,\r\n index: event.currentIndex,\r\n });\r\n }\r\n\r\n onMove(event: RearrangeEvent) {\r\n this._rearrange$.next(event);\r\n }\r\n\r\n onDelete(id: string) {\r\n this._delete$.next(id);\r\n }\r\n\r\n private calculateAllMoveListItems() {\r\n const visit = (\r\n node: TreeNode<any>,\r\n parentPath: string[],\r\n ancestorIdPath: Set<string>,\r\n output: Array<{ path: string; id: string; ancestorIdPath: Set<string> }>,\r\n ) => {\r\n const path = parentPath.concat(node.name);\r\n output.push({ path: path.slice(1).join(' / ') || 'root', id: node.id, ancestorIdPath });\r\n node.children.forEach(child =>\r\n visit(child, path, new Set<string>([...ancestorIdPath, node.id]), output),\r\n );\r\n return output;\r\n };\r\n return visit(this.collectionTree, [], new Set<string>(), []);\r\n }\r\n}\r\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Optional,\r\n SimpleChanges,\r\n SkipSelf,\r\n} from '@angular/core';\r\nimport { DataService, Permission } from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map, shareReplay } from 'rxjs/operators';\r\n\r\nimport { RootNode, TreeNode } from './array-to-tree';\r\nimport { CollectionTreeService } from './collection-tree.service';\r\nimport { CollectionPartial } from './collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-tree-node',\r\n templateUrl: './collection-tree-node.component.html',\r\n styleUrls: ['./collection-tree-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionTreeNodeComponent implements OnInit, OnChanges {\r\n depth = 0;\r\n parentName: string;\r\n @Input() collectionTree: TreeNode<CollectionPartial>;\r\n @Input() activeCollectionId: string;\r\n @Input() expandAll = false;\r\n hasUpdatePermission$: Observable<boolean>;\r\n hasDeletePermission$: Observable<boolean>;\r\n moveListItems: Array<{ path: string; id: string }> = [];\r\n\r\n constructor(\r\n @SkipSelf() @Optional() private parent: CollectionTreeNodeComponent,\r\n private dataService: DataService,\r\n private collectionTreeService: CollectionTreeService,\r\n ) {\r\n if (parent) {\r\n this.depth = parent.depth + 1;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.parentName = this.collectionTree.name || '<root>';\r\n const permissions$ = this.dataService.client\r\n .userStatus()\r\n .mapStream(data => data.userStatus.permissions)\r\n .pipe(shareReplay(1));\r\n this.hasUpdatePermission$ = permissions$.pipe(\r\n map(\r\n perms =>\r\n perms.includes(Permission.UpdateCatalog) || perms.includes(Permission.UpdateCollection),\r\n ),\r\n );\r\n this.hasDeletePermission$ = permissions$.pipe(\r\n map(\r\n perms =>\r\n perms.includes(Permission.DeleteCatalog) || perms.includes(Permission.DeleteCollection),\r\n ),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n const expandAllChange = changes['expandAll'];\r\n if (expandAllChange) {\r\n if (expandAllChange.previousValue === true && expandAllChange.currentValue === false) {\r\n this.collectionTree.children.forEach(c => (c.expanded = false));\r\n }\r\n }\r\n }\r\n\r\n trackByFn(index: number, item: CollectionPartial) {\r\n return item.id;\r\n }\r\n\r\n getMoveListItems(collection: CollectionPartial) {\r\n this.moveListItems = this.collectionTreeService.getMoveListItems(collection);\r\n }\r\n\r\n move(collection: CollectionPartial, parentId: string) {\r\n this.collectionTreeService.onMove({\r\n index: 0,\r\n parentId,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n moveUp(collection: CollectionPartial, currentIndex: number) {\r\n if (!collection.parent) {\r\n return;\r\n }\r\n this.collectionTreeService.onMove({\r\n index: currentIndex - 1,\r\n parentId: collection.parent.id,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n moveDown(collection: CollectionPartial, currentIndex: number) {\r\n if (!collection.parent) {\r\n return;\r\n }\r\n this.collectionTreeService.onMove({\r\n index: currentIndex + 1,\r\n parentId: collection.parent.id,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n drop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\r\n moveItemInArray(this.collectionTree.children, event.previousIndex, event.currentIndex);\r\n this.collectionTreeService.onDrop(event);\r\n }\r\n\r\n delete(id: string) {\r\n this.collectionTreeService.onDelete(id);\r\n }\r\n}\r\n","<div\r\n cdkDropList\r\n class=\"tree-node\"\r\n #dropList\r\n [cdkDropListData]=\"collectionTree\"\r\n [cdkDropListDisabled]=\"!(hasUpdatePermission$ | async)\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n>\r\n <div\r\n class=\"collection\"\r\n [class.private]=\"collection.isPrivate\"\r\n *ngFor=\"let collection of collectionTree.children; index as i; trackBy: trackByFn\"\r\n cdkDrag\r\n [cdkDragData]=\"collection\"\r\n >\r\n <div\r\n class=\"collection-detail\"\r\n [ngClass]=\"'depth-' + depth\"\r\n [class.active]=\"collection.id === activeCollectionId\"\r\n >\r\n <div class=\"name\">\r\n <button\r\n class=\"icon-button folder-button\"\r\n [disabled]=\"expandAll\"\r\n *ngIf=\"collection.children?.length; else folderSpacer\"\r\n (click)=\"collection.expanded = !collection.expanded\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!collection.expanded && !expandAll\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"collection.expanded || expandAll\"></clr-icon>\r\n </button>\r\n <ng-template #folderSpacer>\r\n <div class=\"folder-button-spacer\"></div>\r\n </ng-template>\r\n {{ collection.name }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-chip *ngIf=\"collection.isPrivate\">{{ 'catalog.private' | translate }}</vdr-chip>\r\n <a\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['./', { contents: collection.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <clr-icon shape=\"view-list\"></clr-icon>\r\n {{ 'catalog.view-contents' | translate }}\r\n </a>\r\n <a class=\"btn btn-link btn-sm\" [routerLink]=\"['/catalog/collections/', collection.id]\">\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </a>\r\n <div class=\"drag-handle\" cdkDragHandle *vdrIfPermissions=\"['UpdateCatalog', 'UpdateCollection']\">\r\n <clr-icon shape=\"drag-handle\" size=\"24\"></clr-icon>\r\n </div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger (click)=\"getMoveListItems(collection)\">\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <a\r\n class=\"dropdown-item\"\r\n [routerLink]=\"['./', 'create', { parentId: collection.id }]\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-collection' | translate }}\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"i === 0 || !(hasUpdatePermission$ | async)\"\r\n (click)=\"moveUp(collection, i)\"\r\n >\r\n <clr-icon shape=\"caret up\"></clr-icon>\r\n {{ 'catalog.move-up' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"\r\n i === collectionTree.children.length - 1 || !(hasUpdatePermission$ | async)\r\n \"\r\n (click)=\"moveDown(collection, i)\"\r\n >\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n {{ 'catalog.move-down' | translate }}\r\n </button>\r\n <h4 class=\"dropdown-header\">{{ 'catalog.move-to' | translate }}</h4>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n *ngFor=\"let item of moveListItems\"\r\n (click)=\"move(collection, item.id)\"\r\n [disabled]=\"!(hasUpdatePermission$ | async)\"\r\n >\r\n <div class=\"move-to-item\">\r\n <div class=\"move-icon\">\r\n <clr-icon shape=\"child-arrow\"></clr-icon>\r\n </div>\r\n <div class=\"path\">\r\n {{ item.path }}\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"delete(collection.id)\"\r\n [disabled]=\"!(hasDeletePermission$ | async)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n <vdr-collection-tree-node\r\n *ngIf=\"collection.expanded || expandAll\"\r\n [expandAll]=\"expandAll\"\r\n [collectionTree]=\"collection\"\r\n [activeCollectionId]=\"activeCollectionId\"\r\n ></vdr-collection-tree-node>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\nimport { arrayToTree, RootNode } from './array-to-tree';\r\nimport { CollectionTreeService } from './collection-tree.service';\r\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-tree',\r\n templateUrl: 'collection-tree.component.html',\r\n styleUrls: ['./collection-tree.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [CollectionTreeService],\r\n})\r\nexport class CollectionTreeComponent implements OnInit, OnChanges {\r\n @Input() collections: CollectionPartial[];\r\n @Input() activeCollectionId: string;\r\n @Input() expandAll = false;\r\n @Output() rearrange = new EventEmitter<RearrangeEvent>();\r\n @Output() deleteCollection = new EventEmitter<string>();\r\n collectionTree: RootNode<CollectionPartial>;\r\n\r\n constructor(private collectionTreeService: CollectionTreeService) {}\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if ('collections' in changes && this.collections) {\r\n this.collectionTree = arrayToTree(this.collections, this.collectionTree);\r\n this.collectionTreeService.setCollectionTree(this.collectionTree);\r\n this.collectionTreeService.resetMoveList();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.collectionTreeService.rearrange$.subscribe(event => this.rearrange.emit(event));\r\n this.collectionTreeService.delete$.subscribe(id => this.deleteCollection.emit(id));\r\n }\r\n}\r\n","<vdr-collection-tree-node\r\n *ngIf=\"collectionTree\"\r\n cdkDropListGroup\r\n [expandAll]=\"expandAll\"\r\n [collectionTree]=\"collectionTree\"\r\n [activeCollectionId]=\"activeCollectionId\"\r\n></vdr-collection-tree-node>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n QueryResult,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, EMPTY, Observable, Subject } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n shareReplay,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n tap,\r\n} from 'rxjs/operators';\r\n\r\nimport { RearrangeEvent } from '../collection-tree/collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-list',\r\n templateUrl: './collection-list.component.html',\r\n styleUrls: ['./collection-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionListComponent implements OnInit, OnDestroy {\r\n filterTermControl = new FormControl('');\r\n activeCollectionId$: Observable<string | null>;\r\n activeCollectionTitle$: Observable<string>;\r\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n expandAll = false;\r\n private queryResult: QueryResult<any>;\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private serverConfigService: ServerConfigService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.queryResult = this.dataService.collection.getCollections(1000, 0).refetchOnChannelChange();\r\n this.items$ = this.queryResult.mapStream(data => data.collections.items).pipe(shareReplay(1));\r\n this.activeCollectionId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n );\r\n\r\n this.activeCollectionTitle$ = combineLatest(this.activeCollectionId$, this.items$).pipe(\r\n map(([id, collections]) => {\r\n if (id) {\r\n const match = collections.find(c => c.id === id);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }),\r\n );\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n\r\n this.filterTermControl.valueChanges\r\n .pipe(debounceTime(250), takeUntil(this.destroy$))\r\n .subscribe(() => this.refresh());\r\n }\r\n\r\n ngOnDestroy() {\r\n this.queryResult.completed$.next();\r\n this.destroy$.next(undefined);\r\n this.destroy$.complete();\r\n }\r\n\r\n onRearrange(event: RearrangeEvent) {\r\n this.dataService.collection.moveCollection([event]).subscribe({\r\n next: () => {\r\n this.notificationService.success(_('common.notify-saved-changes'));\r\n this.refresh();\r\n },\r\n error: err => {\r\n this.notificationService.error(_('common.notify-save-changes-error'));\r\n },\r\n });\r\n }\r\n\r\n deleteCollection(id: string) {\r\n this.items$\r\n .pipe(\r\n take(1),\r\n map(items => -1 < items.findIndex(i => i.parent && i.parent.id === id)),\r\n switchMap(hasChildren => {\r\n return this.modalService.dialog({\r\n title: _('catalog.confirm-delete-collection'),\r\n body: hasChildren\r\n ? _('catalog.confirm-delete-collection-and-children-body')\r\n : undefined,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n });\r\n }),\r\n switchMap(response => (response ? this.dataService.collection.deleteCollection(id) : EMPTY)),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Collection',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Collection',\r\n });\r\n },\r\n );\r\n }\r\n\r\n closeContents() {\r\n const params = { ...this.route.snapshot.params };\r\n delete params.contents;\r\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n private refresh() {\r\n this.queryResult.ref.refetch({\r\n options: {\r\n skip: 0,\r\n take: 1000,\r\n ...(this.filterTermControl.value\r\n ? {\r\n filter: {\r\n name: {\r\n contains: this.filterTermControl.value,\r\n },\r\n },\r\n }\r\n : {}),\r\n },\r\n });\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex center wrap\">\r\n <vdr-language-selector\r\n class=\"mt2\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n <clr-checkbox-wrapper\r\n class=\"expand-all-toggle ml3\"\r\n [ngClass]=\"(availableLanguages$ | async)?.length === 1 ? 'mt3' : 'mt1'\"\r\n >\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"expandAll\" />\r\n <label>{{ 'catalog.expand-all-collections' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <input\r\n type='text'\r\n name='searchTerm'\r\n [formControl]='filterTermControl'\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n class='clr-input search-input ml4'\r\n />\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"collection-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\r\n [routerLink]=\"['./create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-collection' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<div class=\"collection-wrapper\">\r\n <vdr-collection-tree\r\n [collections]=\"items$ | async\"\r\n [activeCollectionId]=\"activeCollectionId$ | async\"\r\n [expandAll]=\"expandAll\"\r\n (rearrange)=\"onRearrange($event)\"\r\n (deleteCollection)=\"deleteCollection($event)\"\r\n ></vdr-collection-tree>\r\n\r\n <div class=\"collection-contents\" [class.expanded]=\"activeCollectionId$ | async\">\r\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\">\r\n <ng-template let-count>\r\n <div class=\"collection-title\">\r\n {{ activeCollectionTitle$ | async }} ({{\r\n 'common.results-count' | translate: { count: count }\r\n }})\r\n </div>\r\n <button type=\"button\" class=\"close-button\" (click)=\"closeContents()\">\r\n <clr-icon shape=\"close\"></clr-icon>\r\n </button>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n CreateFacetInput,\r\n CreateFacetValueInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n DeletionResult,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n UpdateFacetInput,\r\n UpdateFacetValueInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mapTo, mergeMap, switchMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-facet-detail',\r\n templateUrl: './facet-detail.component.html',\r\n styleUrls: ['./facet-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FacetDetailComponent\r\n extends BaseDetailComponent<FacetWithValuesFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields: CustomFieldConfig[];\r\n customValueFields: CustomFieldConfig[];\r\n detailForm: FormGroup;\r\n values: Array<FacetWithValuesFragment['values'][number] | { name: string; code: string }>;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateFacet];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Facet');\r\n this.customValueFields = this.getCustomFieldConfig('FacetValue');\r\n this.detailForm = this.formBuilder.group({\r\n facet: this.formBuilder.group({\r\n code: ['', Validators.required],\r\n name: '',\r\n visible: true,\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n }),\r\n values: this.formBuilder.array([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n updateCode(currentCode: string, nameValue: string) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['facet', 'code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n updateValueCode(currentCode: string, nameValue: string, index: number) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['values', index, 'code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n customValueFieldIsSet(index: number, name: string): boolean {\r\n return !!this.detailForm.get(['values', index, 'customFields', name]);\r\n }\r\n\r\n getValuesFormArray(): FormArray {\r\n return this.detailForm.get('values') as FormArray;\r\n }\r\n\r\n addFacetValue() {\r\n const valuesFormArray = this.detailForm.get('values') as FormArray | null;\r\n if (valuesFormArray) {\r\n const valueGroup = this.formBuilder.group({\r\n id: '',\r\n name: ['', Validators.required],\r\n code: '',\r\n });\r\n const newValue: any = { name: '', code: '' };\r\n if (this.customValueFields.length) {\r\n const customValueFieldsGroup = new FormGroup({});\r\n newValue.customFields = {};\r\n\r\n for (const fieldDef of this.customValueFields) {\r\n const key = fieldDef.name;\r\n customValueFieldsGroup.addControl(key, new FormControl());\r\n }\r\n\r\n valueGroup.addControl('customFields', customValueFieldsGroup);\r\n }\r\n valuesFormArray.insert(valuesFormArray.length, valueGroup);\r\n this.values.push(newValue);\r\n }\r\n }\r\n\r\n create() {\r\n const facetForm = this.detailForm.get('facet');\r\n if (!facetForm || !facetForm.dirty) {\r\n return;\r\n }\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetForm as FormGroup,\r\n languageCode,\r\n ) as CreateFacetInput;\r\n return this.dataService.facet.createFacet(newFacet);\r\n }),\r\n switchMap(data => this.dataService.facet.getAllFacets().single$.pipe(mapTo(data))),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), { entity: 'Facet' });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createFacet.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Facet',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const facetGroup = this.detailForm.get('facet');\r\n const updateOperations: Array<Observable<any>> = [];\r\n\r\n if (facetGroup && facetGroup.dirty) {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetGroup as FormGroup,\r\n languageCode,\r\n ) as UpdateFacetInput;\r\n if (newFacet) {\r\n updateOperations.push(this.dataService.facet.updateFacet(newFacet));\r\n }\r\n }\r\n const valuesArray = this.detailForm.get('values');\r\n if (valuesArray && valuesArray.dirty) {\r\n const createdValues = this.getCreatedFacetValues(\r\n facet,\r\n valuesArray as FormArray,\r\n languageCode,\r\n );\r\n if (createdValues.length) {\r\n updateOperations.push(\r\n this.dataService.facet\r\n .createFacetValues(createdValues)\r\n .pipe(switchMap(() => this.dataService.facet.getFacet(this.id).single$)),\r\n );\r\n }\r\n const updatedValues = this.getUpdatedFacetValues(\r\n facet,\r\n valuesArray as FormArray,\r\n languageCode,\r\n );\r\n if (updatedValues.length) {\r\n updateOperations.push(this.dataService.facet.updateFacetValues(updatedValues));\r\n }\r\n }\r\n\r\n return forkJoin(updateOperations);\r\n }),\r\n switchMap(() => this.dataService.facet.getAllFacets().single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Facet' });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Facet',\r\n });\r\n },\r\n );\r\n }\r\n\r\n deleteFacetValue(facetValueId: string | undefined, index: number) {\r\n if (!facetValueId) {\r\n // deleting a newly-added (not persisted) FacetValue\r\n const valuesFormArray = this.detailForm.get('values') as FormArray | null;\r\n if (valuesFormArray) {\r\n valuesFormArray.removeAt(index);\r\n }\r\n this.values.splice(index, 1);\r\n return;\r\n }\r\n this.showModalAndDelete(facetValueId)\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\r\n map(r => r.result === DeletionResult.DELETED),\r\n );\r\n }\r\n }),\r\n switchMap(deleted => (deleted ? this.dataService.facet.getFacet(this.id).single$ : [])),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(facetValueId: string, message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-facet-value'),\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(result =>\r\n result ? this.dataService.facet.deleteFacetValues([facetValueId], !!message) : EMPTY,\r\n ),\r\n map(result => result.deleteFacetValues[0]),\r\n );\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the facet or current language.\r\n */\r\n protected setFormValues(facet: FacetWithValuesFragment, languageCode: LanguageCode) {\r\n const currentTranslation = findTranslation(facet, languageCode);\r\n\r\n this.detailForm.patchValue({\r\n facet: {\r\n code: facet.code,\r\n visible: !facet.isPrivate,\r\n name: currentTranslation?.name ?? '',\r\n },\r\n });\r\n\r\n if (this.customFields.length) {\r\n const customFieldsGroup = this.detailForm.get(['facet', 'customFields']) as FormGroup;\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['facet', 'customFields']),\r\n facet,\r\n currentTranslation,\r\n );\r\n }\r\n\r\n const currentValuesFormArray = this.detailForm.get('values') as FormArray;\r\n this.values = [...facet.values];\r\n facet.values.forEach((value, i) => {\r\n const valueTranslation = findTranslation(value, languageCode);\r\n const group = {\r\n id: value.id,\r\n code: value.code,\r\n name: valueTranslation ? valueTranslation.name : '',\r\n };\r\n const valueControl = currentValuesFormArray.at(i);\r\n if (valueControl) {\r\n valueControl.get('id')?.setValue(group.id);\r\n valueControl.get('code')?.setValue(group.code);\r\n valueControl.get('name')?.setValue(group.name);\r\n } else {\r\n currentValuesFormArray.insert(i, this.formBuilder.group(group));\r\n }\r\n if (this.customValueFields.length) {\r\n let customValueFieldsGroup = this.detailForm.get(['values', i, 'customFields']) as FormGroup;\r\n if (!customValueFieldsGroup) {\r\n customValueFieldsGroup = new FormGroup({});\r\n (this.detailForm.get(['values', i]) as FormGroup).addControl(\r\n 'customFields',\r\n customValueFieldsGroup,\r\n );\r\n }\r\n\r\n if (customValueFieldsGroup) {\r\n for (const fieldDef of this.customValueFields) {\r\n const key = fieldDef.name;\r\n const fieldValue =\r\n fieldDef.type === 'localeString'\r\n ? (valueTranslation as any).customFields[key]\r\n : (value as any).customFields[key];\r\n const control = customValueFieldsGroup.get(key);\r\n if (control) {\r\n control.setValue(fieldValue);\r\n } else {\r\n customValueFieldsGroup.addControl(key, new FormControl(fieldValue));\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Given a facet and the value of the detailForm, this method creates an updated copy of the facet which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedFacet(\r\n facet: FacetWithValuesFragment,\r\n facetFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): CreateFacetInput | UpdateFacetInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: facet,\r\n updatedFields: facetFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: facet.name || '',\r\n },\r\n });\r\n input.isPrivate = !facetFormGroup.value.visible;\r\n return input;\r\n }\r\n\r\n /**\r\n * Given an array of facet values and the values from the detailForm, this method creates a new array\r\n * which can be persisted to the API via a createFacetValues mutation.\r\n */\r\n private getCreatedFacetValues(\r\n facet: FacetWithValuesFragment,\r\n valuesFormArray: FormArray,\r\n languageCode: LanguageCode,\r\n ): CreateFacetValueInput[] {\r\n return valuesFormArray.controls\r\n .filter(c => !c.value.id)\r\n .map(c => c.value)\r\n .map(value =>\r\n createUpdatedTranslatable({\r\n translatable: { ...value, translations: [] as any },\r\n updatedFields: value,\r\n customFieldConfig: this.customValueFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n }),\r\n )\r\n .map(input => ({\r\n facetId: facet.id,\r\n ...input,\r\n }));\r\n }\r\n\r\n /**\r\n * Given an array of facet values and the values from the detailForm, this method creates a new array\r\n * which can be persisted to the API via an updateFacetValues mutation.\r\n */\r\n private getUpdatedFacetValues(\r\n facet: FacetWithValuesFragment,\r\n valuesFormArray: FormArray,\r\n languageCode: LanguageCode,\r\n ): UpdateFacetValueInput[] {\r\n const dirtyValues = facet.values.filter((v, i) => {\r\n const formRow = valuesFormArray.get(i.toString());\r\n return formRow && formRow.dirty && formRow.value.id;\r\n });\r\n const dirtyValueValues = valuesFormArray.controls\r\n .filter(c => c.dirty && c.value.id)\r\n .map(c => c.value);\r\n\r\n if (dirtyValues.length !== dirtyValueValues.length) {\r\n throw new Error(_(`error.facet-value-form-values-do-not-match`));\r\n }\r\n return dirtyValues\r\n .map((value, i) => {\r\n return createUpdatedTranslatable({\r\n translatable: value,\r\n updatedFields: dirtyValueValues[i],\r\n customFieldConfig: this.customValueFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n });\r\n })\r\n .filter(notNullOrUndefined);\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"facet-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as facet\">\r\n <section class=\"form-block\" formGroupName=\"facet\">\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"visible\"\r\n id=\"visibility\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.facet.visible; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateCode(facet.code, $event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n [readOnlyToggle]=\"updatePermission | hasPermission\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Facet\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['facet', 'customFields'])\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"facet-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </section>\r\n\r\n <section class=\"form-block\" *ngIf=\"!(isNew$ | async)\">\r\n <label>{{ 'catalog.facet-values' | translate }}</label>\r\n\r\n <table class=\"facet-values-list table\" formArrayName=\"values\" *ngIf=\"0 < getValuesFormArray().length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'common.code' | translate }}</th>\r\n <ng-container *ngIf=\"customValueFields.length\">\r\n <th>{{ 'common.custom-fields' | translate }}</th>\r\n </ng-container>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr class=\"facet-value\" *ngFor=\"let value of values; let i = index\" [formGroupName]=\"i\">\r\n <td class=\"align-middle\">\r\n <vdr-entity-info [entity]=\"value\"></vdr-entity-info>\r\n </td>\r\n <td class=\"align-middle\">\r\n <input\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateValueCode(facet.values[i]?.code, $event.target.value, i)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\"><input type=\"text\" formControlName=\"code\" readonly /></td>\r\n <td class=\"\" *ngIf=\"customValueFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"FacetValue\"\r\n [customFields]=\"customValueFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"detailForm.get(['values', i, 'customFields'])\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </td>\r\n <td class=\"align-middle\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteFacetValue(facet.values[i]?.id, i)\"\r\n [disabled]=\"!(updatePermission | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-secondary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\r\n (click)=\"addFacetValue()\"\r\n >\r\n <clr-icon shape=\"add\"></clr-icon>\r\n {{ 'catalog.add-facet-value' | translate }}\r\n </button>\r\n </div>\r\n </section>\r\n</form>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n DeletionResult,\r\n GetFacetListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { SortOrder } from '@vendure/common/lib/generated-shop-types';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { debounceTime, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-facet-list',\r\n templateUrl: './facet-list.component.html',\r\n styleUrls: ['./facet-list.component.scss'],\r\n})\r\nexport class FacetListComponent\r\n extends BaseListComponent<GetFacetListQuery, ItemOf<GetFacetListQuery, 'facets'>>\r\n implements OnInit\r\n{\r\n filterTermControl = new FormControl('');\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n readonly initialLimit = 3;\r\n displayLimit: { [id: string]: number } = {};\r\n constructor(\r\n private dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private serverConfigService: ServerConfigService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.facet.getFacets(...args).refetchOnChannelChange(),\r\n data => data.facets,\r\n (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.filterTermControl.value,\r\n },\r\n },\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n },\r\n }),\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n this.filterTermControl.valueChanges\r\n .pipe(\r\n filter(value => 2 <= value.length || value.length === 0),\r\n debounceTime(250),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.refresh());\r\n }\r\n\r\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\r\n if (this.displayLimit[facet.id] === facet.values.length) {\r\n this.displayLimit[facet.id] = this.initialLimit;\r\n } else {\r\n this.displayLimit[facet.id] = facet.values.length;\r\n }\r\n }\r\n\r\n deleteFacet(facetValueId: string) {\r\n this.showModalAndDelete(facetValueId)\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\r\n map(r => r.result === DeletionResult.DELETED),\r\n );\r\n }\r\n }),\r\n // Refresh the cached facets to reflect the changes\r\n switchMap(() => this.dataService.facet.getAllFacets().single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'FacetValue',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n );\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n private showModalAndDelete(facetId: string, message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-facet'),\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res => (res ? this.dataService.facet.deleteFacet(facetId, !!message) : EMPTY)),\r\n map(res => res.deleteFacet),\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex center wrap\">\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"filterTermControl\"\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n class=\"clr-input search-input ml4\"\r\n />\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"facet-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\r\n [routerLink]=\"['./create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-facet' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'catalog.values' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'catalog.visibility' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-facet=\"item\">\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">{{ facet.code }}</td>\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">{{ facet.name }}</td>\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let value of facet.values | slice: 0:displayLimit[facet.id] || 3\"\r\n [facetValue]=\"value\"\r\n [removable]=\"false\"\r\n [displayFacetName]=\"false\"\r\n ></vdr-facet-value-chip>\r\n <button\r\n class=\"btn btn-sm btn-secondary btn-icon\"\r\n *ngIf=\"facet.values.length > initialLimit\"\r\n (click)=\"toggleDisplayLimit(facet)\"\r\n >\r\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.values.length; else collapse\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ facet.values.length - initialLimit }}\r\n </ng-container>\r\n <ng-template #collapse>\r\n <clr-icon shape=\"minus\"></clr-icon>\r\n </ng-template>\r\n </button>\r\n </td>\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-chip>\r\n <ng-container *ngIf=\"!facet.isPrivate; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </vdr-chip>\r\n </td>\r\n <td class=\"right align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', facet.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteFacet(facet.id)\"\r\n [disabled]=\"!(['DeleteCatalog', 'DeleteFacet'] | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n Dialog,\r\n FacetValue,\r\n FacetValueSelectorComponent,\r\n FacetWithValuesFragment,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-apply-facet-dialog',\r\n templateUrl: './apply-facet-dialog.component.html',\r\n styleUrls: ['./apply-facet-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ApplyFacetDialogComponent implements Dialog<FacetValue[]>, AfterViewInit {\r\n @ViewChild(FacetValueSelectorComponent) private selector: FacetValueSelectorComponent;\r\n resolveWith: (result?: FacetValue[]) => void;\r\n selectedValues: FacetValue[] = [];\r\n // Provided by caller\r\n facets: FacetWithValuesFragment[];\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => this.selector.focus(), 0);\r\n }\r\n\r\n selectValues() {\r\n this.resolveWith(this.selectedValues);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'catalog.add-facets' | translate }}</ng-template>\r\n\r\n<vdr-facet-value-selector\r\n [facets]=\"facets\"\r\n (selectedValuesChange)=\"selectedValues = $event\"\r\n></vdr-facet-value-selector>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"selectValues()\"\r\n [disabled]=\"selectedValues.length === 0\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n Dialog,\r\n GetChannelsQuery,\r\n NotificationService,\r\n ProductVariantFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, from, Observable } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\n\r\ntype Channel = GetChannelsQuery['channels'][number];\r\n\r\n@Component({\r\n selector: 'vdr-assign-products-to-channel-dialog',\r\n templateUrl: './assign-products-to-channel-dialog.component.html',\r\n styleUrls: ['./assign-products-to-channel-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssignProductsToChannelDialogComponent implements OnInit, Dialog<any> {\r\n selectedChannel: Channel | null | undefined;\r\n currentChannel: Channel;\r\n availableChannels: Channel[];\r\n resolveWith: (result?: any) => void;\r\n variantsPreview$: Observable<Array<{ id: string; name: string; price: number; pricePreview: number }>>;\r\n priceFactorControl = new FormControl(1);\r\n selectedChannelIdControl = new FormControl();\r\n\r\n // assigned by ModalService.fromComponent() call\r\n productIds: string[];\r\n productVariantIds: string[] | undefined;\r\n currentChannelIds: string[];\r\n\r\n get isProductVariantMode(): boolean {\r\n return this.productVariantIds != null;\r\n }\r\n\r\n constructor(private dataService: DataService, private notificationService: NotificationService) {}\r\n\r\n ngOnInit() {\r\n const activeChannelId$ = this.dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n const allChannels$ = this.dataService.settings.getChannels().mapSingle(data => data.channels);\r\n\r\n combineLatest(activeChannelId$, allChannels$).subscribe(([activeChannelId, channels]) => {\r\n // tslint:disable-next-line:no-non-null-assertion\r\n this.currentChannel = channels.find(c => c.id === activeChannelId)!;\r\n this.availableChannels = channels;\r\n });\r\n\r\n this.selectedChannelIdControl.valueChanges.subscribe(ids => {\r\n this.selectChannel(ids);\r\n });\r\n\r\n this.variantsPreview$ = combineLatest(\r\n from(this.getTopVariants(10)),\r\n this.priceFactorControl.valueChanges.pipe(startWith(1)),\r\n ).pipe(\r\n map(([variants, factor]) => {\r\n return variants.map(v => ({\r\n id: v.id,\r\n name: v.name,\r\n price: v.price,\r\n pricePreview: v.price * +factor,\r\n }));\r\n }),\r\n );\r\n }\r\n\r\n selectChannel(channelIds: string[]) {\r\n this.selectedChannel = this.availableChannels.find(c => c.id === channelIds[0]);\r\n }\r\n\r\n assign() {\r\n const selectedChannel = this.selectedChannel;\r\n if (selectedChannel) {\r\n if (!this.isProductVariantMode) {\r\n this.dataService.product\r\n .assignProductsToChannel({\r\n channelId: selectedChannel.id,\r\n productIds: this.productIds,\r\n priceFactor: +this.priceFactorControl.value,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('catalog.assign-product-to-channel-success'), {\r\n channel: selectedChannel.code,\r\n });\r\n this.resolveWith(true);\r\n });\r\n } else if (this.productVariantIds) {\r\n this.dataService.product\r\n .assignVariantsToChannel({\r\n channelId: selectedChannel.id,\r\n productVariantIds: this.productVariantIds,\r\n priceFactor: +this.priceFactorControl.value,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('catalog.assign-variant-to-channel-success'), {\r\n channel: selectedChannel.code,\r\n });\r\n this.resolveWith(true);\r\n });\r\n }\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private async getTopVariants(take: number): Promise<ProductVariantFragment[]> {\r\n const variants: ProductVariantFragment[] = [];\r\n\r\n for (let i = 0; i < this.productIds.length && variants.length < take; i++) {\r\n const productVariants = await this.dataService.product\r\n .getProduct(this.productIds[i], { take: this.isProductVariantMode ? undefined : take })\r\n .mapSingle(({ product }) => {\r\n const _variants = product ? product.variantList.items : [];\r\n return _variants.filter(v =>\r\n this.isProductVariantMode ? this.productVariantIds?.includes(v.id) : true,\r\n );\r\n })\r\n .toPromise();\r\n variants.push(...(productVariants || []));\r\n }\r\n return variants.slice(0, take);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <ng-container *ngIf=\"isProductVariantMode; else productModeTitle\">{{\r\n 'catalog.assign-variants-to-channel' | translate\r\n }}</ng-container>\r\n <ng-template #productModeTitle>{{ 'catalog.assign-products-to-channel' | translate }}</ng-template>\r\n</ng-template>\r\n\r\n<div class=\"flex\">\r\n <clr-input-container>\r\n <label>{{ 'common.channel' | translate }}</label>\r\n <vdr-channel-assignment-control\r\n clrInput\r\n [multiple]=\"false\"\r\n [includeDefaultChannel]=\"false\"\r\n [disableChannelIds]=\"currentChannelIds\"\r\n [formControl]=\"selectedChannelIdControl\"\r\n ></vdr-channel-assignment-control>\r\n </clr-input-container>\r\n <div class=\"flex-spacer\"></div>\r\n <clr-input-container>\r\n <label>{{ 'catalog.price-conversion-factor' | translate }}</label>\r\n <input clrInput type=\"number\" min=\"0\" max=\"99999\" [formControl]=\"priceFactorControl\" />\r\n </clr-input-container>\r\n</div>\r\n\r\n<div class=\"channel-price-preview\">\r\n <label class=\"clr-control-label\">{{ 'catalog.channel-price-preview' | translate }}</label>\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>\r\n {{\r\n 'catalog.price-in-channel'\r\n | translate: { channel: currentChannel?.code | channelCodeToLabel | translate }\r\n }}\r\n </th>\r\n <th>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.price-in-channel' | translate: { channel: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of variantsPreview$ | async\">\r\n <td>{{ row.name }}</td>\r\n <td>{{ row.price | localeCurrency: currentChannel?.currencyCode }}</td>\r\n <td>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\r\n {{ row.pricePreview | localeCurrency: selectedChannel?.currencyCode }}\r\n </ng-template>\r\n <ng-template #noChannelSelected> - </ng-template>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"assign()\" [disabled]=\"!selectedChannel\" class=\"btn btn-primary\">\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.assign-to-named-channel' | translate: { channelCode: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </button>\r\n</ng-template>\r\n","/**\r\n * @description\r\n * Like String.prototype.replace(), but replaces the last instance\r\n * rather than the first.\r\n */\r\nexport function replaceLast(target: string | undefined | null, search: string, replace: string): string {\r\n if (!target) {\r\n return '';\r\n }\r\n const lastIndex = target.lastIndexOf(search);\r\n if (lastIndex === -1) {\r\n return target;\r\n }\r\n const head = target.substr(0, lastIndex);\r\n const tail = target.substr(lastIndex).replace(search, replace);\r\n return head + tail;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n CreateProductInput,\r\n CreateProductVariantInput,\r\n DataService,\r\n DeletionResult,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n UpdateProductInput,\r\n UpdateProductMutation,\r\n UpdateProductOptionInput,\r\n UpdateProductVariantInput,\r\n UpdateProductVariantsMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { forkJoin, Observable, of, throwError } from 'rxjs';\r\nimport { map, mergeMap, shareReplay, switchMap } from 'rxjs/operators';\r\n\r\nimport { CreateProductVariantsConfig } from '../../components/generate-product-variants/generate-product-variants.component';\r\n\r\nimport { replaceLast } from './replace-last';\r\n\r\n/**\r\n * Handles the logic for making the API calls to perform CRUD operations on a Product and its related\r\n * entities. This logic was extracted out of the component because it became too large and hard to follow.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductDetailService {\r\n constructor(private dataService: DataService) {}\r\n\r\n getFacets(): Observable<FacetWithValuesFragment[]> {\r\n return this.dataService.facet.getAllFacets().mapSingle(data => data.facets.items);\r\n }\r\n\r\n getTaxCategories() {\r\n return this.dataService.settings\r\n .getTaxCategories()\r\n .mapSingle(data => data.taxCategories)\r\n .pipe(shareReplay(1));\r\n }\r\n\r\n createProductWithVariants(\r\n input: CreateProductInput,\r\n createVariantsConfig: CreateProductVariantsConfig,\r\n languageCode: LanguageCode,\r\n ) {\r\n const createProduct$ = this.dataService.product.createProduct(input);\r\n const nonEmptyOptionGroups = createVariantsConfig.groups.filter(g => 0 < g.values.length);\r\n const createOptionGroups$ = this.createProductOptionGroups(nonEmptyOptionGroups, languageCode);\r\n\r\n return forkJoin(createProduct$, createOptionGroups$).pipe(\r\n mergeMap(([{ createProduct }, optionGroups]) => {\r\n const addOptionsToProduct$ = optionGroups.length\r\n ? forkJoin(\r\n optionGroups.map(optionGroup => {\r\n return this.dataService.product.addOptionGroupToProduct({\r\n productId: createProduct.id,\r\n optionGroupId: optionGroup.id,\r\n });\r\n }),\r\n )\r\n : of([]);\r\n return addOptionsToProduct$.pipe(\r\n map(() => {\r\n return { createProduct, optionGroups };\r\n }),\r\n );\r\n }),\r\n mergeMap(({ createProduct, optionGroups }) => {\r\n const variants = createVariantsConfig.variants.map(v => {\r\n const optionIds = optionGroups.length\r\n ? v.optionValues.map((optionName, index) => {\r\n const option = optionGroups[index].options.find(o => o.name === optionName);\r\n if (!option) {\r\n throw new Error(\r\n `Could not find a matching ProductOption \"${optionName}\" when creating variant`,\r\n );\r\n }\r\n return option.id;\r\n })\r\n : [];\r\n return {\r\n ...v,\r\n optionIds,\r\n };\r\n });\r\n const options = optionGroups.map(og => og.options).reduce((flat, o) => [...flat, ...o], []);\r\n return this.createProductVariants(createProduct, variants, options, languageCode);\r\n }),\r\n );\r\n }\r\n\r\n createProductOptionGroups(groups: Array<{ name: string; values: string[] }>, languageCode: LanguageCode) {\r\n return groups.length\r\n ? forkJoin(\r\n groups.map(c => {\r\n return this.dataService.product\r\n .createProductOptionGroups({\r\n code: normalizeString(c.name, '-'),\r\n translations: [{ languageCode, name: c.name }],\r\n options: c.values.map(v => ({\r\n code: normalizeString(v, '-'),\r\n translations: [{ languageCode, name: v }],\r\n })),\r\n })\r\n .pipe(map(data => data.createProductOptionGroup));\r\n }),\r\n )\r\n : of([]);\r\n }\r\n\r\n createProductVariants(\r\n product: { name: string; id: string },\r\n variantData: Array<{ price: number; sku: string; stock: number; optionIds: string[] }>,\r\n options: Array<{ id: string; name: string }>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants: CreateProductVariantInput[] = variantData.map(v => {\r\n const name = options.length\r\n ? `${product.name} ${v.optionIds\r\n .map(id => options.find(o => o.id === id))\r\n .filter(notNullOrUndefined)\r\n .map(o => o.name)\r\n .join(' ')}`\r\n : product.name;\r\n return {\r\n productId: product.id,\r\n price: v.price,\r\n sku: v.sku,\r\n stockOnHand: v.stock,\r\n translations: [\r\n {\r\n languageCode,\r\n name,\r\n },\r\n ],\r\n optionIds: v.optionIds,\r\n };\r\n });\r\n return this.dataService.product.createProductVariants(variants).pipe(\r\n map(({ createProductVariants }) => ({\r\n createProductVariants,\r\n productId: product.id,\r\n })),\r\n );\r\n }\r\n\r\n updateProduct(updateOptions: {\r\n product: NonNullable<GetProductWithVariantsQuery['product']>;\r\n languageCode: LanguageCode;\r\n autoUpdate: boolean;\r\n productInput?: UpdateProductInput;\r\n variantsInput?: UpdateProductVariantInput[];\r\n }) {\r\n const { product, languageCode, autoUpdate, productInput, variantsInput } = updateOptions;\r\n const updateOperations: Array<Observable<UpdateProductMutation | UpdateProductVariantsMutation>> = [];\r\n const updateVariantsInput = variantsInput || [];\r\n\r\n const variants$ = autoUpdate\r\n ? this.dataService.product\r\n .getProductVariants({}, product.id)\r\n .mapSingle(({ productVariants }) => productVariants.items)\r\n : of([]);\r\n\r\n return variants$.pipe(\r\n mergeMap(variants => {\r\n if (productInput) {\r\n updateOperations.push(this.dataService.product.updateProduct(productInput));\r\n const productOldName = findTranslation(product, languageCode)?.name ?? '';\r\n const productNewName = findTranslation(productInput, languageCode)?.name;\r\n if (productNewName && productOldName !== productNewName && autoUpdate) {\r\n for (const variant of variants) {\r\n const currentVariantName = findTranslation(variant, languageCode)?.name || '';\r\n let variantInput: UpdateProductVariantInput;\r\n const existingVariantInput = updateVariantsInput.find(i => i.id === variant.id);\r\n if (existingVariantInput) {\r\n variantInput = existingVariantInput;\r\n } else {\r\n variantInput = {\r\n id: variant.id,\r\n translations: [{ languageCode, name: currentVariantName }],\r\n };\r\n updateVariantsInput.push(variantInput);\r\n }\r\n const variantTranslation = findTranslation(variantInput, languageCode);\r\n if (variantTranslation) {\r\n if (variantTranslation.name) {\r\n variantTranslation.name = replaceLast(\r\n variantTranslation.name,\r\n productOldName,\r\n productNewName,\r\n );\r\n } else {\r\n // The variant translation was falsy, which occurs\r\n // when defining the product name for a new translation\r\n // language that had not yet been defined.\r\n variantTranslation.name = [\r\n productNewName,\r\n ...variant.options.map(o => o.name),\r\n ].join(' ');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (updateVariantsInput.length) {\r\n updateOperations.push(\r\n this.dataService.product.updateProductVariants(updateVariantsInput),\r\n );\r\n }\r\n return forkJoin(updateOperations);\r\n }),\r\n );\r\n }\r\n\r\n updateProductOption(\r\n input: UpdateProductOptionInput & { autoUpdate: boolean },\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants$ = input.autoUpdate\r\n ? this.dataService.product\r\n .getProductVariants({}, product.id)\r\n .mapSingle(({ productVariants }) => productVariants.items)\r\n : of([]);\r\n\r\n return variants$.pipe(\r\n mergeMap(variants => {\r\n let updateProductVariantNames$: Observable<any> = of([]);\r\n if (input.autoUpdate) {\r\n // Update any ProductVariants' names which include the option name\r\n let oldOptionName: string | undefined;\r\n const newOptionName = findTranslation(input, languageCode)?.name;\r\n if (!newOptionName) {\r\n updateProductVariantNames$ = of([]);\r\n }\r\n const variantsToUpdate: UpdateProductVariantInput[] = [];\r\n for (const variant of variants) {\r\n if (variant.options.map(o => o.id).includes(input.id)) {\r\n if (!oldOptionName) {\r\n oldOptionName = findTranslation(\r\n variant.options.find(o => o.id === input.id),\r\n languageCode,\r\n )?.name;\r\n }\r\n const variantName = findTranslation(variant, languageCode)?.name || '';\r\n if (oldOptionName && newOptionName && variantName.includes(oldOptionName)) {\r\n variantsToUpdate.push({\r\n id: variant.id,\r\n translations: [\r\n {\r\n languageCode,\r\n name: replaceLast(variantName, oldOptionName, newOptionName),\r\n },\r\n ],\r\n });\r\n }\r\n }\r\n }\r\n if (variantsToUpdate.length) {\r\n updateProductVariantNames$ =\r\n this.dataService.product.updateProductVariants(variantsToUpdate);\r\n }\r\n }\r\n return this.dataService.product\r\n .updateProductOption(input)\r\n .pipe(mergeMap(() => updateProductVariantNames$));\r\n }),\r\n );\r\n }\r\n\r\n deleteProductVariant(id: string, productId: string) {\r\n return this.dataService.product.deleteProductVariant(id).pipe(\r\n switchMap(result => {\r\n if (result.deleteProductVariant.result === DeletionResult.DELETED) {\r\n return this.dataService.product.getProduct(productId).single$;\r\n } else {\r\n return throwError(result.deleteProductVariant.message);\r\n }\r\n }),\r\n );\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n forwardRef,\r\n Input,\r\n Provider,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport const OPTION_VALUE_INPUT_VALUE_ACCESSOR: Provider = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => OptionValueInputComponent),\r\n multi: true,\r\n};\r\n\r\n@Component({\r\n selector: 'vdr-option-value-input',\r\n templateUrl: './option-value-input.component.html',\r\n styleUrls: ['./option-value-input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n providers: [OPTION_VALUE_INPUT_VALUE_ACCESSOR],\r\n})\r\nexport class OptionValueInputComponent implements ControlValueAccessor {\r\n @Input() groupName = '';\r\n @ViewChild('textArea', { static: true }) textArea: ElementRef<HTMLTextAreaElement>;\r\n options: Array<{ name: string; locked: boolean }>;\r\n disabled = false;\r\n input = '';\r\n isFocussed = false;\r\n lastSelected = false;\r\n onChangeFn: (value: any) => void;\r\n onTouchFn: (value: any) => void;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChangeFn = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouchFn = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.options = obj || [];\r\n }\r\n\r\n focus() {\r\n this.textArea.nativeElement.focus();\r\n }\r\n\r\n removeOption(option: { name: string; locked: boolean }) {\r\n if (!option.locked) {\r\n this.options = this.options.filter(o => o.name !== option.name);\r\n this.onChangeFn(this.options);\r\n }\r\n }\r\n\r\n handleKey(event: KeyboardEvent) {\r\n switch (event.key) {\r\n case ',':\r\n case 'Enter':\r\n this.addOptionValue();\r\n event.preventDefault();\r\n break;\r\n case 'Backspace':\r\n if (this.lastSelected) {\r\n this.removeLastOption();\r\n this.lastSelected = false;\r\n } else if (this.input === '') {\r\n this.lastSelected = true;\r\n }\r\n break;\r\n default:\r\n this.lastSelected = false;\r\n }\r\n }\r\n\r\n handleBlur() {\r\n this.isFocussed = false;\r\n this.addOptionValue();\r\n }\r\n\r\n private addOptionValue() {\r\n this.options = unique([...this.options, ...this.parseInputIntoOptions(this.input)]);\r\n this.input = '';\r\n this.onChangeFn(this.options);\r\n }\r\n\r\n private parseInputIntoOptions(input: string): Array<{ name: string; locked: boolean }> {\r\n return input\r\n .split(/[,\\n]/)\r\n .map(s => s.trim())\r\n .filter(s => s !== '')\r\n .map(s => ({ name: s, locked: false }));\r\n }\r\n\r\n private removeLastOption() {\r\n if (!this.options[this.options.length - 1].locked) {\r\n this.options = this.options.slice(0, this.options.length - 1);\r\n }\r\n }\r\n}\r\n","<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\r\n <div class=\"chips\" *ngIf=\"0 < options.length\">\r\n <vdr-chip\r\n *ngFor=\"let option of options; last as isLast\"\r\n [icon]=\"option.locked ? 'lock' : 'times'\"\r\n [class.selected]=\"isLast && lastSelected\"\r\n [class.locked]=\"option.locked\"\r\n [colorFrom]=\"groupName\"\r\n (iconClick)=\"removeOption(option)\"\r\n >\r\n {{ option.name }}\r\n </vdr-chip>\r\n </div>\r\n <textarea\r\n #textArea\r\n (keyup)=\"handleKey($event)\"\r\n (focus)=\"isFocussed = true\"\r\n (blur)=\"handleBlur()\"\r\n [(ngModel)]=\"input\"\r\n [disabled]=\"disabled\"\r\n ></textarea>\r\n</div>\r\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\r\n\r\nimport { CurrencyCode } from '@vendure/admin-ui/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\nimport { OptionValueInputComponent } from '../option-value-input/option-value-input.component';\r\n\r\nconst DEFAULT_VARIANT_CODE = '__DEFAULT_VARIANT__';\r\nexport type CreateVariantValues = {\r\n optionValues: string[];\r\n enabled: boolean;\r\n sku: string;\r\n price: number;\r\n stock: number;\r\n};\r\nexport type CreateProductVariantsConfig = {\r\n groups: Array<{ name: string; values: string[] }>;\r\n variants: CreateVariantValues[];\r\n};\r\n\r\n@Component({\r\n selector: 'vdr-generate-product-variants',\r\n templateUrl: './generate-product-variants.component.html',\r\n styleUrls: ['./generate-product-variants.component.scss'],\r\n})\r\nexport class GenerateProductVariantsComponent implements OnInit {\r\n @Output() variantsChange = new EventEmitter<CreateProductVariantsConfig>();\r\n optionGroups: Array<{ name: string; values: Array<{ name: string; locked: boolean }> }> = [];\r\n currencyCode: CurrencyCode;\r\n variants: Array<{ id: string; values: string[] }>;\r\n variantFormValues: { [id: string]: CreateVariantValues } = {};\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.currencyCode;\r\n });\r\n\r\n this.generateVariants();\r\n }\r\n\r\n addOption() {\r\n this.optionGroups.push({ name: '', values: [] });\r\n }\r\n\r\n removeOption(name: string) {\r\n this.optionGroups = this.optionGroups.filter(g => g.name !== name);\r\n this.generateVariants();\r\n }\r\n\r\n generateVariants() {\r\n const totalValuesCount = this.optionGroups.reduce((sum, group) => sum + group.values.length, 0);\r\n const groups = totalValuesCount\r\n ? this.optionGroups.map(g => g.values.map(v => v.name))\r\n : [[DEFAULT_VARIANT_CODE]];\r\n this.variants = generateAllCombinations(groups).map(values => ({ id: values.join('|'), values }));\r\n\r\n this.variants.forEach(variant => {\r\n if (!this.variantFormValues[variant.id]) {\r\n this.variantFormValues[variant.id] = {\r\n optionValues: variant.values,\r\n enabled: true,\r\n price: this.copyFromDefault(variant.id, 'price', 0),\r\n sku: this.copyFromDefault(variant.id, 'sku', ''),\r\n stock: this.copyFromDefault(variant.id, 'stock', 0),\r\n };\r\n }\r\n });\r\n this.onFormChange();\r\n }\r\n\r\n trackByFn(index: number, variant: { name: string; values: string[] }) {\r\n return variant.values.join('|');\r\n }\r\n\r\n handleEnter(event: KeyboardEvent, optionValueInputComponent: OptionValueInputComponent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n optionValueInputComponent.focus();\r\n }\r\n\r\n onFormChange() {\r\n const variantsToCreate = this.variants.map(v => this.variantFormValues[v.id]).filter(v => v.enabled);\r\n this.variantsChange.emit({\r\n groups: this.optionGroups.map(og => ({ name: og.name, values: og.values.map(v => v.name) })),\r\n variants: variantsToCreate,\r\n });\r\n }\r\n\r\n private copyFromDefault<T extends keyof CreateVariantValues>(\r\n variantId: string,\r\n prop: T,\r\n value: CreateVariantValues[T],\r\n ): CreateVariantValues[T] {\r\n return variantId !== DEFAULT_VARIANT_CODE\r\n ? this.variantFormValues[DEFAULT_VARIANT_CODE][prop]\r\n : value;\r\n }\r\n}\r\n","<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input\r\n placeholder=\"e.g. Size\"\r\n clrInput\r\n [(ngModel)]=\"group.name\"\r\n name=\"name\"\r\n required\r\n (keydown.enter)=\"handleEnter($event, optionValueInputComponent)\"\r\n />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div class=\"remove-group\">\r\n <button\r\n class=\"btn btn-icon btn-warning-outline\"\r\n [title]=\"'catalog.remove-option' | translate\"\r\n (click)=\"removeOption(group.name)\"\r\n >\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOption()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"1 < variants.length\">{{ 'common.create' | translate }}</th>\r\n <th *ngIf=\"1 < variants.length\">{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let variant of variants; trackBy: trackByFn\"\r\n [class.disabled]=\"!variantFormValues[variant.id].enabled\"\r\n >\r\n <td *ngIf=\"1 < variants.length\">\r\n <input\r\n type=\"checkbox\"\r\n (change)=\"onFormChange()\"\r\n [(ngModel)]=\"variantFormValues[variant.id].enabled\"\r\n clrCheckbox\r\n />\r\n </td>\r\n <td *ngIf=\"1 < variants.length\">\r\n {{ variant.values.join(' ') }}\r\n </td>\r\n <td>\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n (change)=\"onFormChange()\"\r\n [(ngModel)]=\"variantFormValues[variant.id].sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td>\r\n <clr-input-container>\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variantFormValues[variant.id].price\"\r\n (ngModelChange)=\"onFormChange()\"\r\n [currencyCode]=\"currencyCode\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </td>\r\n <td>\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variantFormValues[variant.id].stock\"\r\n (change)=\"onFormChange()\"\r\n min=\"0\"\r\n step=\"1\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { FormArray, FormGroup } from '@angular/forms';\r\nimport { Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\nimport { PaginationConfig, SelectedAssets } from '../product-detail/product-detail.types';\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-table',\r\n templateUrl: './product-variants-table.component.html',\r\n styleUrls: ['./product-variants-table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantsTableComponent implements OnInit, OnDestroy {\r\n @Input('productVariantsFormArray') formArray: FormArray;\r\n @Input() variants: ProductVariantFragment[];\r\n @Input() paginationConfig: PaginationConfig;\r\n @Input() channelPriceIncludesTax: boolean;\r\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\r\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\r\n formGroupMap = new Map<string, FormGroup>();\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n private subscription: Subscription;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.subscription = this.formArray.valueChanges\r\n .pipe(\r\n map(value => value.length),\r\n debounceTime(1),\r\n distinctUntilChanged(),\r\n )\r\n .subscribe(() => {\r\n this.buildFormGroupMap();\r\n });\r\n\r\n this.buildFormGroupMap();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n trackByFn(index: number, item: any) {\r\n if ((item as any).id != null) {\r\n return (item as any).id;\r\n } else {\r\n return index;\r\n }\r\n }\r\n\r\n getFeaturedAsset(variant: ProductVariantFragment) {\r\n return this.pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset;\r\n }\r\n\r\n optionGroupName(optionGroupId: string): string | undefined {\r\n const group = this.optionGroups.find(g => g.id === optionGroupId);\r\n return group && group.name;\r\n }\r\n\r\n private buildFormGroupMap() {\r\n this.formGroupMap.clear();\r\n for (const controlGroup of this.formArray.controls) {\r\n this.formGroupMap.set(controlGroup.value.id, controlGroup as FormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <ng-container *ngFor=\"let optionGroup of optionGroups | sort: 'id'\">\r\n <th>{{ optionGroup.name }}</th>\r\n </ng-container>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th>{{ 'common.enabled' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let variant of variants | paginate: paginationConfig; index as i; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <div class=\"card-img\">\r\n <div class=\"featured-asset\">\r\n <img\r\n *ngIf=\"getFeaturedAsset(variant) as featuredAsset; else placeholder\"\r\n [src]=\"featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n <ng-template #placeholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'common.name' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <ng-container *ngFor=\"let option of variant.options | sort: 'groupId'\">\r\n <td\r\n class=\"left align-middle\"\r\n [class.disabled]=\"!formGroup.get('enabled')!.value\"\r\n [style.color]=\"optionGroupName(option.groupId) | stringToColor\"\r\n >\r\n {{ option.name }}\r\n </td>\r\n </ng-container>\r\n <td class=\"left align-middle price\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <vdr-currency-input\r\n *ngIf=\"!channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input>\r\n <vdr-currency-input\r\n *ngIf=\"channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"priceWithTax\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n min=\"0\"\r\n step=\"1\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n formControlName=\"enabled\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n</table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n LanguageCode,\r\n ProductVariantFragment,\r\n UpdateProductOptionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { createUpdatedTranslatable } from '@vendure/admin-ui/core';\r\nimport { Dialog } from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\n\r\n@Component({\r\n selector: 'vdr-update-product-option-dialog',\r\n templateUrl: './update-product-option-dialog.component.html',\r\n styleUrls: ['./update-product-option-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UpdateProductOptionDialogComponent\r\n implements Dialog<UpdateProductOptionInput & { autoUpdate: boolean }>, OnInit\r\n{\r\n resolveWith: (result?: UpdateProductOptionInput & { autoUpdate: boolean }) => void;\r\n updateVariantName = true;\r\n // Provided by caller\r\n productOption: ProductVariantFragment['options'][number];\r\n activeLanguage: LanguageCode;\r\n name: string;\r\n code: string;\r\n customFields: CustomFieldConfig[];\r\n codeInputTouched = false;\r\n customFieldsForm: FormGroup;\r\n\r\n ngOnInit(): void {\r\n const currentTranslation = this.productOption.translations.find(\r\n t => t.languageCode === this.activeLanguage,\r\n );\r\n this.name = currentTranslation?.name ?? '';\r\n this.code = this.productOption.code;\r\n this.customFieldsForm = new FormGroup({});\r\n if (this.customFields) {\r\n const cfCurrentTranslation =\r\n (currentTranslation && (currentTranslation as any).customFields) || {};\r\n\r\n for (const fieldDef of this.customFields) {\r\n const key = fieldDef.name;\r\n const value =\r\n fieldDef.type === 'localeString'\r\n ? cfCurrentTranslation[key]\r\n : (this.productOption as any).customFields[key];\r\n this.customFieldsForm.addControl(fieldDef.name, new FormControl(value));\r\n }\r\n }\r\n }\r\n\r\n update() {\r\n const result = createUpdatedTranslatable({\r\n translatable: this.productOption,\r\n languageCode: this.activeLanguage,\r\n updatedFields: {\r\n code: this.code,\r\n name: this.name,\r\n customFields: this.customFieldsForm.value,\r\n },\r\n customFieldConfig: this.customFields,\r\n defaultTranslation: {\r\n languageCode: this.activeLanguage,\r\n name: '',\r\n },\r\n });\r\n this.resolveWith({ ...result, autoUpdate: this.updateVariantName });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n updateCode(nameValue: string) {\r\n if (!this.codeInputTouched && !this.productOption.code) {\r\n this.code = normalizeString(nameValue, '-');\r\n }\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'catalog.update-product-option' | translate }}</ng-template>\r\n<vdr-form-field [label]=\"'catalog.option-name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n #nameInput=\"ngModel\"\r\n [(ngModel)]=\"name\"\r\n required\r\n (input)=\"updateCode($event.target.value)\"\r\n />\r\n</vdr-form-field>\r\n<vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input id=\"code\" type=\"text\" #codeInput=\"ngModel\" required [(ngModel)]=\"code\" pattern=\"[a-z0-9_-]+\" />\r\n</vdr-form-field>\r\n<clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"updateVariantName\" />\r\n <label>{{ 'catalog.auto-update-option-variant-name' | translate }}</label>\r\n</clr-checkbox-wrapper>\r\n<section *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOption\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"customFieldsForm\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n</section>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"update()\"\r\n [disabled]=\"\r\n nameInput.invalid ||\r\n codeInput.invalid ||\r\n (nameInput.pristine && codeInput.pristine && customFieldsForm.pristine)\r\n \"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'catalog.update-product-option' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-variant-price-detail',\r\n templateUrl: './variant-price-detail.component.html',\r\n styleUrls: ['./variant-price-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class VariantPriceDetailComponent implements OnInit, OnChanges {\r\n @Input() priceIncludesTax: boolean;\r\n @Input() price: number;\r\n @Input() currencyCode: string;\r\n @Input() taxCategoryId: string;\r\n\r\n grossPrice$: Observable<number>;\r\n taxRate$: Observable<number>;\r\n\r\n private priceChange$ = new BehaviorSubject<number>(0);\r\n private taxCategoryIdChange$ = new BehaviorSubject<string>('');\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n const taxRates$ = this.dataService.settings\r\n .getTaxRatesSimple(999, 0, 'cache-first')\r\n .mapStream(data => data.taxRates.items);\r\n const activeChannel$ = this.dataService.settings\r\n .getActiveChannel('cache-first')\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel);\r\n\r\n this.taxRate$ = combineLatest(activeChannel$, taxRates$, this.taxCategoryIdChange$).pipe(\r\n map(([channel, taxRates, taxCategoryId]) => {\r\n const defaultTaxZone = channel.defaultTaxZone;\r\n if (!defaultTaxZone) {\r\n return 0;\r\n }\r\n const applicableRate = taxRates.find(\r\n taxRate => taxRate.zone.id === defaultTaxZone.id && taxRate.category.id === taxCategoryId,\r\n );\r\n\r\n if (!applicableRate) {\r\n return 0;\r\n }\r\n return applicableRate.value;\r\n }),\r\n );\r\n\r\n this.grossPrice$ = combineLatest(this.taxRate$, this.priceChange$).pipe(\r\n map(([taxRate, price]) => {\r\n return Math.round(price * ((100 + taxRate) / 100));\r\n }),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('price' in changes) {\r\n this.priceChange$.next(changes.price.currentValue);\r\n }\r\n if ('taxCategoryId' in changes) {\r\n this.taxCategoryIdChange$.next(changes.taxCategoryId.currentValue);\r\n }\r\n }\r\n}\r\n","<label class=\"clr-control-label\">{{ 'catalog.taxes' | translate }}</label>\r\n<div *ngIf=\"priceIncludesTax\" class=\"value\">\r\n {{ 'catalog.price-includes-tax-at' | translate: { rate: taxRate$ | async } }}\r\n</div>\r\n<div *ngIf=\"!priceIncludesTax\" class=\"value\">\r\n {{\r\n 'catalog.price-with-tax-in-default-zone'\r\n | translate: { price: grossPrice$ | async | localeCurrency: currencyCode, rate: taxRate$ | async }\r\n }}\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { FormArray, FormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n DataService,\r\n FacetValueFragment,\r\n FacetWithValuesFragment,\r\n flattenFacetValues,\r\n GlobalFlag,\r\n LanguageCode,\r\n ModalService,\r\n Permission,\r\n ProductDetailFragment,\r\n ProductOptionFragment,\r\n ProductVariantFragment,\r\n TaxCategory,\r\n UpdateProductOptionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\nimport { AssetChange } from '../assets/assets.component';\r\nimport { PaginationConfig, SelectedAssets, VariantFormValue } from '../product-detail/product-detail.types';\r\nimport { UpdateProductOptionDialogComponent } from '../update-product-option-dialog/update-product-option-dialog.component';\r\n\r\nexport interface VariantAssetChange extends AssetChange {\r\n variantId: string;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-list',\r\n templateUrl: './product-variants-list.component.html',\r\n styleUrls: ['./product-variants-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantsListComponent implements OnChanges, OnInit, OnDestroy {\r\n @Input('productVariantsFormArray') formArray: FormArray;\r\n @Input() variants: ProductVariantFragment[];\r\n @Input() paginationConfig: PaginationConfig;\r\n @Input() channelPriceIncludesTax: boolean;\r\n @Input() taxCategories: TaxCategory[];\r\n @Input() facets: FacetWithValuesFragment[];\r\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\r\n @Input() customFields: CustomFieldConfig[];\r\n @Input() customOptionFields: CustomFieldConfig[];\r\n @Input() activeLanguage: LanguageCode;\r\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\r\n @Output() assignToChannel = new EventEmitter<ProductVariantFragment>();\r\n @Output() removeFromChannel = new EventEmitter<{\r\n channelId: string;\r\n variant: ProductVariantFragment;\r\n }>();\r\n @Output() assetChange = new EventEmitter<VariantAssetChange>();\r\n @Output() selectionChange = new EventEmitter<string[]>();\r\n @Output() selectFacetValueClick = new EventEmitter<string[]>();\r\n @Output() updateProductOption = new EventEmitter<UpdateProductOptionInput & { autoUpdate: boolean }>();\r\n selectedVariantIds: string[] = [];\r\n formGroupMap = new Map<string, FormGroup>();\r\n GlobalFlag = GlobalFlag;\r\n globalTrackInventory: boolean;\r\n globalOutOfStockThreshold: number;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n private facetValues: FacetValueFragment[];\r\n private subscription: Subscription;\r\n\r\n constructor(\r\n private changeDetector: ChangeDetectorRef,\r\n private modalService: ModalService,\r\n private dataService: DataService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getGlobalSettings('cache-first').single$.subscribe(({ globalSettings }) => {\r\n this.globalTrackInventory = globalSettings.trackInventory;\r\n this.globalOutOfStockThreshold = globalSettings.outOfStockThreshold;\r\n this.changeDetector.markForCheck();\r\n });\r\n this.subscription = this.formArray.valueChanges.subscribe(() => this.changeDetector.markForCheck());\r\n\r\n this.subscription.add(\r\n this.formArray.valueChanges\r\n .pipe(\r\n map(value => value.length),\r\n debounceTime(1),\r\n distinctUntilChanged(),\r\n )\r\n .subscribe(() => {\r\n this.buildFormGroupMap();\r\n }),\r\n );\r\n\r\n this.buildFormGroupMap();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if ('facets' in changes && !!changes['facets'].currentValue) {\r\n this.facetValues = flattenFacetValues(this.facets);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n trackById(index: number, item: ProductVariantFragment) {\r\n return item.id;\r\n }\r\n\r\n inventoryIsNotTracked(formGroup: FormGroup): boolean {\r\n const trackInventory = formGroup.get('trackInventory')?.value;\r\n return (\r\n trackInventory === GlobalFlag.FALSE ||\r\n (trackInventory === GlobalFlag.INHERIT && this.globalTrackInventory === false)\r\n );\r\n }\r\n\r\n getTaxCategoryName(group: FormGroup): string {\r\n const control = group.get(['taxCategoryId']);\r\n if (control && this.taxCategories) {\r\n const match = this.taxCategories.find(t => t.id === control.value);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }\r\n\r\n getSaleableStockLevel(variant: ProductVariantFragment) {\r\n const effectiveOutOfStockThreshold = variant.useGlobalOutOfStockThreshold\r\n ? this.globalOutOfStockThreshold\r\n : variant.outOfStockThreshold;\r\n return variant.stockOnHand - variant.stockAllocated - effectiveOutOfStockThreshold;\r\n }\r\n\r\n areAllSelected(): boolean {\r\n return !!this.variants && this.selectedVariantIds.length === this.variants.length;\r\n }\r\n\r\n onAssetChange(variantId: string, event: AssetChange) {\r\n this.assetChange.emit({\r\n variantId,\r\n ...event,\r\n });\r\n const index = this.variants.findIndex(v => v.id === variantId);\r\n this.formArray.at(index).markAsDirty();\r\n }\r\n\r\n toggleSelectAll() {\r\n if (this.areAllSelected()) {\r\n this.selectedVariantIds = [];\r\n } else {\r\n this.selectedVariantIds = this.variants.map(v => v.id);\r\n }\r\n this.selectionChange.emit(this.selectedVariantIds);\r\n }\r\n\r\n toggleSelectVariant(variantId: string) {\r\n const index = this.selectedVariantIds.indexOf(variantId);\r\n if (-1 < index) {\r\n this.selectedVariantIds.splice(index, 1);\r\n } else {\r\n this.selectedVariantIds.push(variantId);\r\n }\r\n this.selectionChange.emit(this.selectedVariantIds);\r\n }\r\n\r\n optionGroupName(optionGroupId: string): string | undefined {\r\n const group = this.optionGroups.find(g => g.id === optionGroupId);\r\n if (group) {\r\n const translation =\r\n group?.translations.find(t => t.languageCode === this.activeLanguage) ??\r\n group.translations[0];\r\n return translation.name;\r\n }\r\n }\r\n\r\n optionName(option: ProductOptionFragment) {\r\n const translation =\r\n option.translations.find(t => t.languageCode === this.activeLanguage) ?? option.translations[0];\r\n return translation.name;\r\n }\r\n\r\n pendingFacetValues(variant: ProductVariantFragment) {\r\n if (this.facets) {\r\n const formFacetValueIds = this.getFacetValueIds(variant.id);\r\n const variantFacetValueIds = variant.facetValues.map(fv => fv.id);\r\n return formFacetValueIds\r\n .filter(x => !variantFacetValueIds.includes(x))\r\n .map(id => this.facetValues.find(fv => fv.id === id))\r\n .filter(notNullOrUndefined);\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n existingFacetValues(variant: ProductVariantFragment) {\r\n const formFacetValueIds = this.getFacetValueIds(variant.id);\r\n const intersection = [...formFacetValueIds].filter(x =>\r\n variant.facetValues.map(fv => fv.id).includes(x),\r\n );\r\n return intersection\r\n .map(id => variant.facetValues.find(fv => fv.id === id))\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n removeFacetValue(variant: ProductVariantFragment, facetValueId: string) {\r\n const formGroup = this.formGroupMap.get(variant.id);\r\n if (formGroup) {\r\n const newValue = (formGroup.value as VariantFormValue).facetValueIds.filter(\r\n id => id !== facetValueId,\r\n );\r\n formGroup.patchValue({\r\n facetValueIds: newValue,\r\n });\r\n formGroup.markAsDirty();\r\n }\r\n }\r\n\r\n isVariantSelected(variantId: string): boolean {\r\n return -1 < this.selectedVariantIds.indexOf(variantId);\r\n }\r\n\r\n editOption(option: ProductVariantFragment['options'][number]) {\r\n this.modalService\r\n .fromComponent(UpdateProductOptionDialogComponent, {\r\n size: 'md',\r\n locals: {\r\n productOption: option,\r\n activeLanguage: this.activeLanguage,\r\n customFields: this.customOptionFields,\r\n },\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n this.updateProductOption.emit(result);\r\n }\r\n });\r\n }\r\n\r\n private buildFormGroupMap() {\r\n this.formGroupMap.clear();\r\n for (const controlGroup of this.formArray.controls) {\r\n this.formGroupMap.set(controlGroup.value.id, controlGroup as FormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n private getFacetValueIds(id: string): string[] {\r\n const formValue: VariantFormValue = this.formGroupMap.get(id)?.value;\r\n return formValue.facetValueIds;\r\n }\r\n}\r\n","<div class=\"variants-list\">\r\n <div\r\n class=\"variant-container card\"\r\n *ngFor=\"\r\n let variant of variants | paginate: paginationConfig || { itemsPerPage: 10, currentPage: 1 };\r\n trackBy: trackById;\r\n let i = index\r\n \"\r\n [class.disabled]=\"!formGroupMap.get(variant.id)?.get('enabled')?.value\"\r\n >\r\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\r\n <div class=\"card-block header-row\">\r\n <div class=\"details\">\r\n <vdr-title-input class=\"sku\" [readonly]=\"!(updatePermission | hasPermission)\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </vdr-title-input>\r\n <vdr-title-input class=\"name\" [readonly]=\"!(updatePermission | hasPermission)\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'common.name' | translate\"\r\n />\r\n </clr-input-container>\r\n </vdr-title-input>\r\n </div>\r\n <div class=\"right-controls\">\r\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermission\">\r\n <input type=\"checkbox\" clrToggle name=\"enabled\" formControlName=\"enabled\" />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"variant-body\">\r\n <div class=\"assets\">\r\n <vdr-assets\r\n [compact]=\"true\"\r\n [assets]=\"pendingAssetChanges[variant.id]?.assets || variant.assets\"\r\n [featuredAsset]=\"\r\n pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset\r\n \"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"onAssetChange(variant.id, $event)\"\r\n ></vdr-assets>\r\n </div>\r\n <div class=\"variant-form-inputs\">\r\n <div class=\"standard-fields\">\r\n <div class=\"variant-form-input-row\">\r\n <div class=\"tax-category\">\r\n <clr-select-container\r\n *vdrIfPermissions=\"updatePermission; else taxCategoryLabel\"\r\n >\r\n <label>{{ 'catalog.tax-category' | translate }}</label>\r\n <select clrSelect name=\"options\" formControlName=\"taxCategoryId\">\r\n <option\r\n *ngFor=\"let taxCategory of taxCategories\"\r\n [value]=\"taxCategory.id\"\r\n >\r\n {{ taxCategory.name }}\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n <ng-template #taxCategoryLabel>\r\n <label class=\"clr-control-label\">{{\r\n 'catalog.tax-category' | translate\r\n }}</label>\r\n <div class=\"tax-category-label\">\r\n {{ getTaxCategoryName(formGroup) }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"price\">\r\n <clr-input-container>\r\n <label>{{ 'catalog.price' | translate }}</label>\r\n <vdr-currency-input\r\n *ngIf=\"!channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input>\r\n <vdr-currency-input\r\n *ngIf=\"channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"priceWithTax\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </div>\r\n <vdr-variant-price-detail\r\n [price]=\"formGroup.get('price')!.value\"\r\n [currencyCode]=\"variant.currencyCode\"\r\n [priceIncludesTax]=\"channelPriceIncludesTax\"\r\n [taxCategoryId]=\"formGroup.get('taxCategoryId')!.value\"\r\n ></vdr-variant-price-detail>\r\n </div>\r\n <div class=\"variant-form-input-row\">\r\n <clr-select-container *vdrIfPermissions=\"updatePermission\">\r\n <label\r\n >{{ 'catalog.track-inventory' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.track-inventory-tooltip' | translate\"\r\n ></vdr-help-tooltip>\r\n </label>\r\n <select clrSelect name=\"options\" formControlName=\"trackInventory\">\r\n <option [value]=\"GlobalFlag.TRUE\">\r\n {{ 'catalog.track-inventory-true' | translate }}\r\n </option>\r\n <option [value]=\"GlobalFlag.FALSE\">\r\n {{ 'catalog.track-inventory-false' | translate }}\r\n </option>\r\n <option [value]=\"GlobalFlag.INHERIT\">\r\n {{ 'catalog.track-inventory-inherit' | translate }}\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n <clr-input-container>\r\n <label\r\n >{{ 'catalog.stock-on-hand' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.stock-on-hand-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <input\r\n [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\"\r\n clrInput\r\n type=\"number\"\r\n min=\"0\"\r\n step=\"1\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [vdrDisabled]=\"inventoryIsNotTracked(formGroup)\"\r\n />\r\n </clr-input-container>\r\n <div [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\">\r\n <label class=\"clr-control-label\"\r\n >{{ 'catalog.stock-allocated' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.stock-allocated-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <div class=\"value\">\r\n {{ variant.stockAllocated }}\r\n </div>\r\n </div>\r\n <div [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\">\r\n <label class=\"clr-control-label\"\r\n >{{ 'catalog.stock-saleable' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.stock-saleable-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <div class=\"value\">\r\n {{ getSaleableStockLevel(variant) }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"variant-form-input-row\">\r\n <div\r\n class=\"out-of-stock-threshold-wrapper\"\r\n [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\"\r\n >\r\n <label class=\"clr-control-label\"\r\n >{{ 'catalog.out-of-stock-threshold' | translate\r\n }}<vdr-help-tooltip\r\n [content]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <div class=\"flex\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [formControl]=\"formGroup.get('outOfStockThreshold')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [vdrDisabled]=\"\r\n formGroup.get('useGlobalOutOfStockThreshold')?.value !==\r\n false || inventoryIsNotTracked(formGroup)\r\n \"\r\n />\r\n </clr-input-container>\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"useGlobalOutOfStockThreshold\"\r\n formControlName=\"useGlobalOutOfStockThreshold\"\r\n [vdrDisabled]=\"\r\n !(updatePermission | hasPermission) ||\r\n inventoryIsNotTracked(formGroup)\r\n \"\r\n />\r\n <label\r\n >{{ 'catalog.use-global-value' | translate }} ({{\r\n globalOutOfStockThreshold\r\n }})</label\r\n >\r\n </clr-toggle-wrapper>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"custom-fields\">\r\n <div class=\"variant-form-input-row\">\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductVariant\"\r\n [customFields]=\"customFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"formGroup.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"options-facets\">\r\n <vdr-entity-info [entity]=\"variant\"></vdr-entity-info>\r\n <div *ngIf=\"variant.options.length\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let option of variant.options | sort: 'groupId'\"\r\n [colorFrom]=\"optionGroupName(option.groupId)\"\r\n [invert]=\"true\"\r\n (iconClick)=\"editOption(option)\"\r\n [icon]=\"(updatePermission | hasPermission) && 'pencil'\"\r\n >\r\n <span class=\"option-group-name\">{{ optionGroupName(option.groupId) }}</span>\r\n {{ optionName(option) }}\r\n </vdr-chip>\r\n <a [routerLink]=\"['./', 'options']\" class=\"btn btn-link btn-sm\"\r\n >{{ 'catalog.edit-options' | translate }}...</a\r\n >\r\n </div>\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <div class=\"facets\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of existingFacetValues(variant)\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"updatePermission | hasPermission\"\r\n (remove)=\"removeFacetValue(variant, facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of pendingFacetValues(variant)\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"updatePermission | hasPermission\"\r\n (remove)=\"removeFacetValue(variant, facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"selectFacetValueClick.emit([variant.id])\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *vdrIfMultichannel>\r\n <div class=\"card-block\" *vdrIfDefaultChannelActive>\r\n <div class=\"flex channel-assignment\">\r\n <ng-container *ngFor=\"let channel of variant.channels\">\r\n <vdr-chip\r\n *ngIf=\"!isDefaultChannel(channel.code)\"\r\n icon=\"times-circle\"\r\n [title]=\"'catalog.remove-from-channel' | translate\"\r\n (iconClick)=\"\r\n removeFromChannel.emit({ channelId: channel.id, variant: variant })\r\n \"\r\n >\r\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n <button class=\"btn btn-sm\" (click)=\"assignToChannel.emit(variant)\">\r\n <clr-icon shape=\"layers\"></clr-icon>\r\n {{ 'catalog.assign-to-channel' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n","import { Location } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n CreateProductInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n flattenFacetValues,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ProductDetailFragment,\r\n ProductVariantFragment,\r\n ServerConfigService,\r\n TaxCategoryFragment,\r\n unicodePatternValidator,\r\n UpdateProductInput,\r\n UpdateProductMutation,\r\n UpdateProductOptionInput,\r\n UpdateProductVariantInput,\r\n UpdateProductVariantsMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { BehaviorSubject, combineLatest, EMPTY, merge, Observable } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n skipUntil,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n tap,\r\n withLatestFrom,\r\n} from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { CreateProductVariantsConfig } from '../generate-product-variants/generate-product-variants.component';\r\nimport { VariantAssetChange } from '../product-variants-list/product-variants-list.component';\r\n\r\nimport { PaginationConfig, SelectedAssets, TabName, VariantFormValue } from './product-detail.types';\r\n\r\n@Component({\r\n selector: 'vdr-product-detail',\r\n templateUrl: './product-detail.component.html',\r\n styleUrls: ['./product-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductDetailComponent\r\n extends BaseDetailComponent<NonNullable<GetProductWithVariantsQuery['product']>>\r\n implements OnInit, OnDestroy\r\n{\r\n activeTab$: Observable<TabName>;\r\n product$: Observable<NonNullable<GetProductWithVariantsQuery['product']>>;\r\n variants$: Observable<ProductVariantFragment[]>;\r\n taxCategories$: Observable<TaxCategoryFragment[]>;\r\n customFields: CustomFieldConfig[];\r\n customVariantFields: CustomFieldConfig[];\r\n customOptionGroupFields: CustomFieldConfig[];\r\n customOptionFields: CustomFieldConfig[];\r\n detailForm: FormGroup;\r\n filterInput = new FormControl('');\r\n assetChanges: SelectedAssets = {};\r\n variantAssetChanges: { [variantId: string]: SelectedAssets } = {};\r\n variantFacetValueChanges: { [variantId: string]: string[] } = {};\r\n productChannels$: Observable<ProductDetailFragment['channels']>;\r\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\r\n facets$: Observable<FacetWithValuesFragment[]>;\r\n totalItems$: Observable<number>;\r\n currentPage$ = new BehaviorSubject(1);\r\n itemsPerPage$ = new BehaviorSubject(10);\r\n paginationConfig$: Observable<PaginationConfig>;\r\n selectedVariantIds: string[] = [];\r\n variantDisplayMode: 'card' | 'table' = 'card';\r\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [] };\r\n channelPriceIncludesTax$: Observable<boolean>;\r\n // Used to store all ProductVariants which have been loaded.\r\n // It is needed when saving changes to variants.\r\n private productVariantMap = new Map<string, ProductVariantFragment>();\r\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n\r\n constructor(\r\n route: ActivatedRoute,\r\n router: Router,\r\n serverConfigService: ServerConfigService,\r\n private productDetailService: ProductDetailService,\r\n private formBuilder: FormBuilder,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private location: Location,\r\n private changeDetector: ChangeDetectorRef,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Product');\r\n this.customVariantFields = this.getCustomFieldConfig('ProductVariant');\r\n this.customOptionGroupFields = this.getCustomFieldConfig('ProductOptionGroup');\r\n this.customOptionFields = this.getCustomFieldConfig('ProductOption');\r\n this.detailForm = this.formBuilder.group({\r\n product: this.formBuilder.group({\r\n enabled: true,\r\n name: ['', Validators.required],\r\n autoUpdateVariantNames: true,\r\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9_-]+$/)],\r\n description: '',\r\n facetValueIds: [[]],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n }),\r\n variants: this.formBuilder.array([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.product$ = this.entity$;\r\n this.totalItems$ = this.product$.pipe(map(product => product.variantList.totalItems));\r\n this.paginationConfig$ = combineLatest(this.totalItems$, this.itemsPerPage$, this.currentPage$).pipe(\r\n map(([totalItems, itemsPerPage, currentPage]) => ({\r\n totalItems,\r\n itemsPerPage,\r\n currentPage,\r\n })),\r\n );\r\n const variants$ = this.product$.pipe(map(product => product.variantList.items));\r\n const filterTerm$ = this.filterInput.valueChanges.pipe(\r\n startWith(''),\r\n debounceTime(200),\r\n shareReplay(),\r\n );\r\n const initialVariants$ = this.product$.pipe(map(p => p.variantList.items));\r\n const updatedVariants$ = combineLatest(filterTerm$, this.currentPage$, this.itemsPerPage$).pipe(\r\n skipUntil(initialVariants$),\r\n skip(1),\r\n switchMap(([term, currentPage, itemsPerPage]) => {\r\n return this.dataService.product\r\n .getProductVariants(\r\n {\r\n skip: (currentPage - 1) * itemsPerPage,\r\n take: itemsPerPage,\r\n ...(term\r\n ? { filter: { name: { contains: term }, sku: { contains: term } } }\r\n : {}),\r\n filterOperator: LogicalOperator.OR,\r\n },\r\n this.id,\r\n )\r\n .mapStream(({ productVariants }) => productVariants.items);\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }),\r\n );\r\n this.variants$ = merge(initialVariants$, updatedVariants$).pipe(\r\n tap(variants => {\r\n for (const variant of variants) {\r\n this.productVariantMap.set(variant.id, variant);\r\n }\r\n }),\r\n );\r\n this.taxCategories$ = this.productDetailService.getTaxCategories().pipe(takeUntil(this.destroy$));\r\n this.activeTab$ = this.route.paramMap.pipe(map(qpm => qpm.get('tab') as any));\r\n\r\n combineLatest(updatedVariants$, this.languageCode$)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(([variants, languageCode]) => {\r\n this.buildVariantFormArray(variants, languageCode);\r\n });\r\n\r\n // FacetValues are provided initially by the nested array of the\r\n // Product entity, but once a fetch to get all Facets is made (as when\r\n // opening the FacetValue selector modal), then these additional values\r\n // are concatenated onto the initial array.\r\n this.facets$ = this.productDetailService.getFacets();\r\n const productFacetValues$ = this.product$.pipe(map(product => product.facetValues));\r\n const allFacetValues$ = this.facets$.pipe(map(flattenFacetValues));\r\n const productGroup = this.getProductFormGroup();\r\n\r\n const formFacetValueIdChanges$ = productGroup.valueChanges.pipe(\r\n map(val => val.facetValueIds as string[]),\r\n distinctUntilChanged(),\r\n );\r\n const formChangeFacetValues$ = combineLatest(\r\n formFacetValueIdChanges$,\r\n productFacetValues$,\r\n allFacetValues$,\r\n ).pipe(\r\n map(([ids, productFacetValues, allFacetValues]) => {\r\n const combined = [...productFacetValues, ...allFacetValues];\r\n return ids.map(id => combined.find(fv => fv.id === id)).filter(notNullOrUndefined);\r\n }),\r\n );\r\n\r\n this.facetValues$ = merge(productFacetValues$, formChangeFacetValues$);\r\n this.productChannels$ = this.product$.pipe(map(p => p.channels));\r\n this.channelPriceIncludesTax$ = this.dataService.settings\r\n .getActiveChannel('cache-first')\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel.pricesIncludeTax)\r\n .pipe(shareReplay(1));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n navigateToTab(tabName: TabName) {\r\n this.location.replaceState(\r\n this.router\r\n .createUrlTree(['./', { ...this.route.snapshot.params, tab: tabName }], {\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n })\r\n .toString(),\r\n );\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n setPage(page: number) {\r\n this.currentPage$.next(page);\r\n }\r\n\r\n setItemsPerPage(value: string) {\r\n this.itemsPerPage$.next(+value);\r\n this.currentPage$.next(1);\r\n }\r\n\r\n assignToChannel() {\r\n this.productChannels$\r\n .pipe(\r\n take(1),\r\n switchMap(channels => {\r\n return this.modalService.fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: [this.id],\r\n currentChannelIds: channels.map(c => c.id),\r\n },\r\n });\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n removeFromChannel(channelId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.remove-product-from-channel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('catalog.remove-from-channel'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? this.dataService.product.removeProductsFromChannel({\r\n channelId,\r\n productIds: [this.id],\r\n })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('catalog.notify-remove-product-from-channel-success'));\r\n },\r\n err => {\r\n this.notificationService.error(_('catalog.notify-remove-product-from-channel-error'));\r\n },\r\n );\r\n }\r\n\r\n assignVariantToChannel(variant: ProductVariantFragment) {\r\n return this.modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: [this.id],\r\n productVariantIds: [variant.id],\r\n currentChannelIds: variant.channels.map(c => c.id),\r\n },\r\n })\r\n .subscribe();\r\n }\r\n\r\n removeVariantFromChannel({ channelId, variant }: { channelId: string; variant: ProductVariantFragment }) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.remove-product-variant-from-channel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('catalog.remove-from-channel'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? this.dataService.product.removeVariantsFromChannel({\r\n channelId,\r\n productVariantIds: [variant.id],\r\n })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('catalog.notify-remove-variant-from-channel-success'));\r\n },\r\n err => {\r\n this.notificationService.error(_('catalog.notify-remove-variant-from-channel-error'));\r\n },\r\n );\r\n }\r\n\r\n assetsChanged(): boolean {\r\n return !!Object.values(this.assetChanges).length;\r\n }\r\n\r\n variantAssetsChanged(): boolean {\r\n return !!Object.keys(this.variantAssetChanges).length;\r\n }\r\n\r\n variantAssetChange(event: VariantAssetChange) {\r\n this.variantAssetChanges[event.variantId] = event;\r\n }\r\n\r\n /**\r\n * If creating a new product, automatically generate the slug based on the product name.\r\n */\r\n updateSlug(nameValue: string) {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(take(1))\r\n .subscribe(([entity, languageCode]) => {\r\n const slugControl = this.detailForm.get(['product', 'slug']);\r\n const currentTranslation = findTranslation(entity, languageCode);\r\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\r\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\r\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\r\n }\r\n });\r\n }\r\n\r\n selectProductFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const productGroup = this.getProductFormGroup();\r\n const currentFacetValueIds = productGroup.value.facetValueIds;\r\n productGroup.patchValue({\r\n facetValueIds: unique([...currentFacetValueIds, ...facetValueIds]),\r\n });\r\n productGroup.markAsDirty();\r\n }\r\n });\r\n }\r\n\r\n updateProductOption(input: UpdateProductOptionInput & { autoUpdate: boolean }) {\r\n combineLatest(this.product$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) =>\r\n this.productDetailService.updateProductOption(input, product, languageCode),\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductOption',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductOption',\r\n });\r\n },\r\n );\r\n }\r\n\r\n removeProductFacetValue(facetValueId: string) {\r\n const productGroup = this.getProductFormGroup();\r\n const currentFacetValueIds = productGroup.value.facetValueIds;\r\n productGroup.patchValue({\r\n facetValueIds: currentFacetValueIds.filter(id => id !== facetValueId),\r\n });\r\n productGroup.markAsDirty();\r\n }\r\n\r\n /**\r\n * Opens a dialog to select FacetValues to apply to the select ProductVariants.\r\n */\r\n selectVariantFacetValue(selectedVariantIds: string[]) {\r\n this.displayFacetValueModal()\r\n .pipe(withLatestFrom(this.variants$))\r\n .subscribe(([facetValueIds, variants]) => {\r\n if (facetValueIds) {\r\n for (const variantId of selectedVariantIds) {\r\n const index = variants.findIndex(v => v.id === variantId);\r\n const variant = variants[index];\r\n const existingFacetValueIds = variant ? variant.facetValues.map(fv => fv.id) : [];\r\n const variantFormGroup = (this.detailForm.get('variants') as FormArray).controls.find(\r\n c => c.value.id === variantId,\r\n );\r\n if (variantFormGroup) {\r\n const uniqueFacetValueIds = unique([...existingFacetValueIds, ...facetValueIds]);\r\n variantFormGroup.patchValue({\r\n facetValueIds: uniqueFacetValueIds,\r\n });\r\n variantFormGroup.markAsDirty();\r\n this.variantFacetValueChanges[variantId] = uniqueFacetValueIds;\r\n }\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n variantsToCreateAreValid(): boolean {\r\n return (\r\n 0 < this.createVariantsConfig.variants.length &&\r\n this.createVariantsConfig.variants.every(v => {\r\n return v.sku !== '';\r\n })\r\n );\r\n }\r\n\r\n private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.productDetailService.getFacets().pipe(\r\n mergeMap(facets =>\r\n this.modalService.fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n locals: { facets },\r\n }),\r\n ),\r\n map(facetValues => facetValues && facetValues.map(v => v.id)),\r\n );\r\n }\r\n\r\n create() {\r\n const productGroup = this.getProductFormGroup();\r\n if (!productGroup.dirty) {\r\n return;\r\n }\r\n combineLatest(this.product$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) => {\r\n const newProduct = this.getUpdatedProduct(\r\n product,\r\n productGroup as FormGroup,\r\n languageCode,\r\n ) as CreateProductInput;\r\n return this.productDetailService.createProductWithVariants(\r\n newProduct,\r\n this.createVariantsConfig,\r\n languageCode,\r\n );\r\n }),\r\n )\r\n .subscribe(\r\n ({ createProductVariants, productId }) => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Product',\r\n });\r\n this.assetChanges = {};\r\n this.variantAssetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.router.navigate(['../', productId], { relativeTo: this.route });\r\n },\r\n err => {\r\n // tslint:disable-next-line:no-console\r\n console.error(err);\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.product$, this.languageCode$, this.channelPriceIncludesTax$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode, priceIncludesTax]) => {\r\n const productGroup = this.getProductFormGroup();\r\n let productInput: UpdateProductInput | undefined;\r\n let variantsInput: UpdateProductVariantInput[] | undefined;\r\n\r\n if (productGroup.dirty || this.assetsChanged()) {\r\n productInput = this.getUpdatedProduct(\r\n product,\r\n productGroup as FormGroup,\r\n languageCode,\r\n ) as UpdateProductInput;\r\n }\r\n const variantsArray = this.detailForm.get('variants');\r\n if ((variantsArray && variantsArray.dirty) || this.variantAssetsChanged()) {\r\n variantsInput = this.getUpdatedProductVariants(\r\n product,\r\n variantsArray as FormArray,\r\n languageCode,\r\n priceIncludesTax,\r\n );\r\n }\r\n\r\n return this.productDetailService.updateProduct({\r\n product,\r\n languageCode,\r\n autoUpdate:\r\n this.detailForm.get(['product', 'autoUpdateVariantNames'])?.value ?? false,\r\n productInput,\r\n variantsInput,\r\n });\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n this.updateSlugAfterSave(result);\r\n this.detailForm.markAsPristine();\r\n this.assetChanges = {};\r\n this.variantAssetChanges = {};\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Product',\r\n });\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the product or current language.\r\n */\r\n protected setFormValues(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const currentTranslation = findTranslation(product, languageCode);\r\n this.detailForm.patchValue({\r\n product: {\r\n enabled: product.enabled,\r\n name: currentTranslation ? currentTranslation.name : '',\r\n slug: currentTranslation ? currentTranslation.slug : '',\r\n description: currentTranslation ? currentTranslation.description : '',\r\n facetValueIds: product.facetValues.map(fv => fv.id),\r\n },\r\n });\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['product', 'customFields']),\r\n product,\r\n currentTranslation,\r\n );\r\n }\r\n this.buildVariantFormArray(product.variantList.items, languageCode);\r\n }\r\n\r\n private buildVariantFormArray(variants: ProductVariantFragment[], languageCode: LanguageCode) {\r\n const variantsFormArray = this.detailForm.get('variants') as FormArray;\r\n variants.forEach((variant, i) => {\r\n const variantTranslation = findTranslation(variant, languageCode);\r\n const pendingFacetValueChanges = this.variantFacetValueChanges[variant.id];\r\n const facetValueIds = pendingFacetValueChanges\r\n ? pendingFacetValueChanges\r\n : variant.facetValues.map(fv => fv.id);\r\n const group: VariantFormValue = {\r\n id: variant.id,\r\n enabled: variant.enabled,\r\n sku: variant.sku,\r\n name: variantTranslation ? variantTranslation.name : '',\r\n price: variant.price,\r\n priceWithTax: variant.priceWithTax,\r\n taxCategoryId: variant.taxCategory.id,\r\n stockOnHand: variant.stockOnHand,\r\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\r\n outOfStockThreshold: variant.outOfStockThreshold,\r\n trackInventory: variant.trackInventory,\r\n facetValueIds,\r\n };\r\n\r\n let variantFormGroup = variantsFormArray.controls.find(c => c.value.id === variant.id) as\r\n | FormGroup\r\n | undefined;\r\n if (variantFormGroup) {\r\n if (variantFormGroup.pristine) {\r\n variantFormGroup.patchValue(group);\r\n }\r\n } else {\r\n variantFormGroup = this.formBuilder.group({\r\n ...group,\r\n facetValueIds: this.formBuilder.control(facetValueIds),\r\n });\r\n variantsFormArray.insert(i, variantFormGroup);\r\n }\r\n if (this.customVariantFields.length) {\r\n let customFieldsGroup = variantFormGroup.get(['customFields']) as FormGroup | undefined;\r\n\r\n if (!customFieldsGroup) {\r\n customFieldsGroup = this.formBuilder.group(\r\n this.customVariantFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n );\r\n variantFormGroup.addControl('customFields', customFieldsGroup);\r\n }\r\n this.setCustomFieldFormValues(\r\n this.customVariantFields,\r\n customFieldsGroup,\r\n variant,\r\n variantTranslation,\r\n );\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedProduct(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n productFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductInput | CreateProductInput {\r\n const updatedProduct = createUpdatedTranslatable({\r\n translatable: product,\r\n updatedFields: productFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: product.name || '',\r\n slug: product.slug || '',\r\n description: product.description || '',\r\n },\r\n });\r\n return {\r\n ...updatedProduct,\r\n assetIds: this.assetChanges.assets?.map(a => a.id),\r\n featuredAssetId: this.assetChanges.featuredAsset?.id,\r\n facetValueIds: productFormGroup.value.facetValueIds,\r\n } as UpdateProductInput | CreateProductInput;\r\n }\r\n\r\n /**\r\n * Given an array of product variants and the values from the detailForm, this method creates an new array\r\n * which can be persisted to the API.\r\n */\r\n private getUpdatedProductVariants(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n variantsFormArray: FormArray,\r\n languageCode: LanguageCode,\r\n priceIncludesTax: boolean,\r\n ): UpdateProductVariantInput[] {\r\n const dirtyFormControls = variantsFormArray.controls.filter(c => c.dirty);\r\n const dirtyVariants = dirtyFormControls\r\n .map(c => this.productVariantMap.get(c.value.id))\r\n .filter(notNullOrUndefined);\r\n const dirtyVariantValues = dirtyFormControls.map(c => c.value);\r\n\r\n if (dirtyVariants.length !== dirtyVariantValues.length) {\r\n throw new Error(_(`error.product-variant-form-values-do-not-match`));\r\n }\r\n return dirtyVariants\r\n .map((variant, i) => {\r\n const formValue: VariantFormValue = dirtyVariantValues.find(value => value.id === variant.id);\r\n const result: UpdateProductVariantInput = createUpdatedTranslatable({\r\n translatable: variant,\r\n updatedFields: formValue,\r\n customFieldConfig: this.customVariantFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n });\r\n result.taxCategoryId = formValue.taxCategoryId;\r\n result.facetValueIds = formValue.facetValueIds;\r\n result.price = priceIncludesTax ? formValue.priceWithTax : formValue.price;\r\n const assetChanges = this.variantAssetChanges[variant.id];\r\n if (assetChanges) {\r\n result.featuredAssetId = assetChanges.featuredAsset?.id;\r\n result.assetIds = assetChanges.assets?.map(a => a.id);\r\n }\r\n return result;\r\n })\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n private getProductFormGroup(): FormGroup {\r\n return this.detailForm.get('product') as FormGroup;\r\n }\r\n\r\n /**\r\n * The server may alter the slug value in order to normalize and ensure uniqueness upon saving.\r\n */\r\n private updateSlugAfterSave(results: Array<UpdateProductMutation | UpdateProductVariantsMutation>) {\r\n const firstResult = results[0];\r\n const slugControl = this.detailForm.get(['product', 'slug']);\r\n\r\n function isUpdateMutation(input: any): input is UpdateProductMutation {\r\n return input.hasOwnProperty('updateProduct');\r\n }\r\n\r\n if (slugControl && isUpdateMutation(firstResult)) {\r\n slugControl.setValue(firstResult.updateProduct.slug, { emitEvent: false });\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-flex-row\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <clr-toggle-wrapper *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\">\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n [formControl]=\"detailForm.get(['product', 'enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </div>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine || !variantsToCreateAreValid()\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"\r\n (detailForm.invalid || detailForm.pristine) && !assetsChanged() && !variantAssetsChanged()\r\n \"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"product$ | async as product\">\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <clr-tabs>\r\n <clr-tab>\r\n <button clrTabLink (click)=\"navigateToTab('details')\">\r\n {{ 'catalog.product-details' | translate }}\r\n </button>\r\n <clr-tab-content *clrIfActive=\"(activeTab$ | async) === 'details'\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <section class=\"form-block\" formGroupName=\"product\">\r\n <ng-container *ngIf=\"!(isNew$ | async)\">\r\n <ng-container *vdrIfMultichannel>\r\n <vdr-form-item\r\n [label]=\"'common.channels' | translate\"\r\n *vdrIfDefaultChannelActive\r\n >\r\n <div class=\"flex channel-assignment\">\r\n <ng-container *ngFor=\"let channel of productChannels$ | async\">\r\n <vdr-chip\r\n *ngIf=\"!isDefaultChannel(channel.code)\"\r\n icon=\"times-circle\"\r\n (iconClick)=\"removeFromChannel(channel.id)\"\r\n >\r\n <vdr-channel-badge\r\n [channelCode]=\"channel.code\"\r\n ></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n <button class=\"btn btn-sm\" (click)=\"assignToChannel()\">\r\n <clr-icon shape=\"layers\"></clr-icon>\r\n {{ 'catalog.assign-to-channel' | translate }}\r\n </button>\r\n </div>\r\n </vdr-form-item>\r\n </ng-container>\r\n </ng-container>\r\n <vdr-form-field [label]=\"'catalog.product-name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <div\r\n class=\"auto-rename-wrapper\"\r\n [class.visible]=\"\r\n (isNew$ | async) === false && detailForm.get(['product', 'name'])?.dirty\r\n \"\r\n >\r\n <clr-checkbox-wrapper>\r\n <input\r\n clrCheckbox\r\n type=\"checkbox\"\r\n id=\"auto-update\"\r\n formControlName=\"autoUpdateVariantNames\"\r\n />\r\n <label>{{\r\n 'catalog.auto-update-product-variant-name' | translate\r\n }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <vdr-form-field\r\n [label]=\"'catalog.slug' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <input\r\n id=\"slug\"\r\n type=\"text\"\r\n formControlName=\"slug\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n [label]=\"'common.description' | translate\"\r\n ></vdr-rich-text-editor>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Product\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['product', 'customFields'])\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"product-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </section>\r\n </div>\r\n <div class=\"clr-col-md-auto\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || product.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || product.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n <div class=\"facets\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of facetValues$ | async\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"['UpdateCatalog', 'UpdateProduct'] | hasPermission\"\r\n (remove)=\"removeProductFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n (click)=\"selectProductFacetValue()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isNew$ | async\">\r\n <h4>{{ 'catalog.product-variants' | translate }}</h4>\r\n <vdr-generate-product-variants\r\n (variantsChange)=\"createVariantsConfig = $event\"\r\n ></vdr-generate-product-variants>\r\n </div>\r\n </clr-tab-content>\r\n </clr-tab>\r\n <clr-tab *ngIf=\"!(isNew$ | async)\">\r\n <button clrTabLink (click)=\"navigateToTab('variants')\">\r\n {{ 'catalog.product-variants' | translate }}\r\n </button>\r\n <clr-tab-content *clrIfActive=\"(activeTab$ | async) === 'variants'\">\r\n <section class=\"form-block\">\r\n <div class=\"view-mode\">\r\n <div class=\"btn-group\">\r\n <button\r\n class=\"btn btn-secondary-outline\"\r\n (click)=\"variantDisplayMode = 'card'\"\r\n [class.btn-primary]=\"variantDisplayMode === 'card'\"\r\n >\r\n <clr-icon shape=\"list\"></clr-icon>\r\n {{ 'catalog.display-variant-cards' | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n (click)=\"variantDisplayMode = 'table'\"\r\n [class.btn-primary]=\"variantDisplayMode === 'table'\"\r\n >\r\n <clr-icon shape=\"table\"></clr-icon>\r\n {{ 'catalog.display-variant-table' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"variant-filter\">\r\n <input\r\n [formControl]=\"filterInput\"\r\n [placeholder]=\"'catalog.filter-by-name-or-sku' | translate\"\r\n />\r\n <button class=\"icon-button\" (click)=\"filterInput.setValue('')\">\r\n <clr-icon shape=\"times\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <a\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n [routerLink]=\"['./', 'manage-variants']\"\r\n class=\"btn btn-secondary edit-variants-btn\"\r\n >\r\n <clr-icon shape=\"add-text\"></clr-icon>\r\n {{ 'catalog.manage-variants' | translate }}\r\n </a>\r\n </div>\r\n\r\n <div class=\"pagination-row mt4\" *ngIf=\"10 < (paginationConfig$ | async)?.totalItems\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [id]=\"(paginationConfig$ | async)?.id\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (pageChange)=\"setPage($event)\"\r\n ></vdr-pagination-controls>\r\n </div>\r\n\r\n <vdr-product-variants-table\r\n *ngIf=\"variantDisplayMode === 'table'\"\r\n [variants]=\"variants$ | async\"\r\n [paginationConfig]=\"paginationConfig$ | async\"\r\n [optionGroups]=\"product.optionGroups\"\r\n [channelPriceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [productVariantsFormArray]=\"detailForm.get('variants')\"\r\n [pendingAssetChanges]=\"variantAssetChanges\"\r\n ></vdr-product-variants-table>\r\n <vdr-product-variants-list\r\n *ngIf=\"variantDisplayMode === 'card'\"\r\n [variants]=\"variants$ | async\"\r\n [paginationConfig]=\"paginationConfig$ | async\"\r\n [channelPriceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [facets]=\"facets$ | async\"\r\n [optionGroups]=\"product.optionGroups\"\r\n [productVariantsFormArray]=\"detailForm.get('variants')\"\r\n [taxCategories]=\"taxCategories$ | async\"\r\n [customFields]=\"customVariantFields\"\r\n [customOptionFields]=\"customOptionFields\"\r\n [activeLanguage]=\"languageCode$ | async\"\r\n [pendingAssetChanges]=\"variantAssetChanges\"\r\n (assignToChannel)=\"assignVariantToChannel($event)\"\r\n (removeFromChannel)=\"removeVariantFromChannel($event)\"\r\n (assetChange)=\"variantAssetChange($event)\"\r\n (updateProductOption)=\"updateProductOption($event)\"\r\n (selectionChange)=\"selectedVariantIds = $event\"\r\n (selectFacetValueClick)=\"selectVariantFacetValue($event)\"\r\n ></vdr-product-variants-list>\r\n </section>\r\n <div class=\"pagination-row mt4\" *ngIf=\"10 < (paginationConfig$ | async)?.totalItems\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [id]=\"(paginationConfig$ | async)?.id\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (pageChange)=\"setPage($event)\"\r\n ></vdr-pagination-controls>\r\n </div>\r\n </clr-tab-content>\r\n </clr-tab>\r\n </clr-tabs>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { NgSelectComponent, SELECTION_MODEL_FACTORY } from '@ng-select/ng-select';\r\nimport { SearchProductsQuery, SingleSearchSelectionModelFactory } from '@vendure/admin-ui/core';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\n\r\ntype FacetValueResult = SearchProductsQuery['search']['facetValues'][number];\r\n\r\n@Component({\r\n selector: 'vdr-product-search-input',\r\n templateUrl: './product-search-input.component.html',\r\n styleUrls: ['./product-search-input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: SELECTION_MODEL_FACTORY, useValue: SingleSearchSelectionModelFactory }],\r\n})\r\nexport class ProductSearchInputComponent {\r\n @Input() facetValueResults: FacetValueResult;\r\n @Output() searchTermChange = new EventEmitter<string>();\r\n @Output() facetValueChange = new EventEmitter<string[]>();\r\n @ViewChild('selectComponent', { static: true }) private selectComponent: NgSelectComponent;\r\n private lastTerm = '';\r\n private lastFacetValueIds: string[] = [];\r\n\r\n setSearchTerm(term: string | null) {\r\n if (term) {\r\n this.selectComponent.select({ label: term, value: { label: term } });\r\n } else {\r\n const currentTerm = this.selectComponent.selectedItems.find(i => !this.isFacetValueItem(i.value));\r\n if (currentTerm) {\r\n this.selectComponent.unselect(currentTerm);\r\n }\r\n }\r\n }\r\n\r\n setFacetValues(ids: string[]) {\r\n const items = this.selectComponent.items;\r\n\r\n this.selectComponent.selectedItems.forEach(item => {\r\n if (this.isFacetValueItem(item.value) && !ids.includes(item.value.facetValue.id)) {\r\n this.selectComponent.unselect(item);\r\n }\r\n });\r\n\r\n ids.map(id => {\r\n return items?.find(item => this.isFacetValueItem(item) && item.facetValue.id === id);\r\n })\r\n .filter(notNullOrUndefined)\r\n .forEach(item => {\r\n const isSelected = this.selectComponent.selectedItems.find(i => {\r\n const val = i.value;\r\n if (this.isFacetValueItem(val)) {\r\n return val.facetValue.id === item.facetValue.id;\r\n }\r\n return false;\r\n });\r\n if (!isSelected) {\r\n this.selectComponent.select({ label: '', value: item });\r\n }\r\n });\r\n }\r\n\r\n filterFacetResults = (term: string, item: FacetValueResult | { label: string }) => {\r\n if (!this.isFacetValueItem(item)) {\r\n return false;\r\n }\r\n\r\n const cix = term.indexOf(':');\r\n const facetName = cix > -1 ? term.toLowerCase().slice(0, cix) : null;\r\n const facetVal = cix > -1 ? term.toLowerCase().slice(cix + 1) : term.toLowerCase();\r\n\r\n if (facetName) {\r\n return (\r\n item.facetValue.facet.name.toLowerCase().includes(facetName) &&\r\n item.facetValue.name.toLocaleLowerCase().includes(facetVal)\r\n );\r\n }\r\n\r\n return (\r\n item.facetValue.name.toLowerCase().includes(term.toLowerCase()) ||\r\n item.facetValue.facet.name.toLowerCase().includes(term.toLowerCase())\r\n );\r\n };\r\n\r\n onSelectChange(selectedItems: Array<FacetValueResult | { label: string }>) {\r\n if (!Array.isArray(selectedItems)) {\r\n selectedItems = [selectedItems];\r\n }\r\n const searchTermItem = selectedItems.find(item => !this.isFacetValueItem(item)) as\r\n | { label: string }\r\n | undefined;\r\n const searchTerm = searchTermItem ? searchTermItem.label : '';\r\n\r\n const facetValueIds = selectedItems.filter(this.isFacetValueItem).map(i => i.facetValue.id);\r\n\r\n if (searchTerm !== this.lastTerm) {\r\n this.searchTermChange.emit(searchTerm);\r\n this.lastTerm = searchTerm;\r\n }\r\n if (this.lastFacetValueIds.join(',') !== facetValueIds.join(',')) {\r\n this.facetValueChange.emit(facetValueIds);\r\n this.lastFacetValueIds = facetValueIds;\r\n }\r\n }\r\n\r\n addTagFn(item: any) {\r\n return { label: item };\r\n }\r\n\r\n isSearchHeaderSelected(): boolean {\r\n return this.selectComponent.itemsList.markedIndex === -1;\r\n }\r\n\r\n private isFacetValueItem = (input: unknown): input is FacetValueResult => {\r\n return typeof input === 'object' && !!input && input.hasOwnProperty('facetValue');\r\n };\r\n}\r\n","<ng-select\r\n [addTag]=\"addTagFn\"\r\n [placeholder]=\"'catalog.search-product-name-or-code' | translate\"\r\n [items]=\"facetValueResults\"\r\n [searchFn]=\"filterFacetResults\"\r\n [hideSelected]=\"true\"\r\n [multiple]=\"true\"\r\n [markFirst]=\"false\"\r\n (change)=\"onSelectChange($event)\"\r\n #selectComponent\r\n>\r\n <ng-template ng-header-tmp>\r\n <div\r\n class=\"search-header\"\r\n *ngIf=\"selectComponent.searchTerm\"\r\n [class.selected]=\"isSearchHeaderSelected()\"\r\n (click)=\"selectComponent.selectTag()\"\r\n >\r\n {{ 'catalog.search-for-term' | translate }}: {{ selectComponent.searchTerm }}\r\n </div>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <ng-container *ngIf=\"item.facetValue\">\r\n <vdr-facet-value-chip\r\n [facetValue]=\"item.facetValue\"\r\n [removable]=\"true\"\r\n (remove)=\"clear(item)\"\r\n ></vdr-facet-value-chip>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.facetValue\">\r\n <vdr-chip [icon]=\"'times'\" (iconClick)=\"clear(item)\">\"{{ item.label }}\"</vdr-chip>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\r\n <ng-container *ngIf=\"item.facetValue\">\r\n <vdr-facet-value-chip [facetValue]=\"item.facetValue\" [removable]=\"false\"></vdr-facet-value-chip>\r\n </ng-container>\r\n </ng-template>\r\n</ng-select>\r\n","import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n ItemOf,\r\n JobQueueService,\r\n JobState,\r\n LanguageCode,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n SearchInput,\r\n SearchProductsQuery,\r\n SearchProductsQueryVariables,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { delay, map, switchMap, take, takeUntil, tap, withLatestFrom } from 'rxjs/operators';\r\n\r\nimport { ProductSearchInputComponent } from '../product-search-input/product-search-input.component';\r\n\r\n@Component({\r\n selector: 'vdr-products-list',\r\n templateUrl: './product-list.component.html',\r\n styleUrls: ['./product-list.component.scss'],\r\n})\r\nexport class ProductListComponent\r\n extends BaseListComponent<\r\n SearchProductsQuery,\r\n ItemOf<SearchProductsQuery, 'search'>,\r\n SearchProductsQueryVariables\r\n >\r\n implements OnInit, AfterViewInit\r\n{\r\n searchTerm = '';\r\n facetValueIds: string[] = [];\r\n groupByProduct = true;\r\n selectedFacetValueIds$: Observable<string[]>;\r\n facetValues$: Observable<SearchProductsQuery['search']['facetValues']>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n pendingSearchIndexUpdates = 0;\r\n\r\n @ViewChild('productSearchInputComponent', { static: true })\r\n private productSearchInput: ProductSearchInputComponent;\r\n constructor(\r\n private dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private jobQueueService: JobQueueService,\r\n private serverConfigService: ServerConfigService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n this.route.queryParamMap\r\n .pipe(\r\n map(qpm => qpm.get('q')),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(term => {\r\n this.searchTerm = term || '';\r\n if (this.productSearchInput) {\r\n this.productSearchInput.setSearchTerm(term);\r\n }\r\n });\r\n this.selectedFacetValueIds$ = this.route.queryParamMap.pipe(map(qpm => qpm.getAll('fvids')));\r\n\r\n this.selectedFacetValueIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\r\n this.facetValueIds = ids;\r\n if (this.productSearchInput) {\r\n this.productSearchInput.setFacetValues(ids);\r\n }\r\n });\r\n super.setQueryFn(\r\n (...args: any[]) =>\r\n this.dataService.product.searchProducts(this.searchTerm, ...args).refetchOnChannelChange(),\r\n data => data.search,\r\n // tslint:disable-next-line:no-shadowed-variable\r\n (skip, take) => ({\r\n input: {\r\n skip,\r\n take,\r\n term: this.searchTerm,\r\n facetValueIds: this.facetValueIds,\r\n facetValueOperator: LogicalOperator.AND,\r\n groupByProduct: this.groupByProduct,\r\n } as SearchInput,\r\n }),\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n\r\n this.facetValues$ = this.result$.pipe(map(data => data.search.facetValues));\r\n\r\n this.facetValues$\r\n .pipe(take(1), delay(100), withLatestFrom(this.selectedFacetValueIds$))\r\n .subscribe(([__, ids]) => {\r\n this.productSearchInput.setFacetValues(ids);\r\n });\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n\r\n this.dataService.product\r\n .getPendingSearchIndexUpdates()\r\n .mapSingle(({ pendingSearchIndexUpdates }) => pendingSearchIndexUpdates)\r\n .subscribe(value => (this.pendingSearchIndexUpdates = value));\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.productSearchInput && this.searchTerm) {\r\n setTimeout(() => this.productSearchInput.setSearchTerm(this.searchTerm));\r\n }\r\n }\r\n\r\n setSearchTerm(term: string) {\r\n this.searchTerm = term;\r\n this.setQueryParam({ q: term || null, page: 1 });\r\n this.refresh();\r\n }\r\n\r\n setFacetValueIds(ids: string[]) {\r\n this.facetValueIds = ids;\r\n this.setQueryParam({ fvids: ids, page: 1 });\r\n this.refresh();\r\n }\r\n\r\n rebuildSearchIndex() {\r\n this.dataService.product.reindex().subscribe(({ reindex }) => {\r\n this.notificationService.info(_('catalog.reindexing'));\r\n this.jobQueueService.addJob(reindex.id, job => {\r\n if (job.state === JobState.COMPLETED) {\r\n const time = new Intl.NumberFormat().format(job.duration || 0);\r\n this.notificationService.success(_('catalog.reindex-successful'), {\r\n count: job.result.indexedItemCount,\r\n time,\r\n });\r\n this.refresh();\r\n } else {\r\n this.notificationService.error(_('catalog.reindex-error'));\r\n }\r\n });\r\n });\r\n }\r\n\r\n runPendingSearchIndexUpdates() {\r\n this.dataService.product.runPendingSearchIndexUpdates().subscribe(value => {\r\n this.notificationService.info(_('catalog.running-search-index-updates'), {\r\n count: this.pendingSearchIndexUpdates,\r\n });\r\n this.pendingSearchIndexUpdates = 0;\r\n });\r\n }\r\n\r\n deleteProduct(productId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response => (response ? this.dataService.product.deleteProduct(productId) : EMPTY)),\r\n // Short delay to allow the product to be removed from the search index before\r\n // refreshing.\r\n delay(500),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Product',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <div class=\"search-form\">\r\n <vdr-product-search-input\r\n #productSearchInputComponent\r\n [facetValueResults]=\"facetValues$ | async\"\r\n (searchTermChange)=\"setSearchTerm($event)\"\r\n (facetValueChange)=\"setFacetValueIds($event)\"\r\n ></vdr-product-search-input>\r\n <vdr-dropdown class=\"search-settings-menu mr3\">\r\n <button\r\n type=\"button\"\r\n class=\"icon-button search-index-button\"\r\n [title]=\"\r\n (pendingSearchIndexUpdates\r\n ? 'catalog.pending-search-index-updates'\r\n : 'catalog.search-index-controls'\r\n ) | translate\r\n \"\r\n vdrDropdownTrigger\r\n >\r\n <clr-icon shape=\"cog\"></clr-icon>\r\n <vdr-status-badge *ngIf=\"pendingSearchIndexUpdates\" type=\"warning\"> </vdr-status-badge>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <h4 class=\"dropdown-header\">{{ 'catalog.search-index-controls' | translate }}</h4>\r\n <ng-container *ngIf=\"pendingSearchIndexUpdates\">\r\n <button\r\n type=\"button\"\r\n class=\"run-updates-button\"\r\n vdrDropdownItem\r\n (click)=\"runPendingSearchIndexUpdates()\"\r\n [disabled]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n >\r\n <vdr-status-badge type=\"warning\"> </vdr-status-badge>\r\n {{\r\n 'catalog.run-pending-search-index-updates'\r\n | translate: { count: pendingSearchIndexUpdates }\r\n }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n </ng-container>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"rebuildSearchIndex()\"\r\n [disabled]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n >\r\n {{ 'catalog.rebuild-search-index' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n <div class=\"flex wrap\">\r\n <clr-checkbox-wrapper class=\"mt2\">\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"groupByProduct\" (ngModelChange)=\"refresh()\" />\r\n <label>{{ 'catalog.group-by-product' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateProduct']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n <span class=\"full-label\">{{ 'catalog.create-new-product' | translate }}</span>\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <ng-template let-result=\"item\">\r\n <td class=\"left align-middle\" [class.disabled]=\"!result.enabled\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"\r\n groupByProduct\r\n ? result.productAsset\r\n : result.productVariantAsset || result.productAsset as asset;\r\n else imagePlaceholder\r\n \"\r\n [src]=\"asset | assetPreview: 'tiny'\"\r\n />\r\n <ng-template #imagePlaceholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!result.enabled\">\r\n {{ groupByProduct ? result.productName : result.productVariantName }}\r\n </td>\r\n <td class=\"align-middle\" [class.disabled]=\"!result.enabled\">\r\n <vdr-chip *ngIf=\"!result.enabled\">{{ 'common.disabled' | translate }}</vdr-chip>\r\n </td>\r\n <td class=\"right align-middle\" [class.disabled]=\"!result.enabled\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', result.productId]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right align-middle\" [class.disabled]=\"!result.enabled\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteProduct(result.productId)\"\r\n [disabled]=\"!(['DeleteCatalog', 'DeleteProduct'] | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n findTranslation,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ProductOptionFragment,\r\n ProductOptionGroup,\r\n ProductOptionGroupFragment,\r\n ServerConfigService,\r\n UpdateProductOptionGroupInput,\r\n UpdateProductOptionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, take } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\n\r\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\r\n\r\n@Component({\r\n selector: 'vdr-product-options-editor',\r\n templateUrl: './product-options-editor.component.html',\r\n styleUrls: ['./product-options-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\r\n detailForm: FormGroup;\r\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\r\n languageCode$: Observable<LanguageCode>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n optionGroupCustomFields: CustomFieldConfig[];\r\n optionCustomFields: CustomFieldConfig[];\r\n autoUpdateVariantNames = true;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n\r\n constructor(\r\n protected route: ActivatedRoute,\r\n protected router: Router,\r\n protected serverConfigService: ServerConfigService,\r\n protected dataService: DataService,\r\n private productDetailService: ProductDetailService,\r\n private formBuilder: FormBuilder,\r\n private changeDetector: ChangeDetectorRef,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\r\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\r\n }\r\n\r\n ngOnInit(): void {\r\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\r\n map((product: ProductWithOptions) => product.optionGroups),\r\n );\r\n this.detailForm = new FormGroup({\r\n optionGroups: new FormArray([]),\r\n });\r\n super.init();\r\n }\r\n\r\n getOptionGroups(): FormGroup[] {\r\n const optionGroups = this.detailForm.get('optionGroups');\r\n return (optionGroups as FormArray).controls as FormGroup[];\r\n }\r\n\r\n getOptions(optionGroup: FormGroup): FormGroup[] {\r\n const options = optionGroup.get('options');\r\n return (options as FormArray).controls as FormGroup[];\r\n }\r\n\r\n save() {\r\n if (this.detailForm.invalid || this.detailForm.pristine) {\r\n return;\r\n }\r\n // tslint:disable-next-line:no-non-null-assertion\r\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\r\n combineLatest(this.entity$, this.languageCode$, $product)\r\n .pipe(\r\n take(1),\r\n mergeMap(([{ optionGroups }, languageCode, product]) => {\r\n const updateOperations: Array<Observable<any>> = [];\r\n for (const optionGroupForm of this.getOptionGroups()) {\r\n if (optionGroupForm.get('name')?.dirty || optionGroupForm.get('code')?.dirty) {\r\n const optionGroupEntity = optionGroups.find(\r\n og => og.id === optionGroupForm.value.id,\r\n );\r\n if (optionGroupEntity) {\r\n const input = this.getUpdatedOptionGroup(\r\n optionGroupEntity,\r\n optionGroupForm,\r\n languageCode,\r\n );\r\n updateOperations.push(\r\n this.dataService.product.updateProductOptionGroup(input),\r\n );\r\n }\r\n }\r\n\r\n for (const optionForm of this.getOptions(optionGroupForm)) {\r\n if (optionForm.get('name')?.dirty || optionForm.get('code')?.dirty) {\r\n const optionGroup = optionGroups\r\n .find(og => og.id === optionGroupForm.value.id)\r\n ?.options.find(o => o.id === optionForm.value.id);\r\n if (optionGroup) {\r\n const input = this.getUpdatedOption(\r\n optionGroup,\r\n optionForm,\r\n languageCode,\r\n );\r\n updateOperations.push(\r\n this.productDetailService.updateProductOption(\r\n { ...input, autoUpdate: this.autoUpdateVariantNames },\r\n product,\r\n languageCode,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return forkJoin(updateOperations);\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private getUpdatedOptionGroup(\r\n optionGroup: ProductOptionGroupFragment,\r\n optionGroupFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductOptionGroupInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: optionGroup,\r\n updatedFields: optionGroupFormGroup.value,\r\n customFieldConfig: this.optionGroupCustomFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: optionGroup.name || '',\r\n },\r\n });\r\n return input;\r\n }\r\n\r\n private getUpdatedOption(\r\n option: ProductOptionFragment,\r\n optionFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductOptionInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: option,\r\n updatedFields: optionFormGroup.value,\r\n customFieldConfig: this.optionGroupCustomFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: option.name || '',\r\n },\r\n });\r\n return input;\r\n }\r\n\r\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\r\n const groupsFormArray = new FormArray([]);\r\n for (const optionGroup of entity.optionGroups) {\r\n const groupTranslation = findTranslation(optionGroup, languageCode);\r\n const group = {\r\n id: optionGroup.id,\r\n createdAt: optionGroup.createdAt,\r\n updatedAt: optionGroup.updatedAt,\r\n code: optionGroup.code,\r\n name: groupTranslation ? groupTranslation.name : '',\r\n };\r\n const optionsFormArray = new FormArray([]);\r\n\r\n for (const option of optionGroup.options) {\r\n const optionTranslation = findTranslation(option, languageCode);\r\n const optionControl = this.formBuilder.group({\r\n id: option.id,\r\n createdAt: option.createdAt,\r\n updatedAt: option.updatedAt,\r\n code: option.code,\r\n name: optionTranslation ? optionTranslation.name : '',\r\n });\r\n optionsFormArray.push(optionControl);\r\n }\r\n\r\n const groupControl = this.formBuilder.group(group);\r\n groupControl.addControl('options', optionsFormArray);\r\n groupsFormArray.push(groupControl);\r\n }\r\n this.detailForm.setControl('optionGroups', groupsFormArray);\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <div class=\"flex center\">\r\n <div class=\"mr2\">\r\n <clr-checkbox-wrapper>\r\n <input\r\n clrCheckbox\r\n type=\"checkbox\"\r\n id=\"auto-update\"\r\n [(ngModel)]=\"autoUpdateVariantNames\"\r\n />\r\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.pristine || detailForm.invalid\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </div>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\r\n <div formGroupName=\"optionGroups\" class=\"clr-row\">\r\n <div class=\"clr-col-12 clr-col-xl-6\" *ngFor=\"let optionGroup of getOptionGroups(); index as i\">\r\n <section class=\"card\" [formArrayName]=\"i\">\r\n <div class=\"card-header option-group-header\">\r\n <vdr-entity-info [entity]=\"optionGroup.value\"></vdr-entity-info>\r\n <div class=\"ml2\">{{ optionGroup.value.code }}</div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n [id]=\"'name-' + i\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input\r\n [id]=\"'code-' + i\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n <section class=\"card-block\">\r\n <table class=\"facet-values-list table mt2 mb4\" formGroupName=\"options\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'common.code' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n class=\"facet-value\"\r\n *ngFor=\"let option of getOptions(optionGroup); let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <td class=\"align-middle\">\r\n <vdr-entity-info [entity]=\"option.value\"></vdr-entity-info>\r\n </td>\r\n <td class=\"align-middle\">\r\n <input\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\"><input type=\"text\" formControlName=\"code\" /></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </section>\r\n </section>\r\n </div>\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Dialog, GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-confirm-variant-deletion-dialog',\r\n templateUrl: './confirm-variant-deletion-dialog.component.html',\r\n styleUrls: ['./confirm-variant-deletion-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfirmVariantDeletionDialogComponent implements Dialog<boolean> {\r\n resolveWith: (result?: boolean) => void;\r\n variants: NonNullable<GetProductVariantOptionsQuery['product']>['variants'] = [];\r\n\r\n confirm() {\r\n this.resolveWith(true);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.confirm-deletion-of-unused-variants-title' | translate }}\r\n</ng-template>\r\n{{ 'catalog.confirm-deletion-of-unused-variants-body' | translate }}\r\n<ul>\r\n <li *ngFor=\"let variant of variants\">{{ variant.name }} ({{ variant.sku }})</li>\r\n</ul>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateProductOptionGroupMutation,\r\n CreateProductOptionInput,\r\n CurrencyCode,\r\n DataService,\r\n DeactivateAware,\r\n getDefaultUiLanguage,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n ProductOptionGroupWithOptionsFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { generateAllCombinations, notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, forkJoin, Observable, of } from 'rxjs';\r\nimport { filter, map, mergeMap, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ConfirmVariantDeletionDialogComponent } from '../confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\r\n\r\nexport class GeneratedVariant {\r\n isDefault: boolean;\r\n options: Array<{ name: string; id?: string }>;\r\n productVariantId?: string;\r\n enabled: boolean;\r\n existing: boolean;\r\n sku: string;\r\n price: number;\r\n stock: number;\r\n\r\n constructor(config: Partial<GeneratedVariant>) {\r\n for (const key of Object.keys(config)) {\r\n this[key] = config[key];\r\n }\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-editor',\r\n templateUrl: './product-variants-editor.component.html',\r\n styleUrls: ['./product-variants-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class ProductVariantsEditorComponent implements OnInit, DeactivateAware {\r\n formValueChanged = false;\r\n generatedVariants: GeneratedVariant[] = [];\r\n optionGroups: Array<{\r\n id?: string;\r\n isNew: boolean;\r\n name: string;\r\n values: Array<{\r\n id?: string;\r\n name: string;\r\n locked: boolean;\r\n }>;\r\n }>;\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n currencyCode: CurrencyCode;\r\n private languageCode: LanguageCode;\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private dataService: DataService,\r\n private productDetailService: ProductDetailService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.initOptionsAndVariants();\r\n this.languageCode =\r\n (this.route.snapshot.paramMap.get('lang') as LanguageCode) || getDefaultUiLanguage();\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.currencyCode;\r\n });\r\n }\r\n\r\n onFormChanged(variantInfo: GeneratedVariant) {\r\n this.formValueChanged = true;\r\n variantInfo.enabled = true;\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return !this.formValueChanged;\r\n }\r\n\r\n getVariantsToAdd() {\r\n return this.generatedVariants.filter(v => !v.existing && v.enabled);\r\n }\r\n\r\n getVariantName(variant: GeneratedVariant) {\r\n return variant.options.length === 0\r\n ? _('catalog.default-variant')\r\n : variant.options.map(o => o.name).join(' ');\r\n }\r\n\r\n addOption() {\r\n this.optionGroups.push({\r\n isNew: true,\r\n name: '',\r\n values: [],\r\n });\r\n }\r\n\r\n generateVariants() {\r\n const groups = this.optionGroups.map(g => g.values);\r\n const previousVariants = this.generatedVariants;\r\n const generatedVariantFactory = (\r\n isDefault: boolean,\r\n options: GeneratedVariant['options'],\r\n existingVariant?: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n prototypeVariant?: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n ): GeneratedVariant => {\r\n const prototype = this.getVariantPrototype(options, previousVariants);\r\n return new GeneratedVariant({\r\n enabled: true,\r\n existing: !!existingVariant,\r\n productVariantId: existingVariant?.id,\r\n isDefault,\r\n options,\r\n price: existingVariant?.price ?? prototypeVariant?.price ?? prototype.price,\r\n sku: existingVariant?.sku ?? prototypeVariant?.sku ?? prototype.sku,\r\n stock: existingVariant?.stockOnHand ?? prototypeVariant?.stockOnHand ?? prototype.stock,\r\n });\r\n };\r\n this.generatedVariants = groups.length\r\n ? generateAllCombinations(groups).map(options => {\r\n const existingVariant = this.product.variants.find(v =>\r\n this.optionsAreEqual(v.options, options),\r\n );\r\n const prototypeVariant = this.product.variants.find(v =>\r\n this.optionsAreSubset(v.options, options),\r\n );\r\n return generatedVariantFactory(false, options, existingVariant, prototypeVariant);\r\n })\r\n : [generatedVariantFactory(true, [], this.product.variants[0])];\r\n }\r\n\r\n /**\r\n * Returns one of the existing variants to base the newly-generated variant's\r\n * details off.\r\n */\r\n private getVariantPrototype(\r\n options: GeneratedVariant['options'],\r\n previousVariants: GeneratedVariant[],\r\n ): Pick<GeneratedVariant, 'sku' | 'price' | 'stock'> {\r\n const variantsWithSimilarOptions = previousVariants.filter(v =>\r\n options.map(o => o.name).filter(name => v.options.map(o => o.name).includes(name)),\r\n );\r\n if (variantsWithSimilarOptions.length) {\r\n return pick(previousVariants[0], ['sku', 'price', 'stock']);\r\n }\r\n return {\r\n sku: '',\r\n price: 0,\r\n stock: 0,\r\n };\r\n }\r\n\r\n deleteVariant(id: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-variant'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response ? this.productDetailService.deleteProductVariant(id, this.product.id) : EMPTY,\r\n ),\r\n switchMap(() => this.reFetchProduct(null)),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.initOptionsAndVariants();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'ProductVariant',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n const newOptionGroups = this.optionGroups\r\n .filter(og => og.isNew)\r\n .map(og => ({\r\n name: og.name,\r\n values: [],\r\n }));\r\n\r\n this.checkUniqueSkus()\r\n .pipe(\r\n mergeMap(() => this.confirmDeletionOfObsoleteVariants()),\r\n mergeMap(() =>\r\n this.productDetailService.createProductOptionGroups(newOptionGroups, this.languageCode),\r\n ),\r\n mergeMap(createdOptionGroups => this.addOptionGroupsToProduct(createdOptionGroups)),\r\n mergeMap(createdOptionGroups => this.addNewOptionsToGroups(createdOptionGroups)),\r\n mergeMap(groupsIds => this.fetchOptionGroups(groupsIds)),\r\n mergeMap(groups => this.createNewProductVariants(groups)),\r\n mergeMap(res => this.deleteObsoleteVariants(res.createProductVariants)),\r\n mergeMap(variants => this.reFetchProduct(variants)),\r\n )\r\n .subscribe({\r\n next: variants => {\r\n this.formValueChanged = false;\r\n this.notificationService.success(_('catalog.created-new-variants-success'), {\r\n count: variants.length,\r\n });\r\n this.initOptionsAndVariants();\r\n },\r\n });\r\n }\r\n\r\n private checkUniqueSkus() {\r\n const withDuplicateSkus = this.generatedVariants.filter((variant, index) => {\r\n return this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant);\r\n });\r\n if (withDuplicateSkus.length) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.duplicate-sku-warning'),\r\n body: unique(withDuplicateSkus.map(v => `${v.sku}`)).join(', '),\r\n buttons: [{ label: _('common.close'), returnValue: false, type: 'primary' }],\r\n })\r\n .pipe(mergeMap(res => EMPTY));\r\n } else {\r\n return of(true);\r\n }\r\n }\r\n\r\n private confirmDeletionOfObsoleteVariants(): Observable<boolean> {\r\n const obsoleteVariants = this.getObsoleteVariants();\r\n if (obsoleteVariants.length) {\r\n return this.modalService\r\n .fromComponent(ConfirmVariantDeletionDialogComponent, {\r\n locals: {\r\n variants: obsoleteVariants,\r\n },\r\n })\r\n .pipe(\r\n mergeMap(res => {\r\n return res === true ? of(true) : EMPTY;\r\n }),\r\n );\r\n } else {\r\n return of(true);\r\n }\r\n }\r\n\r\n private getObsoleteVariants() {\r\n return this.product.variants.filter(\r\n variant => !this.generatedVariants.find(gv => gv.productVariantId === variant.id),\r\n );\r\n }\r\n\r\n private hasOnlyDefaultVariant(product: NonNullable<GetProductVariantOptionsQuery['product']>): boolean {\r\n return product.variants.length === 1 && product.optionGroups.length === 0;\r\n }\r\n\r\n private addOptionGroupsToProduct(\r\n createdOptionGroups: Array<CreateProductOptionGroupMutation['createProductOptionGroup']>,\r\n ): Observable<Array<CreateProductOptionGroupMutation['createProductOptionGroup']>> {\r\n if (createdOptionGroups.length) {\r\n return forkJoin(\r\n createdOptionGroups.map(optionGroup => {\r\n return this.dataService.product.addOptionGroupToProduct({\r\n productId: this.product.id,\r\n optionGroupId: optionGroup.id,\r\n });\r\n }),\r\n ).pipe(map(() => createdOptionGroups));\r\n } else {\r\n return of([]);\r\n }\r\n }\r\n\r\n private addNewOptionsToGroups(\r\n createdOptionGroups: Array<CreateProductOptionGroupMutation['createProductOptionGroup']>,\r\n ): Observable<string[]> {\r\n const newOptions: CreateProductOptionInput[] = this.optionGroups\r\n .map(og => {\r\n const createdGroup = createdOptionGroups.find(cog => cog.name === og.name);\r\n const productOptionGroupId = createdGroup ? createdGroup.id : og.id;\r\n if (!productOptionGroupId) {\r\n throw new Error('Could not get a productOptionGroupId');\r\n }\r\n return og.values\r\n .filter(v => !v.locked)\r\n .map(v => ({\r\n productOptionGroupId,\r\n code: normalizeString(v.name, '-'),\r\n translations: [{ name: v.name, languageCode: this.languageCode }],\r\n }));\r\n })\r\n .reduce((flat, options) => [...flat, ...options], []);\r\n\r\n const allGroupIds = [\r\n ...createdOptionGroups.map(g => g.id),\r\n ...this.optionGroups.map(g => g.id).filter(notNullOrUndefined),\r\n ];\r\n\r\n if (newOptions.length) {\r\n return forkJoin(newOptions.map(input => this.dataService.product.addOptionToGroup(input))).pipe(\r\n map(() => allGroupIds),\r\n );\r\n } else {\r\n return of(allGroupIds);\r\n }\r\n }\r\n\r\n private fetchOptionGroups(groupsIds: string[]): Observable<ProductOptionGroupWithOptionsFragment[]> {\r\n return forkJoin(\r\n groupsIds.map(id =>\r\n this.dataService.product\r\n .getProductOptionGroup(id)\r\n .mapSingle(data => data.productOptionGroup)\r\n .pipe(filter(notNullOrUndefined)),\r\n ),\r\n );\r\n }\r\n\r\n private createNewProductVariants(groups: ProductOptionGroupWithOptionsFragment[]) {\r\n const options = groups\r\n .filter(notNullOrUndefined)\r\n .map(og => og.options)\r\n .reduce((flat, o) => [...flat, ...o], []);\r\n const variants = this.generatedVariants\r\n .filter(v => v.enabled && !v.existing)\r\n .map(v => ({\r\n price: v.price,\r\n sku: v.sku,\r\n stock: v.stock,\r\n optionIds: v.options\r\n .map(name => options.find(o => o.name === name.name))\r\n .filter(notNullOrUndefined)\r\n .map(o => o.id),\r\n }));\r\n return this.productDetailService.createProductVariants(\r\n this.product,\r\n variants,\r\n options,\r\n this.languageCode,\r\n );\r\n }\r\n\r\n private deleteObsoleteVariants<T>(input: T): Observable<T | T[]> {\r\n const obsoleteVariants = this.getObsoleteVariants();\r\n if (obsoleteVariants.length) {\r\n const deleteOperations = obsoleteVariants.map(v =>\r\n this.dataService.product.deleteProductVariant(v.id).pipe(map(() => input)),\r\n );\r\n return forkJoin(...deleteOperations);\r\n } else {\r\n return of(input);\r\n }\r\n }\r\n\r\n private reFetchProduct<T>(input: T): Observable<T> {\r\n // Re-fetch the Product to force an update to the view.\r\n const id = this.route.snapshot.paramMap.get('id');\r\n if (id) {\r\n return this.dataService.product.getProduct(id).single$.pipe(map(() => input));\r\n } else {\r\n return of(input);\r\n }\r\n }\r\n\r\n initOptionsAndVariants() {\r\n this.dataService.product\r\n // tslint:disable-next-line:no-non-null-assertion\r\n .getProductVariantsOptions(this.route.snapshot.paramMap.get('id')!)\r\n // tslint:disable-next-line:no-non-null-assertion\r\n .mapSingle(({ product }) => product!)\r\n .subscribe(p => {\r\n this.product = p;\r\n this.optionGroups = p.optionGroups.map(og => {\r\n return {\r\n id: og.id,\r\n isNew: false,\r\n name: og.name,\r\n values: og.options.map(o => ({\r\n id: o.id,\r\n name: o.name,\r\n locked: true,\r\n })),\r\n };\r\n });\r\n this.generateVariants();\r\n });\r\n }\r\n\r\n private optionsAreEqual(a: Array<{ name: string }>, b: Array<{ name: string }>): boolean {\r\n return this.toOptionString(a) === this.toOptionString(b);\r\n }\r\n\r\n private optionsAreSubset(a: Array<{ name: string }>, b: Array<{ name: string }>): boolean {\r\n return this.toOptionString(b).includes(this.toOptionString(a));\r\n }\r\n\r\n private toOptionString(o: Array<{ name: string }>): string {\r\n return o\r\n .map(x => x.name)\r\n .sort()\r\n .join('|');\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!formValueChanged || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n</div>\r\n<button\r\n class=\"btn btn-primary-outline btn-sm\"\r\n (click)=\"addOption()\"\r\n>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.create' | translate }}</th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"!variant.existing\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AssetFragment, AssetType, BaseEntityResolver, DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AssetResolver extends BaseEntityResolver<AssetFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Asset' as const,\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n type: AssetType.IMAGE,\r\n fileSize: 0,\r\n mimeType: '',\r\n width: 0,\r\n height: 0,\r\n source: '',\r\n preview: '',\r\n focalPoint: null,\r\n },\r\n id => dataService.product.getAsset(id).mapStream(data => data.asset),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n BaseEntityResolver,\n CollectionFragment,\n DataService,\n getDefaultUiLanguage,\n} from '@vendure/admin-ui/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CollectionResolver extends BaseEntityResolver<CollectionFragment> {\n constructor(router: Router, dataService: DataService) {\n super(\n router,\n {\n __typename: 'Collection' as 'Collection',\n id: '',\n createdAt: '',\n updatedAt: '',\n languageCode: getDefaultUiLanguage(),\n name: '',\n slug: '',\n isPrivate: false,\n description: '',\n featuredAsset: null,\n assets: [],\n translations: [],\n inheritFilters: true,\n filters: [],\n parent: {} as any,\n children: null,\n },\n id => dataService.collection.getCollection(id).mapStream(data => data.collection),\n );\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n BaseEntityResolver,\r\n DataService,\r\n FacetWithValuesFragment,\r\n getDefaultUiLanguage,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FacetResolver extends BaseEntityResolver<FacetWithValuesFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Facet' as 'Facet',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n isPrivate: false,\r\n languageCode: getDefaultUiLanguage(),\r\n name: '',\r\n code: '',\r\n translations: [],\r\n values: [],\r\n },\r\n id => dataService.facet.getFacet(id).mapStream(data => data.facet),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n BaseEntityResolver,\r\n DataService,\r\n getDefaultUiLanguage,\r\n GetProductWithVariantsQuery,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductResolver extends BaseEntityResolver<GetProductWithVariantsQuery['product']> {\r\n constructor(dataService: DataService, router: Router) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Product' as 'Product',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n enabled: true,\r\n languageCode: getDefaultUiLanguage(),\r\n name: '',\r\n slug: '',\r\n featuredAsset: null,\r\n assets: [],\r\n description: '',\r\n translations: [],\r\n optionGroups: [],\r\n facetValues: [],\r\n variantList: { items: [], totalItems: 0 },\r\n channels: [],\r\n },\r\n id =>\r\n dataService.product\r\n .getProduct(id, { take: 10 })\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.product),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver } from '@vendure/admin-ui/core';\r\nimport { GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductVariantsResolver extends BaseEntityResolver<GetProductVariantOptionsQuery['product']> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Product' as 'Product',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n optionGroups: [],\r\n variants: [],\r\n },\r\n id => dataService.product.getProductVariantsOptions(id).mapStream(data => data.product),\r\n );\r\n }\r\n}\r\n","import { Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n AssetFragment,\r\n CanDeactivateDetailGuard,\r\n CollectionFragment,\r\n createResolveData,\r\n detailBreadcrumb,\r\n FacetWithValuesFragment,\r\n GetProductWithVariantsQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\r\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\r\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\r\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\r\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\r\nimport { ProductListComponent } from './components/product-list/product-list.component';\r\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { AssetResolver } from './providers/routing/asset-resolver';\r\nimport { CollectionResolver } from './providers/routing/collection-resolver';\r\nimport { FacetResolver } from './providers/routing/facet-resolver';\r\nimport { ProductResolver } from './providers/routing/product-resolver';\r\nimport { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\r\n\r\nexport const catalogRoutes: Route[] = [\r\n {\r\n path: 'products',\r\n component: ProductListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.products'),\r\n },\r\n },\r\n {\r\n path: 'products/:id',\r\n component: ProductDetailComponent,\r\n resolve: createResolveData(ProductResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'products/:id/manage-variants',\r\n component: ProductVariantsEditorComponent,\r\n resolve: createResolveData(ProductVariantsResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productVariantEditorBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'products/:id/options',\r\n component: ProductOptionsEditorComponent,\r\n resolve: createResolveData(ProductVariantsResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productOptionsEditorBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'facets',\r\n component: FacetListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.facets'),\r\n },\r\n },\r\n {\r\n path: 'facets/:id',\r\n component: FacetDetailComponent,\r\n resolve: createResolveData(FacetResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: facetBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'collections',\r\n component: CollectionListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.collections'),\r\n },\r\n },\r\n {\r\n path: 'collections/:id',\r\n component: CollectionDetailComponent,\r\n resolve: createResolveData(CollectionResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: collectionBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'assets',\r\n component: AssetListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.assets'),\r\n },\r\n },\r\n {\r\n path: 'assets/:id',\r\n component: AssetDetailComponent,\r\n resolve: createResolveData(AssetResolver),\r\n data: {\r\n breadcrumb: assetBreadcrumb,\r\n },\r\n },\r\n];\r\n\r\nexport function productBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<NonNullable<GetProductWithVariantsQuery['product']>>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.products',\r\n getName: product => product.name,\r\n route: 'products',\r\n });\r\n}\r\n\r\nexport function productVariantEditorBreadcrumb(data: any, params: any) {\r\n return data.entity.pipe(\r\n map((entity: any) => {\r\n return [\r\n {\r\n label: _('breadcrumb.products'),\r\n link: ['../', 'products'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'products', params.id, { tab: 'variants' }],\r\n },\r\n {\r\n label: _('breadcrumb.manage-variants'),\r\n link: ['manage-variants'],\r\n },\r\n ];\r\n }),\r\n );\r\n}\r\n\r\nexport function productOptionsEditorBreadcrumb(data: any, params: any) {\r\n return data.entity.pipe(\r\n map((entity: any) => {\r\n return [\r\n {\r\n label: _('breadcrumb.products'),\r\n link: ['../', 'products'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'products', params.id, { tab: 'variants' }],\r\n },\r\n {\r\n label: _('breadcrumb.product-options'),\r\n link: ['options'],\r\n },\r\n ];\r\n }),\r\n );\r\n}\r\n\r\nexport function facetBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<FacetWithValuesFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.facets',\r\n getName: facet => facet.name,\r\n route: 'facets',\r\n });\r\n}\r\n\r\nexport function collectionBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<CollectionFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.collections',\r\n getName: collection => collection.name,\r\n route: 'collections',\r\n });\r\n}\r\n\r\nexport function assetBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<AssetFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.assets',\r\n getName: asset => asset.name,\r\n route: 'assets',\r\n });\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { SharedModule } from '@vendure/admin-ui/core';\r\n\r\nimport { catalogRoutes } from './catalog.routes';\r\nimport { ApplyFacetDialogComponent } from './components/apply-facet-dialog/apply-facet-dialog.component';\r\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\r\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\r\nimport { AssetsComponent } from './components/assets/assets.component';\r\nimport { AssignProductsToChannelDialogComponent } from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { CollectionContentsComponent } from './components/collection-contents/collection-contents.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\r\nimport { CollectionTreeNodeComponent } from './components/collection-tree/collection-tree-node.component';\r\nimport { CollectionTreeComponent } from './components/collection-tree/collection-tree.component';\r\nimport { ConfirmVariantDeletionDialogComponent } from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\r\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\r\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\r\nimport { GenerateProductVariantsComponent } from './components/generate-product-variants/generate-product-variants.component';\r\nimport { OptionValueInputComponent } from './components/option-value-input/option-value-input.component';\r\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\r\nimport { ProductListComponent } from './components/product-list/product-list.component';\r\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\r\nimport { ProductSearchInputComponent } from './components/product-search-input/product-search-input.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { ProductVariantsListComponent } from './components/product-variants-list/product-variants-list.component';\r\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\r\nimport { UpdateProductOptionDialogComponent } from './components/update-product-option-dialog/update-product-option-dialog.component';\r\nimport { VariantPriceDetailComponent } from './components/variant-price-detail/variant-price-detail.component';\r\n\r\nconst CATALOG_COMPONENTS = [\r\n ProductListComponent,\r\n ProductDetailComponent,\r\n FacetListComponent,\r\n FacetDetailComponent,\r\n GenerateProductVariantsComponent,\r\n ProductVariantsListComponent,\r\n ApplyFacetDialogComponent,\r\n AssetListComponent,\r\n AssetsComponent,\r\n VariantPriceDetailComponent,\r\n CollectionListComponent,\r\n CollectionDetailComponent,\r\n CollectionTreeComponent,\r\n CollectionTreeNodeComponent,\r\n CollectionContentsComponent,\r\n ProductVariantsTableComponent,\r\n ProductSearchInputComponent,\r\n OptionValueInputComponent,\r\n UpdateProductOptionDialogComponent,\r\n ProductVariantsEditorComponent,\r\n AssignProductsToChannelDialogComponent,\r\n AssetDetailComponent,\r\n ConfirmVariantDeletionDialogComponent,\r\n ProductOptionsEditorComponent,\r\n];\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild(catalogRoutes)],\r\n exports: [...CATALOG_COMPONENTS],\r\n declarations: [...CATALOG_COMPONENTS],\r\n})\r\nexport class CatalogModule {}\r\n","// This file was generated by the build-public-api.ts script\nexport * from './catalog.module';\nexport * from './catalog.routes';\nexport * from './components/apply-facet-dialog/apply-facet-dialog.component';\nexport * from './components/asset-detail/asset-detail.component';\nexport * from './components/asset-list/asset-list.component';\nexport * from './components/assets/assets.component';\nexport * from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nexport * from './components/collection-contents/collection-contents.component';\nexport * from './components/collection-detail/collection-detail.component';\nexport * from './components/collection-list/collection-list.component';\nexport * from './components/collection-tree/array-to-tree';\nexport * from './components/collection-tree/collection-tree-node.component';\nexport * from './components/collection-tree/collection-tree.component';\nexport * from './components/collection-tree/collection-tree.service';\nexport * from './components/collection-tree/collection-tree.types';\nexport * from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\nexport * from './components/facet-detail/facet-detail.component';\nexport * from './components/facet-list/facet-list.component';\nexport * from './components/generate-product-variants/generate-product-variants.component';\nexport * from './components/option-value-input/option-value-input.component';\nexport * from './components/product-detail/product-detail.component';\nexport * from './components/product-detail/product-detail.types';\nexport * from './components/product-list/product-list.component';\nexport * from './components/product-options-editor/product-options-editor.component';\nexport * from './components/product-search-input/product-search-input.component';\nexport * from './components/product-variants-editor/product-variants-editor.component';\nexport * from './components/product-variants-list/product-variants-list.component';\nexport * from './components/product-variants-table/product-variants-table.component';\nexport * from './components/update-product-option-dialog/update-product-option-dialog.component';\nexport * from './components/variant-price-detail/variant-price-detail.component';\nexport * from './providers/product-detail/product-detail.service';\nexport * from './providers/product-detail/replace-last';\nexport * from './providers/routing/asset-resolver';\nexport * from './providers/routing/collection-resolver';\nexport * from './providers/routing/facet-resolver';\nexport * from './providers/routing/product-resolver';\nexport * from './providers/routing/product-variants-resolver';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["_","SortOrder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vendure-admin-ui-catalog.mjs","sources":["../../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/assets/assets.component.ts","../../src/lib/catalog/src/components/assets/assets.component.html","../../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-detail/collection-detail.component.ts","../../src/lib/catalog/src/components/collection-detail/collection-detail.component.html","../../src/lib/catalog/src/components/collection-tree/array-to-tree.ts","../../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/collection-tree.component.ts","../../src/lib/catalog/src/components/collection-tree/collection-tree.component.html","../../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/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.component.ts","../../src/lib/catalog/src/components/facet-list/facet-list.component.html","../../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/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/providers/product-detail/replace-last.ts","../../src/lib/catalog/src/providers/product-detail/product-detail.service.ts","../../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/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-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/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/product-variants-list/product-variants-list.component.ts","../../src/lib/catalog/src/components/product-variants-list/product-variants-list.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-list/product-list.component.ts","../../src/lib/catalog/src/components/product-list/product-list.component.html","../../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/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/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/providers/routing/asset-resolver.ts","../../src/lib/catalog/src/providers/routing/collection-resolver.ts","../../src/lib/catalog/src/providers/routing/facet-resolver.ts","../../src/lib/catalog/src/providers/routing/product-resolver.ts","../../src/lib/catalog/src/providers/routing/product-variants-resolver.ts","../../src/lib/catalog/src/catalog.routes.ts","../../src/lib/catalog/src/components/assign-to-channel-dialog/assign-to-channel-dialog.component.ts","../../src/lib/catalog/src/components/assign-to-channel-dialog/assign-to-channel-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/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/collection-list/collection-list-bulk-actions.ts","../../src/lib/catalog/src/components/facet-list/facet-list-bulk-actions.ts","../../src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts","../../src/lib/catalog/src/catalog.module.ts","../../src/lib/catalog/src/public_api.ts","../../src/lib/catalog/src/vendure-admin-ui-catalog.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n BaseDetailComponent,\r\n CustomFieldConfig,\r\n DataService,\r\n GetAssetQuery,\r\n LanguageCode,\r\n NotificationService,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-asset-detail',\r\n templateUrl: './asset-detail.component.html',\r\n styleUrls: ['./asset-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssetDetailComponent\r\n extends BaseDetailComponent<NonNullable<GetAssetQuery['asset']>>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm = new FormGroup({});\r\n customFields: CustomFieldConfig[];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Asset');\r\n }\r\n\r\n ngOnInit() {\r\n this.detailForm = new FormGroup({\r\n name: new FormControl(''),\r\n tags: new FormControl([]),\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n this.init();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n onAssetChange(event: { id: string; name: string; tags: string[] }) {\r\n this.detailForm.get('name')?.setValue(event.name);\r\n this.detailForm.get('tags')?.setValue(event.tags);\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n save() {\r\n this.dataService.product\r\n .updateAsset({\r\n id: this.id,\r\n name: this.detailForm.value.name,\r\n tags: this.detailForm.value.tags,\r\n customFields: this.detailForm.value.customFields,\r\n })\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Asset' });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Asset',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(entity: NonNullable<GetAssetQuery['asset']>, languageCode: LanguageCode): void {\r\n this.detailForm.get('name')?.setValue(entity.name);\r\n this.detailForm.get('tags')?.setValue(entity.tags);\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get(['customFields']), entity);\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"asset-detail\"></vdr-action-bar-items>\r\n <button\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateAsset']\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<vdr-asset-preview\r\n [asset]=\"entity$ | async\"\r\n [editable]=\"true\"\r\n [customFields]=\"customFields\"\r\n [customFieldsForm]=\"detailForm.get('customFields')\"\r\n (assetChange)=\"onAssetChange($event)\"\r\n></vdr-asset-preview>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n BaseListComponent,\r\n DataService,\r\n DeletionResult,\r\n GetAssetListQuery,\r\n GetAssetListQueryVariables,\r\n ItemOf,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n SortOrder,\r\n TagFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { PaginationInstance } from 'ngx-pagination';\r\nimport { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs';\r\nimport { debounceTime, finalize, map, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-asset-list',\r\n templateUrl: './asset-list.component.html',\r\n styleUrls: ['./asset-list.component.scss'],\r\n})\r\nexport class AssetListComponent\r\n extends BaseListComponent<\r\n GetAssetListQuery,\r\n ItemOf<GetAssetListQuery, 'assets'>,\r\n GetAssetListQueryVariables\r\n >\r\n implements OnInit\r\n{\r\n searchTerm$ = new BehaviorSubject<string | undefined>(undefined);\r\n filterByTags$ = new BehaviorSubject<TagFragment[] | undefined>(undefined);\r\n uploading = false;\r\n allTags$: Observable<TagFragment[]>;\r\n paginationConfig$: Observable<PaginationInstance>;\r\n\r\n constructor(\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.product.getAssetList(...args),\r\n data => data.assets,\r\n (skip, take) => {\r\n const searchTerm = this.searchTerm$.value;\r\n const tags = this.filterByTags$.value?.map(t => t.value);\r\n return {\r\n options: {\r\n skip,\r\n take,\r\n ...(searchTerm\r\n ? {\r\n filter: {\r\n name: { contains: searchTerm },\r\n },\r\n }\r\n : {}),\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n tags,\r\n tagsOperator: LogicalOperator.AND,\r\n },\r\n };\r\n },\r\n { take: 25, skip: 0 },\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.paginationConfig$ = combineLatest(this.itemsPerPage$, this.currentPage$, this.totalItems$).pipe(\r\n map(([itemsPerPage, currentPage, totalItems]) => ({ itemsPerPage, currentPage, totalItems })),\r\n );\r\n this.searchTerm$.pipe(debounceTime(250), takeUntil(this.destroy$)).subscribe(() => this.refresh());\r\n\r\n this.filterByTags$.pipe(takeUntil(this.destroy$)).subscribe(() => this.refresh());\r\n this.allTags$ = this.dataService.product.getTagList().mapStream(data => data.tags.items);\r\n }\r\n\r\n filesSelected(files: File[]) {\r\n if (files.length) {\r\n this.uploading = true;\r\n this.dataService.product\r\n .createAssets(files)\r\n .pipe(finalize(() => (this.uploading = false)))\r\n .subscribe(({ createAssets }) => {\r\n let successCount = 0;\r\n for (const result of createAssets) {\r\n switch (result.__typename) {\r\n case 'Asset':\r\n successCount++;\r\n break;\r\n case 'MimeTypeError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n if (0 < successCount) {\r\n super.refresh();\r\n this.notificationService.success(_('asset.notify-create-assets-success'), {\r\n count: successCount,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n deleteAssets(assets: Asset[]) {\r\n this.showModalAndDelete(assets.map(a => a.id))\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(\r\n assets.map(a => a.id),\r\n response.message || '',\r\n ).pipe(map(r => r.result === DeletionResult.DELETED));\r\n }\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Assets',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Assets',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(assetIds: string[], message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-assets'),\r\n translationVars: {\r\n count: assetIds.length,\r\n },\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res => (res ? this.dataService.product.deleteAssets(assetIds, !!message) : EMPTY)),\r\n map(res => res.deleteAssets),\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <vdr-asset-search-input\r\n class=\"pr4 mt1\"\r\n [tags]=\"allTags$ | async\"\r\n (searchTermChange)=\"searchTerm$.next($event)\"\r\n (tagsChange)=\"filterByTags$.next($event)\"\r\n ></vdr-asset-search-input>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"asset-list\"></vdr-action-bar-items>\r\n <vdr-asset-file-input\r\n (selectFiles)=\"filesSelected($event)\"\r\n [uploading]=\"uploading\"\r\n dropZoneTarget=\".content-area\"\r\n ></vdr-asset-file-input>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-asset-gallery\r\n [assets]=\"(items$ | async)! | paginate: (paginationConfig$ | async) || {}\"\r\n [multiSelect]=\"true\"\r\n [canDelete]=\"['DeleteCatalog', 'DeleteAsset'] | hasPermission\"\r\n (deleteAssets)=\"deleteAssets($event)\"\r\n></vdr-asset-gallery>\r\n\r\n<div class=\"paging-controls\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n ></vdr-pagination-controls>\r\n</div>\r\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n Asset,\r\n AssetPickerDialogComponent,\r\n AssetPreviewDialogComponent,\r\n ModalService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport interface AssetChange {\r\n assets: Asset[];\r\n featuredAsset: Asset | undefined;\r\n}\r\n\r\n/**\r\n * A component which displays the Assets, and allows assets to be removed and\r\n * added, and for the featured asset to be set.\r\n *\r\n * Note: rather complex code for drag drop is due to a limitation of the default CDK implementation\r\n * which is addressed by a work-around from here: https://github.com/angular/components/issues/13372#issuecomment-483998378\r\n */\r\n@Component({\r\n selector: 'vdr-assets',\r\n templateUrl: './assets.component.html',\r\n styleUrls: ['./assets.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssetsComponent {\r\n @Input('assets') set assetsSetter(val: Asset[]) {\r\n // create a new non-readonly array of assets\r\n this.assets = (val || []).slice();\r\n }\r\n\r\n @Input() featuredAsset: Asset | undefined;\r\n @HostBinding('class.compact')\r\n @Input()\r\n compact = false;\r\n @Output() change = new EventEmitter<AssetChange>();\r\n\r\n public assets: Asset[] = [];\r\n\r\n @Input()\r\n updatePermissions: string | string[] | Permission | Permission[];\r\n\r\n constructor(private modalService: ModalService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n selectAssets() {\r\n this.modalService\r\n .fromComponent(AssetPickerDialogComponent, {\r\n size: 'xl',\r\n })\r\n .subscribe(result => {\r\n if (result && result.length) {\r\n this.assets = unique(this.assets.concat(result), 'id');\r\n if (!this.featuredAsset) {\r\n this.featuredAsset = result[0];\r\n }\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n this.changeDetector.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n setAsFeatured(asset: Asset) {\r\n this.featuredAsset = asset;\r\n this.emitChangeEvent(this.assets, asset);\r\n }\r\n\r\n isFeatured(asset: Asset): boolean {\r\n return !!this.featuredAsset && this.featuredAsset.id === asset.id;\r\n }\r\n\r\n previewAsset(asset: Asset) {\r\n this.modalService\r\n .fromComponent(AssetPreviewDialogComponent, {\r\n size: 'xl',\r\n closable: true,\r\n locals: { asset },\r\n })\r\n .subscribe();\r\n }\r\n\r\n removeAsset(asset: Asset) {\r\n this.assets = this.assets.filter(a => a.id !== asset.id);\r\n if (this.featuredAsset && this.featuredAsset.id === asset.id) {\r\n this.featuredAsset = this.assets.length > 0 ? this.assets[0] : undefined;\r\n }\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n }\r\n\r\n private emitChangeEvent(assets: Asset[], featuredAsset: Asset | undefined) {\r\n this.change.emit({\r\n assets,\r\n featuredAsset,\r\n });\r\n }\r\n\r\n dropListDropped(event: CdkDragDrop<number>) {\r\n moveItemInArray(this.assets, event.previousContainer.data, event.container.data);\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n }\r\n}\r\n","<div class=\"card\" *ngIf=\"!compact; else compactView\">\r\n <div class=\"card-img\">\r\n <div class=\"featured-asset\">\r\n <img\r\n *ngIf=\"featuredAsset\"\r\n [src]=\"featuredAsset | assetPreview:'small'\"\r\n (click)=\"previewAsset(featuredAsset)\"\r\n />\r\n <div class=\"placeholder\" *ngIf=\"!featuredAsset\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"image\" size=\"128\"></clr-icon>\r\n <div>{{ 'catalog.no-featured-asset' | translate }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-block\"><ng-container *ngTemplateOutlet=\"assetList\"></ng-container></div>\r\n <div class=\"card-footer\" *vdrIfPermissions=\"updatePermissions\">\r\n <button class=\"btn\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"attachment\"></clr-icon>\r\n {{ 'asset.add-asset' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #compactView>\r\n <div class=\"featured-asset compact\">\r\n <img\r\n *ngIf=\"featuredAsset\"\r\n [src]=\"featuredAsset | assetPreview:'thumb'\"\r\n (click)=\"previewAsset(featuredAsset)\"\r\n />\r\n\r\n <div class=\"placeholder\" *ngIf=\"!featuredAsset\" (click)=\"selectAssets()\"><clr-icon shape=\"image\" size=\"150\"></clr-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"assetList\"></ng-container>\r\n <button\r\n *vdrIfPermissions=\"updatePermissions\"\r\n class=\"compact-select btn btn-icon btn-sm btn-block\"\r\n [title]=\"'asset.add-asset' | translate\"\r\n (click)=\"selectAssets()\"\r\n >\r\n <clr-icon shape=\"attachment\"></clr-icon>\r\n {{ 'asset.add-asset' | translate }}\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #assetList>\r\n <div class=\"all-assets\" [class.compact]=\"compact\" cdkDropListGroup>\r\n <div\r\n *ngFor=\"let asset of assets; let index = index\"\r\n class=\"drop-list\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"index\"\r\n [cdkDropListDisabled]=\"!(updatePermissions | hasPermission)\"\r\n (cdkDropListDropped)=\"dropListDropped($event)\"\r\n >\r\n <vdr-dropdown cdkDrag>\r\n <div\r\n class=\"asset-thumb\"\r\n vdrDropdownTrigger\r\n [class.featured]=\"isFeatured(asset)\"\r\n [title]=\"\"\r\n tabindex=\"0\"\r\n >\r\n <img [src]=\"asset | assetPreview:'tiny'\" />\r\n </div>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button type=\"button\" vdrDropdownItem (click)=\"previewAsset(asset)\">\r\n {{ 'asset.preview' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n [disabled]=\"isFeatured(asset) || !(updatePermissions | hasPermission)\"\r\n vdrDropdownItem\r\n (click)=\"setAsFeatured(asset)\"\r\n >\r\n {{ 'asset.set-as-featured-asset' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"remove-asset\"\r\n vdrDropdownItem\r\n [disabled]=\"!(updatePermissions | hasPermission)\"\r\n (click)=\"removeAsset(asset)\"\r\n >\r\n {{ 'asset.remove-asset' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChild,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport {\r\n CollectionFilterParameter,\r\n ConfigurableOperationInput,\r\n DataService,\r\n GetCollectionContentsQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\r\nimport {\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n filter,\r\n finalize,\r\n map,\r\n startWith,\r\n switchMap,\r\n takeUntil,\r\n tap,\r\n} from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-collection-contents',\r\n templateUrl: './collection-contents.component.html',\r\n styleUrls: ['./collection-contents.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionContentsComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() collectionId: string;\r\n @Input() parentId: string;\r\n @Input() inheritFilters: boolean;\r\n @Input() updatedFilters: ConfigurableOperationInput[] | undefined;\r\n @Input() previewUpdatedFilters = false;\r\n @ContentChild(TemplateRef, { static: true }) headerTemplate: TemplateRef<any>;\r\n\r\n contents$: Observable<NonNullable<GetCollectionContentsQuery['collection']>['productVariants']['items']>;\r\n contentsTotalItems$: Observable<number>;\r\n contentsItemsPerPage$: Observable<number>;\r\n contentsCurrentPage$: Observable<number>;\r\n filterTermControl = new FormControl('');\r\n isLoading = false;\r\n private collectionIdChange$ = new BehaviorSubject<string>('');\r\n private parentIdChange$ = new BehaviorSubject<string>('');\r\n private filterChanges$ = new BehaviorSubject<ConfigurableOperationInput[]>([]);\r\n private inheritFiltersChanges$ = new BehaviorSubject<boolean>(true);\r\n private refresh$ = new BehaviorSubject<boolean>(true);\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(private route: ActivatedRoute, private router: Router, private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.contentsCurrentPage$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('contentsPage')),\r\n map(page => (!page ? 1 : +page)),\r\n startWith(1),\r\n distinctUntilChanged(),\r\n );\r\n\r\n this.contentsItemsPerPage$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('contentsPerPage')),\r\n map(perPage => (!perPage ? 10 : +perPage)),\r\n startWith(10),\r\n distinctUntilChanged(),\r\n );\r\n\r\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(''),\r\n );\r\n\r\n const filterChanges$ = this.filterChanges$.asObservable().pipe(\r\n filter(() => this.previewUpdatedFilters),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith([]),\r\n );\r\n\r\n const inheritFiltersChanges$ = this.inheritFiltersChanges$.asObservable().pipe(\r\n filter(() => this.inheritFilters != null),\r\n distinctUntilChanged(),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(true),\r\n );\r\n\r\n const fetchUpdate$ = combineLatest(\r\n this.collectionIdChange$,\r\n this.parentIdChange$,\r\n this.contentsCurrentPage$,\r\n this.contentsItemsPerPage$,\r\n filterTerm$,\r\n filterChanges$,\r\n inheritFiltersChanges$,\r\n this.refresh$,\r\n );\r\n\r\n const collection$ = fetchUpdate$.pipe(\r\n takeUntil(this.destroy$),\r\n tap(() => (this.isLoading = true)),\r\n debounceTime(50),\r\n switchMap(([id, parentId, currentPage, itemsPerPage, filterTerm, filters, inheritFilters]) => {\r\n const take = itemsPerPage;\r\n const skip = (currentPage - 1) * itemsPerPage;\r\n if (filters.length && this.previewUpdatedFilters) {\r\n const filterClause = filterTerm\r\n ? ({ name: { contains: filterTerm } } as CollectionFilterParameter)\r\n : undefined;\r\n return this.dataService.collection\r\n .previewCollectionVariants(\r\n {\r\n parentId,\r\n filters,\r\n inheritFilters,\r\n },\r\n {\r\n take,\r\n skip,\r\n filter: filterClause,\r\n },\r\n )\r\n .mapSingle(data => data.previewCollectionVariants)\r\n .pipe(catchError(() => of({ items: [], totalItems: 0 })));\r\n } else if (id) {\r\n return this.dataService.collection\r\n .getCollectionContents(id, take, skip, filterTerm)\r\n .mapSingle(data => data.collection?.productVariants);\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n tap(() => (this.isLoading = false)),\r\n finalize(() => (this.isLoading = false)),\r\n );\r\n\r\n this.contents$ = collection$.pipe(map(result => (result ? result.items : [])));\r\n this.contentsTotalItems$ = collection$.pipe(map(result => (result ? result.totalItems : 0)));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('collectionId' in changes) {\r\n this.collectionIdChange$.next(changes.collectionId.currentValue);\r\n }\r\n if ('parentId' in changes) {\r\n this.parentIdChange$.next(changes.parentId.currentValue);\r\n }\r\n if ('inheritFilters' in changes) {\r\n this.inheritFiltersChanges$.next(changes.inheritFilters.currentValue);\r\n }\r\n if ('updatedFilters' in changes) {\r\n if (this.updatedFilters) {\r\n this.filterChanges$.next(this.updatedFilters);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n setContentsPageNumber(page: number) {\r\n this.setParam('contentsPage', page);\r\n }\r\n\r\n setContentsItemsPerPage(perPage: number) {\r\n this.setParam('contentsPerPage', perPage);\r\n }\r\n\r\n refresh() {\r\n this.refresh$.next(true);\r\n }\r\n\r\n private setParam(key: string, value: any) {\r\n this.router.navigate(['./'], {\r\n relativeTo: this.route,\r\n queryParams: {\r\n [key]: value,\r\n },\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true,\r\n });\r\n }\r\n}\r\n","<div class=\"contents-header\">\r\n <div class=\"header-title-row\">\r\n <ng-container\r\n *ngTemplateOutlet=\"headerTemplate; context: { $implicit: contentsTotalItems$ | async }\"\r\n ></ng-container>\r\n </div>\r\n <input\r\n type=\"text\"\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n [formControl]=\"filterTermControl\"\r\n />\r\n</div>\r\n<div class=\"table-wrapper\">\r\n <div class=\"progress loop\" [class.visible]=\"isLoading\"></div>\r\n <vdr-data-table\r\n [class.loading]=\"isLoading\"\r\n [items]=\"contents$ | async\"\r\n [itemsPerPage]=\"contentsItemsPerPage$ | async\"\r\n [totalItems]=\"contentsTotalItems$ | async\"\r\n [currentPage]=\"contentsCurrentPage$ | async\"\r\n (pageChange)=\"setContentsPageNumber($event)\"\r\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n <td class=\"left align-middle\">{{ variant.name }}</td>\r\n <td class=\"left align-middle\"><small class=\"sku\">{{ variant.sku }}</small></td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['/catalog/products', variant.productId, { tab: 'variants' }]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n </vdr-data-table>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n BaseDetailComponent,\r\n Collection,\r\n CollectionFragment,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n ConfigurableOperationInput,\r\n CreateCollectionInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n encodeConfigArgValue,\r\n findTranslation,\r\n getConfigArgValue,\r\n LanguageCode,\r\n LocalStorageService,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n unicodePatternValidator,\r\n UpdateCollectionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { combineLatest, merge, Observable, of, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, take } from 'rxjs/operators';\r\n\r\nimport { CollectionContentsComponent } from '../collection-contents/collection-contents.component';\r\n\r\n@Component({\r\n selector: 'vdr-collection-detail',\r\n templateUrl: './collection-detail.component.html',\r\n styleUrls: ['./collection-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionDetailComponent\r\n extends BaseDetailComponent<CollectionFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields: CustomFieldConfig[];\r\n detailForm: FormGroup;\r\n assetChanges: { assets?: Asset[]; featuredAsset?: Asset } = {};\r\n filters: ConfigurableOperation[] = [];\r\n allFilters: ConfigurableOperationDefinition[] = [];\r\n updatedFilters$: Observable<ConfigurableOperationInput[]>;\r\n inheritFilters$: Observable<boolean>;\r\n livePreview = false;\r\n parentId$: Observable<string | undefined>;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateCollection];\r\n private filterRemoved$ = new Subject<void>();\r\n @ViewChild('collectionContents') contentsComponent: CollectionContentsComponent;\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private localStorageService: LocalStorageService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Collection');\r\n this.detailForm = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9_-]+$/)],\r\n description: '',\r\n visible: false,\r\n inheritFilters: true,\r\n filters: this.formBuilder.array([]),\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n this.livePreview = this.localStorageService.get('livePreviewCollectionContents') ?? false;\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.dataService.collection.getCollectionFilters().single$.subscribe(res => {\r\n this.allFilters = res.collectionFilters;\r\n });\r\n const filtersFormArray = this.detailForm.get('filters') as FormArray;\r\n const inheritFiltersControl = this.detailForm.get('inheritFilters') as FormControl;\r\n this.inheritFilters$ = inheritFiltersControl.valueChanges.pipe(distinctUntilChanged());\r\n this.updatedFilters$ = merge(filtersFormArray.statusChanges, this.filterRemoved$).pipe(\r\n debounceTime(200),\r\n filter(() => filtersFormArray.touched),\r\n map(() =>\r\n this.mapOperationsToInputs(this.filters, filtersFormArray.value).filter(_filter => {\r\n // ensure all the arguments have valid values. E.g. a newly-added\r\n // filter will not yet have valid values\r\n for (const arg of _filter.arguments) {\r\n if (arg.value === '') {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }),\r\n ),\r\n );\r\n this.parentId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('parentId') || undefined),\r\n switchMap(parentId => {\r\n if (parentId) {\r\n return of(parentId);\r\n } else {\r\n return this.entity$.pipe(map(collection => collection.parent?.id));\r\n }\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n getFilterDefinition(_filter: ConfigurableOperation): ConfigurableOperationDefinition | undefined {\r\n return this.allFilters.find(f => f.code === _filter.code);\r\n }\r\n\r\n assetsChanged(): boolean {\r\n return !!Object.values(this.assetChanges).length;\r\n }\r\n\r\n /**\r\n * If creating a new Collection, automatically generate the slug based on the collection name.\r\n */\r\n updateSlug(nameValue: string) {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(take(1))\r\n .subscribe(([entity, languageCode]) => {\r\n const slugControl = this.detailForm.get(['slug']);\r\n const currentTranslation = findTranslation(entity, languageCode);\r\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\r\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\r\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\r\n }\r\n });\r\n }\r\n\r\n addFilter(collectionFilter: ConfigurableOperation) {\r\n const filtersArray = this.detailForm.get('filters') as FormArray;\r\n const argsHash = collectionFilter.args.reduce(\r\n (output, arg) => ({\r\n ...output,\r\n [arg.name]: getConfigArgValue(arg.value),\r\n }),\r\n {},\r\n );\r\n filtersArray.push(\r\n this.formBuilder.control({\r\n code: collectionFilter.code,\r\n args: argsHash,\r\n }),\r\n );\r\n this.filters.push({\r\n code: collectionFilter.code,\r\n args: collectionFilter.args.map(a => ({ name: a.name, value: getConfigArgValue(a.value) })),\r\n });\r\n }\r\n\r\n removeFilter(index: number) {\r\n const filtersArray = this.detailForm.get('filters') as FormArray;\r\n if (index !== -1) {\r\n filtersArray.removeAt(index);\r\n filtersArray.markAsDirty();\r\n filtersArray.markAsTouched();\r\n this.filters.splice(index, 1);\r\n this.filterRemoved$.next();\r\n }\r\n }\r\n\r\n create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([category, languageCode]) => {\r\n const input = this.getUpdatedCollection(\r\n category,\r\n this.detailForm,\r\n languageCode,\r\n ) as CreateCollectionInput;\r\n const parentId = this.route.snapshot.paramMap.get('parentId');\r\n if (parentId) {\r\n input.parentId = parentId;\r\n }\r\n return this.dataService.collection.createCollection(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Collection',\r\n });\r\n this.assetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createCollection.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Collection',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([category, languageCode]) => {\r\n const input = this.getUpdatedCollection(\r\n category,\r\n this.detailForm,\r\n languageCode,\r\n ) as UpdateCollectionInput;\r\n return this.dataService.collection.updateCollection(input);\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.assetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Collection',\r\n });\r\n this.contentsComponent.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Collection',\r\n });\r\n },\r\n );\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\r\n }\r\n\r\n toggleLivePreview() {\r\n this.livePreview = !this.livePreview;\r\n this.localStorageService.set('livePreviewCollectionContents', this.livePreview);\r\n }\r\n\r\n trackByFn(index: number, item: ConfigurableOperation) {\r\n return JSON.stringify(item);\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the category or current language.\r\n */\r\n protected setFormValues(entity: CollectionFragment, languageCode: LanguageCode) {\r\n const currentTranslation = findTranslation(entity, languageCode);\r\n\r\n this.detailForm.patchValue({\r\n name: currentTranslation ? currentTranslation.name : '',\r\n slug: currentTranslation ? currentTranslation.slug : '',\r\n description: currentTranslation ? currentTranslation.description : '',\r\n visible: !entity.isPrivate,\r\n inheritFilters: entity.inheritFilters,\r\n });\r\n\r\n const formArray = this.detailForm.get('filters') as FormArray;\r\n if (formArray.length !== entity.filters.length) {\r\n formArray.clear();\r\n this.filters = [];\r\n entity.filters.forEach(f => this.addFilter(f));\r\n }\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n entity,\r\n currentTranslation,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Given a category and the value of the form, this method creates an updated copy of the category which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedCollection(\r\n category: CollectionFragment,\r\n form: FormGroup,\r\n languageCode: LanguageCode,\r\n ): CreateCollectionInput | UpdateCollectionInput {\r\n const updatedCategory = createUpdatedTranslatable({\r\n translatable: category,\r\n updatedFields: form.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: category.name || '',\r\n slug: category.slug || '',\r\n description: category.description || '',\r\n },\r\n });\r\n return {\r\n ...updatedCategory,\r\n assetIds: this.assetChanges.assets?.map(a => a.id),\r\n featuredAssetId: this.assetChanges.featuredAsset?.id,\r\n isPrivate: !form.value.visible,\r\n filters: this.mapOperationsToInputs(this.filters, this.detailForm.value.filters),\r\n };\r\n }\r\n\r\n /**\r\n * Maps an array of conditions or actions to the input format expected by the GraphQL API.\r\n */\r\n private mapOperationsToInputs(\r\n operations: ConfigurableOperation[],\r\n formValueOperations: any,\r\n ): ConfigurableOperationInput[] {\r\n return operations.map((o, i) => {\r\n return {\r\n code: o.code,\r\n arguments: Object.entries(formValueOperations[i].args).map(([name, value], j) => {\r\n return {\r\n name,\r\n value: encodeConfigArgValue(value),\r\n };\r\n }),\r\n };\r\n });\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"collection-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as collection\">\r\n\r\n <nav role=\"navigation\">\r\n <ul class=\"collection-breadcrumbs\">\r\n <li *ngFor=\"let breadcrumb of collection.breadcrumbs; let isFirst = first; let isLast = last\">\r\n <a [routerLink]=\"['/catalog/collections']\" *ngIf=\"isFirst\">{{ 'catalog.root-collection' | translate }}</a>\r\n <a [routerLink]=\"['/catalog/collections', breadcrumb.id]\" *ngIf=\"!isFirst && !isLast\">{{ breadcrumb.name | translate }}</a>\r\n <ng-container *ngIf=\"isLast\">{{ breadcrumb.name | translate }}</ng-container>\r\n </li>\r\n </ul>\r\n </nav>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n formControlName=\"visible\"\r\n id=\"visibility\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.visible; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'catalog.slug' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: ('catalog.slug-pattern-error' | translate) }\"\r\n >\r\n <input\r\n id=\"slug\"\r\n type=\"text\"\r\n formControlName=\"slug\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [label]=\"'common.description' | translate\"\r\n ></vdr-rich-text-editor>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Collection\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['customFields'])\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"collection-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </div>\r\n <div class=\"clr-col-md-auto\">\r\n <vdr-assets\r\n [assets]=\"collection.assets\"\r\n [featuredAsset]=\"collection.featuredAsset\"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </div>\r\n </div>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <label>{{ 'catalog.filters' | translate }}</label>\r\n <vdr-form-field [label]=\"'catalog.filter-inheritance' | translate\" for=\"inheritFilters\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n formControlName=\"inheritFilters\"\r\n id=\"inheritFilters\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.inheritFilters; else noInherit\">{{\r\n 'catalog.inherit-filters-from-parent' | translate\r\n }}</ng-container>\r\n <ng-template #noInherit>{{\r\n 'catalog.do-not-inherit-filters' | translate\r\n }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <div formArrayName=\"filters\">\r\n <ng-container *ngFor=\"let filter of filters; index as i; trackBy:trackByFn\">\r\n <vdr-configurable-input\r\n (remove)=\"removeFilter(i)\"\r\n [position]=\"i\"\r\n [operation]=\"filter\"\r\n [operationDefinition]=\"getFilterDefinition(filter)\"\r\n [formControlName]=\"i\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-configurable-input>\r\n </ng-container>\r\n </div>\r\n\r\n <div *vdrIfPermissions=\"updatePermission\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'marketing.add-condition' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let filter of allFilters\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"addFilter(filter)\"\r\n >\r\n {{ filter.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n <div class=\"clr-col\">\r\n <vdr-collection-contents\r\n [collectionId]=\"id\"\r\n [parentId]=\"parentId$ | async\"\r\n [updatedFilters]=\"updatedFilters$ | async\"\r\n [inheritFilters]=\"inheritFilters$ | async\"\r\n [previewUpdatedFilters]=\"livePreview\"\r\n #collectionContents\r\n >\r\n <ng-template let-count>\r\n <div class=\"contents-title\">\r\n {{ 'catalog.collection-contents' | translate }} ({{\r\n 'common.results-count' | translate: {count: count}\r\n }})\r\n </div>\r\n <clr-checkbox-wrapper [class.disabled]=\"detailForm.get('filters')?.pristine\">\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [disabled]=\"detailForm.get('filters')?.pristine\"\r\n [ngModel]=\"livePreview\"\r\n (ngModelChange)=\"toggleLivePreview()\"\r\n />\r\n <label>{{ 'catalog.live-preview-contents' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </div>\r\n </div>\r\n</form>\r\n","export type HasParent = { id: string; parent?: { id: string } | null };\r\nexport type TreeNode<T extends HasParent> = T & { children: Array<TreeNode<T>>; expanded: boolean };\r\nexport type RootNode<T extends HasParent> = { id?: string; children: Array<TreeNode<T>> };\r\n\r\n/**\r\n * Builds a tree from an array of nodes which have a parent.\r\n * Based on https://stackoverflow.com/a/31247960/772859, modified to preserve ordering.\r\n */\r\nexport function arrayToTree<T extends HasParent>(\r\n nodes: T[],\r\n currentState?: RootNode<T>,\r\n expandedIds: string[] = [],\r\n): RootNode<T> {\r\n const topLevelNodes: Array<TreeNode<T>> = [];\r\n const mappedArr: { [id: string]: TreeNode<T> } = {};\r\n const currentStateMap = treeToMap(currentState);\r\n\r\n // First map the nodes of the array to an object -> create a hash table.\r\n for (const node of nodes) {\r\n mappedArr[node.id] = { ...(node as any), children: [] };\r\n }\r\n\r\n for (const id of nodes.map(n => n.id)) {\r\n if (mappedArr.hasOwnProperty(id)) {\r\n const mappedElem = mappedArr[id];\r\n mappedElem.expanded = currentStateMap.get(id)?.expanded ?? expandedIds.includes(id);\r\n const parent = mappedElem.parent;\r\n if (!parent) {\r\n continue;\r\n }\r\n // If the element is not at the root level, add it to its parent array of children.\r\n const parentIsRoot = !mappedArr[parent.id];\r\n if (!parentIsRoot) {\r\n if (mappedArr[parent.id]) {\r\n mappedArr[parent.id].children.push(mappedElem);\r\n } else {\r\n mappedArr[parent.id] = { children: [mappedElem] } as any;\r\n }\r\n } else {\r\n topLevelNodes.push(mappedElem);\r\n }\r\n }\r\n }\r\n // tslint:disable-next-line:no-non-null-assertion\r\n const rootId = topLevelNodes.length ? topLevelNodes[0].parent!.id : undefined;\r\n return { id: rootId, children: topLevelNodes };\r\n}\r\n\r\n/**\r\n * Converts an existing tree (as generated by the arrayToTree function) into a flat\r\n * Map. This is used to persist certain states (e.g. `expanded`) when re-building the\r\n * tree.\r\n */\r\nfunction treeToMap<T extends HasParent>(tree?: RootNode<T>): Map<string, TreeNode<T>> {\r\n const nodeMap = new Map<string, TreeNode<T>>();\r\n function visit(node: TreeNode<T>) {\r\n nodeMap.set(node.id, node);\r\n node.children.forEach(visit);\r\n }\r\n if (tree) {\r\n visit(tree as TreeNode<T>);\r\n }\r\n return nodeMap;\r\n}\r\n","import { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { Injectable, OnDestroy } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { RootNode, TreeNode } from './array-to-tree';\r\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\r\n\r\n/**\r\n * Facilitates communication between the CollectionTreeComponent and child CollectionTreeNodeComponents\r\n * without introducing a cyclic dependency.\r\n */\r\n@Injectable()\r\nexport class CollectionTreeService implements OnDestroy {\r\n private allMoveListItems: Array<{ path: string; id: string; ancestorIdPath: Set<string> }> = [];\r\n private collectionTree: RootNode<CollectionPartial>;\r\n private _rearrange$ = new Subject<RearrangeEvent>();\r\n private _delete$ = new Subject<string>();\r\n\r\n public rearrange$: Observable<RearrangeEvent>;\r\n public delete$: Observable<string>;\r\n\r\n constructor() {\r\n this.rearrange$ = this._rearrange$.asObservable();\r\n this.delete$ = this._delete$.asObservable();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._rearrange$.complete();\r\n this._delete$.complete();\r\n }\r\n\r\n setCollectionTree(tree: RootNode<CollectionPartial>) {\r\n this.collectionTree = tree;\r\n }\r\n\r\n resetMoveList() {\r\n this.allMoveListItems = [];\r\n }\r\n\r\n getMoveListItems(collection: CollectionPartial) {\r\n if (this.allMoveListItems.length === 0) {\r\n this.allMoveListItems = this.calculateAllMoveListItems();\r\n }\r\n return this.allMoveListItems.filter(\r\n item =>\r\n item.id !== collection.id &&\r\n !item.ancestorIdPath.has(collection.id) &&\r\n item.id !== collection.parent?.id,\r\n );\r\n }\r\n\r\n onDrop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\r\n const item = event.item.data as CollectionPartial;\r\n const newParent = event.container.data;\r\n const newParentId = newParent.id;\r\n if (newParentId == null) {\r\n throw new Error(`Could not determine the ID of the root Collection`);\r\n }\r\n this._rearrange$.next({\r\n collectionId: item.id,\r\n parentId: newParentId,\r\n index: event.currentIndex,\r\n });\r\n }\r\n\r\n onMove(event: RearrangeEvent) {\r\n this._rearrange$.next(event);\r\n }\r\n\r\n onDelete(id: string) {\r\n this._delete$.next(id);\r\n }\r\n\r\n private calculateAllMoveListItems() {\r\n const visit = (\r\n node: TreeNode<any>,\r\n parentPath: string[],\r\n ancestorIdPath: Set<string>,\r\n output: Array<{ path: string; id: string; ancestorIdPath: Set<string> }>,\r\n ) => {\r\n const path = parentPath.concat(node.name);\r\n output.push({ path: path.slice(1).join(' / ') || 'root', id: node.id, ancestorIdPath });\r\n node.children.forEach(child =>\r\n visit(child, path, new Set<string>([...ancestorIdPath, node.id]), output),\r\n );\r\n return output;\r\n };\r\n return visit(this.collectionTree, [], new Set<string>(), []);\r\n }\r\n}\r\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n SimpleChanges,\r\n SkipSelf,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { DataService, Permission, SelectionManager } from '@vendure/admin-ui/core';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { map, shareReplay } from 'rxjs/operators';\r\n\r\nimport { RootNode, TreeNode } from './array-to-tree';\r\nimport { CollectionTreeService } from './collection-tree.service';\r\nimport { CollectionPartial } from './collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-tree-node',\r\n templateUrl: './collection-tree-node.component.html',\r\n styleUrls: ['./collection-tree-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionTreeNodeComponent implements OnInit, OnChanges, OnDestroy {\r\n depth = 0;\r\n parentName: string;\r\n @Input() collectionTree: TreeNode<CollectionPartial>;\r\n @Input() activeCollectionId: string;\r\n @Input() expandAll = false;\r\n @Input() selectionManager: SelectionManager<CollectionPartial>;\r\n hasUpdatePermission$: Observable<boolean>;\r\n hasDeletePermission$: Observable<boolean>;\r\n moveListItems: Array<{ path: string; id: string }> = [];\r\n private subscription: Subscription;\r\n\r\n constructor(\r\n @SkipSelf() @Optional() private parent: CollectionTreeNodeComponent,\r\n private dataService: DataService,\r\n private collectionTreeService: CollectionTreeService,\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n ) {\r\n if (parent) {\r\n this.depth = parent.depth + 1;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.parentName = this.collectionTree.name || '<root>';\r\n const permissions$ = this.dataService.client\r\n .userStatus()\r\n .mapStream(data => data.userStatus.permissions)\r\n .pipe(shareReplay(1));\r\n this.hasUpdatePermission$ = permissions$.pipe(\r\n map(\r\n perms =>\r\n perms.includes(Permission.UpdateCatalog) || perms.includes(Permission.UpdateCollection),\r\n ),\r\n );\r\n this.hasDeletePermission$ = permissions$.pipe(\r\n map(\r\n perms =>\r\n perms.includes(Permission.DeleteCatalog) || perms.includes(Permission.DeleteCollection),\r\n ),\r\n );\r\n this.subscription = this.selectionManager?.selectionChanges$.subscribe(() =>\r\n this.changeDetectorRef.markForCheck(),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n const expandAllChange = changes['expandAll'];\r\n if (expandAllChange) {\r\n if (expandAllChange.previousValue === true && expandAllChange.currentValue === false) {\r\n this.collectionTree.children.forEach(c => (c.expanded = false));\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription?.unsubscribe();\r\n }\r\n\r\n trackByFn(index: number, item: CollectionPartial) {\r\n return item.id;\r\n }\r\n\r\n toggleExpanded(collection: TreeNode<CollectionPartial>) {\r\n collection.expanded = !collection.expanded;\r\n let expandedIds = this.route.snapshot.queryParamMap.get('expanded')?.split(',') ?? [];\r\n if (collection.expanded) {\r\n expandedIds.push(collection.id);\r\n } else {\r\n expandedIds = expandedIds.filter(id => id !== collection.id);\r\n }\r\n this.router.navigate(['./'], {\r\n queryParams: {\r\n expanded: expandedIds.filter(id => !!id).join(','),\r\n },\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n });\r\n }\r\n\r\n getMoveListItems(collection: CollectionPartial) {\r\n this.moveListItems = this.collectionTreeService.getMoveListItems(collection);\r\n }\r\n\r\n move(collection: CollectionPartial, parentId: string) {\r\n this.collectionTreeService.onMove({\r\n index: 0,\r\n parentId,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n moveUp(collection: CollectionPartial, currentIndex: number) {\r\n if (!collection.parent) {\r\n return;\r\n }\r\n this.collectionTreeService.onMove({\r\n index: currentIndex - 1,\r\n parentId: collection.parent.id,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n moveDown(collection: CollectionPartial, currentIndex: number) {\r\n if (!collection.parent) {\r\n return;\r\n }\r\n this.collectionTreeService.onMove({\r\n index: currentIndex + 1,\r\n parentId: collection.parent.id,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n drop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\r\n moveItemInArray(this.collectionTree.children, event.previousIndex, event.currentIndex);\r\n this.collectionTreeService.onDrop(event);\r\n }\r\n\r\n delete(id: string) {\r\n this.collectionTreeService.onDelete(id);\r\n }\r\n}\r\n","<div\r\n cdkDropList\r\n class=\"tree-node\"\r\n #dropList\r\n [cdkDropListData]=\"collectionTree\"\r\n [cdkDropListDisabled]=\"!(hasUpdatePermission$ | async)\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n>\r\n <div\r\n class=\"collection\"\r\n [class.private]=\"collection.isPrivate\"\r\n *ngFor=\"let collection of collectionTree.children; index as i; trackBy: trackByFn\"\r\n cdkDrag\r\n [cdkDragData]=\"collection\"\r\n >\r\n <div\r\n class=\"collection-detail\"\r\n [ngClass]=\"'depth-' + depth\"\r\n [class.active]=\"collection.id === activeCollectionId\"\r\n >\r\n <div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager.isSelected(collection)\"\r\n (click)=\"selectionManager.toggleSelection(collection, $event)\"\r\n />\r\n </div>\r\n <div class=\"name\">\r\n <button\r\n class=\"icon-button folder-button\"\r\n [disabled]=\"expandAll\"\r\n *ngIf=\"collection.children?.length; else folderSpacer\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!collection.expanded && !expandAll\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"collection.expanded || expandAll\"></clr-icon>\r\n </button>\r\n <ng-template #folderSpacer>\r\n <div class=\"folder-button-spacer\"></div>\r\n </ng-template>\r\n {{ collection.name }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-chip *ngIf=\"collection.isPrivate\">{{ 'catalog.private' | translate }}</vdr-chip>\r\n <a\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['./', { contents: collection.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <clr-icon shape=\"view-list\"></clr-icon>\r\n {{ 'catalog.view-contents' | translate }}\r\n </a>\r\n <a class=\"btn btn-link btn-sm\" [routerLink]=\"['/catalog/collections/', collection.id]\">\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </a>\r\n <div class=\"drag-handle\" cdkDragHandle *vdrIfPermissions=\"['UpdateCatalog', 'UpdateCollection']\">\r\n <clr-icon shape=\"drag-handle\" size=\"24\"></clr-icon>\r\n </div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger (click)=\"getMoveListItems(collection)\">\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <a\r\n class=\"dropdown-item\"\r\n [routerLink]=\"['./', 'create', { parentId: collection.id }]\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-collection' | translate }}\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"i === 0 || !(hasUpdatePermission$ | async)\"\r\n (click)=\"moveUp(collection, i)\"\r\n >\r\n <clr-icon shape=\"caret up\"></clr-icon>\r\n {{ 'catalog.move-up' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"\r\n i === collectionTree.children.length - 1 || !(hasUpdatePermission$ | async)\r\n \"\r\n (click)=\"moveDown(collection, i)\"\r\n >\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n {{ 'catalog.move-down' | translate }}\r\n </button>\r\n <h4 class=\"dropdown-header\">{{ 'catalog.move-to' | translate }}</h4>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n *ngFor=\"let item of moveListItems\"\r\n (click)=\"move(collection, item.id)\"\r\n [disabled]=\"!(hasUpdatePermission$ | async)\"\r\n >\r\n <div class=\"move-to-item\">\r\n <div class=\"move-icon\">\r\n <clr-icon shape=\"child-arrow\"></clr-icon>\r\n </div>\r\n <div class=\"path\">\r\n {{ item.path }}\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"delete(collection.id)\"\r\n [disabled]=\"!(hasDeletePermission$ | async)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n <vdr-collection-tree-node\r\n *ngIf=\"collection.expanded || expandAll\"\r\n [expandAll]=\"expandAll\"\r\n [collectionTree]=\"collection\"\r\n [activeCollectionId]=\"activeCollectionId\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-collection-tree-node>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { Collection, SelectionManager } from '@vendure/admin-ui/core';\r\n\r\nimport { arrayToTree, RootNode } from './array-to-tree';\r\nimport { CollectionTreeService } from './collection-tree.service';\r\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-tree',\r\n templateUrl: 'collection-tree.component.html',\r\n styleUrls: ['./collection-tree.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [CollectionTreeService],\r\n})\r\nexport class CollectionTreeComponent implements OnInit, OnChanges {\r\n @Input() collections: CollectionPartial[];\r\n @Input() activeCollectionId: string;\r\n @Input() expandAll = false;\r\n @Input() expandedIds: string[] = [];\r\n @Input() selectionManager: SelectionManager<CollectionPartial>;\r\n @Output() rearrange = new EventEmitter<RearrangeEvent>();\r\n @Output() deleteCollection = new EventEmitter<string>();\r\n collectionTree: RootNode<CollectionPartial>;\r\n\r\n constructor(private collectionTreeService: CollectionTreeService) {}\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if ('collections' in changes && this.collections) {\r\n this.collectionTree = arrayToTree(this.collections, this.collectionTree, this.expandedIds);\r\n this.collectionTreeService.setCollectionTree(this.collectionTree);\r\n this.collectionTreeService.resetMoveList();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.collectionTreeService.rearrange$.subscribe(event => this.rearrange.emit(event));\r\n this.collectionTreeService.delete$.subscribe(id => this.deleteCollection.emit(id));\r\n }\r\n}\r\n","<vdr-collection-tree-node\r\n *ngIf=\"collectionTree\"\r\n cdkDropListGroup\r\n [expandAll]=\"expandAll\"\r\n [collectionTree]=\"collectionTree\"\r\n [selectionManager]=\"selectionManager\"\r\n [activeCollectionId]=\"activeCollectionId\"\r\n></vdr-collection-tree-node>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n QueryResult,\r\n SelectionManager,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, EMPTY, Observable, Subject } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n shareReplay,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n tap,\r\n} from 'rxjs/operators';\r\n\r\nimport { CollectionPartial, RearrangeEvent } from '../collection-tree/collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-list',\r\n templateUrl: './collection-list.component.html',\r\n styleUrls: ['./collection-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionListComponent implements OnInit, OnDestroy {\r\n filterTermControl = new FormControl('');\r\n activeCollectionId$: Observable<string | null>;\r\n activeCollectionTitle$: Observable<string>;\r\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n expandAll = false;\r\n expandedIds: string[] = [];\r\n selectionManager: SelectionManager<CollectionPartial>;\r\n private queryResult: QueryResult<any>;\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private serverConfigService: ServerConfigService,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n ) {\r\n this.selectionManager = new SelectionManager({\r\n additiveMode: true,\r\n multiSelect: true,\r\n itemsAreEqual: (a, b) => a.id === b.id,\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.queryResult = this.dataService.collection.getCollections(1000, 0).refetchOnChannelChange();\r\n this.items$ = this.queryResult\r\n .mapStream(data => data.collections.items)\r\n .pipe(\r\n tap(items => this.selectionManager.setCurrentItems(items)),\r\n shareReplay(1),\r\n );\r\n this.activeCollectionId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n );\r\n this.expandedIds = this.route.snapshot.queryParamMap.get('expanded')?.split(',') ?? [];\r\n this.expandAll = this.route.snapshot.queryParamMap.get('expanded') === 'all';\r\n\r\n this.activeCollectionTitle$ = combineLatest(this.activeCollectionId$, this.items$).pipe(\r\n map(([id, collections]) => {\r\n if (id) {\r\n const match = collections.find(c => c.id === id);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }),\r\n );\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n\r\n this.filterTermControl.valueChanges\r\n .pipe(debounceTime(250), takeUntil(this.destroy$))\r\n .subscribe(term => {\r\n this.router.navigate(['./'], {\r\n queryParams: {\r\n q: term || undefined,\r\n },\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n });\r\n });\r\n\r\n this.route.queryParamMap\r\n .pipe(\r\n map(qpm => qpm.get('q')),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.refresh());\r\n this.filterTermControl.patchValue(this.route.snapshot.queryParamMap.get('q'));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.queryResult.completed$.next();\r\n this.destroy$.next(undefined);\r\n this.destroy$.complete();\r\n }\r\n\r\n toggleExpandAll() {\r\n this.router.navigate(['./'], {\r\n queryParams: {\r\n expanded: this.expandAll ? 'all' : undefined,\r\n },\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n });\r\n }\r\n\r\n onRearrange(event: RearrangeEvent) {\r\n this.dataService.collection.moveCollection([event]).subscribe({\r\n next: () => {\r\n this.notificationService.success(_('common.notify-saved-changes'));\r\n this.refresh();\r\n },\r\n error: err => {\r\n this.notificationService.error(_('common.notify-save-changes-error'));\r\n },\r\n });\r\n }\r\n\r\n deleteCollection(id: string) {\r\n this.items$\r\n .pipe(\r\n take(1),\r\n map(items => -1 < items.findIndex(i => i.parent && i.parent.id === id)),\r\n switchMap(hasChildren => {\r\n return this.modalService.dialog({\r\n title: _('catalog.confirm-delete-collection'),\r\n body: hasChildren\r\n ? _('catalog.confirm-delete-collection-and-children-body')\r\n : undefined,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n });\r\n }),\r\n switchMap(response => (response ? this.dataService.collection.deleteCollection(id) : EMPTY)),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Collection',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Collection',\r\n });\r\n },\r\n );\r\n }\r\n\r\n closeContents() {\r\n const params = { ...this.route.snapshot.params };\r\n delete params.contents;\r\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n refresh() {\r\n const filterTerm = this.route.snapshot.queryParamMap.get('q');\r\n this.queryResult.ref.refetch({\r\n options: {\r\n skip: 0,\r\n take: 1000,\r\n ...(filterTerm\r\n ? {\r\n filter: {\r\n name: {\r\n contains: filterTerm,\r\n },\r\n },\r\n }\r\n : {}),\r\n },\r\n });\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"\">\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"filterTermControl\"\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n class=\"clr-input search-input\"\r\n />\r\n <div class=\"flex center\">\r\n <clr-toggle-wrapper\r\n class=\"expand-all-toggle mt2\"\r\n >\r\n <input type=\"checkbox\" clrToggle [(ngModel)]=\"expandAll\" (change)=\"toggleExpandAll()\" />\r\n <label>\r\n {{ 'catalog.expand-all-collections' | translate }}\r\n </label>\r\n </clr-toggle-wrapper>\r\n <vdr-language-selector\r\n class=\"mt2\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </div>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"collection-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\r\n [routerLink]=\"['./create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-collection' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<div class=\"bulk-select-controls\">\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager.areAllCurrentItemsSelected()\"\r\n (click)=\"selectionManager.toggleSelectAll()\"\r\n />\r\n <vdr-bulk-action-menu\r\n class=\"ml2\"\r\n locationId=\"collection-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n</div>\r\n<div class=\"collection-wrapper\">\r\n <vdr-collection-tree\r\n [collections]=\"items$ | async\"\r\n [activeCollectionId]=\"activeCollectionId$ | async\"\r\n [expandAll]=\"expandAll\"\r\n [expandedIds]=\"expandedIds\"\r\n [selectionManager]=\"selectionManager\"\r\n (rearrange)=\"onRearrange($event)\"\r\n (deleteCollection)=\"deleteCollection($event)\"\r\n ></vdr-collection-tree>\r\n\r\n <div class=\"collection-contents\" [class.expanded]=\"activeCollectionId$ | async\">\r\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\">\r\n <ng-template let-count>\r\n <div class=\"collection-title\">\r\n {{ activeCollectionTitle$ | async }} ({{\r\n 'common.results-count' | translate: { count: count }\r\n }})\r\n </div>\r\n <button type=\"button\" class=\"close-button\" (click)=\"closeContents()\">\r\n <clr-icon shape=\"close\"></clr-icon>\r\n </button>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n CreateFacetInput,\r\n CreateFacetValueInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n DeletionResult,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n UpdateFacetInput,\r\n UpdateFacetValueInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mapTo, mergeMap, switchMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-facet-detail',\r\n templateUrl: './facet-detail.component.html',\r\n styleUrls: ['./facet-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FacetDetailComponent\r\n extends BaseDetailComponent<FacetWithValuesFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields: CustomFieldConfig[];\r\n customValueFields: CustomFieldConfig[];\r\n detailForm: FormGroup;\r\n values: Array<FacetWithValuesFragment['values'][number] | { name: string; code: string }>;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateFacet];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Facet');\r\n this.customValueFields = this.getCustomFieldConfig('FacetValue');\r\n this.detailForm = this.formBuilder.group({\r\n facet: this.formBuilder.group({\r\n code: ['', Validators.required],\r\n name: '',\r\n visible: true,\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n }),\r\n values: this.formBuilder.array([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n updateCode(currentCode: string, nameValue: string) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['facet', 'code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n updateValueCode(currentCode: string, nameValue: string, index: number) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['values', index, 'code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n customValueFieldIsSet(index: number, name: string): boolean {\r\n return !!this.detailForm.get(['values', index, 'customFields', name]);\r\n }\r\n\r\n getValuesFormArray(): FormArray {\r\n return this.detailForm.get('values') as FormArray;\r\n }\r\n\r\n addFacetValue() {\r\n const valuesFormArray = this.detailForm.get('values') as FormArray | null;\r\n if (valuesFormArray) {\r\n const valueGroup = this.formBuilder.group({\r\n id: '',\r\n name: ['', Validators.required],\r\n code: '',\r\n });\r\n const newValue: any = { name: '', code: '' };\r\n if (this.customValueFields.length) {\r\n const customValueFieldsGroup = new FormGroup({});\r\n newValue.customFields = {};\r\n\r\n for (const fieldDef of this.customValueFields) {\r\n const key = fieldDef.name;\r\n customValueFieldsGroup.addControl(key, new FormControl());\r\n }\r\n\r\n valueGroup.addControl('customFields', customValueFieldsGroup);\r\n }\r\n valuesFormArray.insert(valuesFormArray.length, valueGroup);\r\n this.values.push(newValue);\r\n }\r\n }\r\n\r\n create() {\r\n const facetForm = this.detailForm.get('facet');\r\n if (!facetForm || !facetForm.dirty) {\r\n return;\r\n }\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetForm as FormGroup,\r\n languageCode,\r\n ) as CreateFacetInput;\r\n return this.dataService.facet.createFacet(newFacet);\r\n }),\r\n switchMap(data => this.dataService.facet.getAllFacets().single$.pipe(mapTo(data))),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), { entity: 'Facet' });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createFacet.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Facet',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const facetGroup = this.detailForm.get('facet');\r\n const updateOperations: Array<Observable<any>> = [];\r\n\r\n if (facetGroup && facetGroup.dirty) {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetGroup as FormGroup,\r\n languageCode,\r\n ) as UpdateFacetInput;\r\n if (newFacet) {\r\n updateOperations.push(this.dataService.facet.updateFacet(newFacet));\r\n }\r\n }\r\n const valuesArray = this.detailForm.get('values');\r\n if (valuesArray && valuesArray.dirty) {\r\n const createdValues = this.getCreatedFacetValues(\r\n facet,\r\n valuesArray as FormArray,\r\n languageCode,\r\n );\r\n if (createdValues.length) {\r\n updateOperations.push(\r\n this.dataService.facet\r\n .createFacetValues(createdValues)\r\n .pipe(switchMap(() => this.dataService.facet.getFacet(this.id).single$)),\r\n );\r\n }\r\n const updatedValues = this.getUpdatedFacetValues(\r\n facet,\r\n valuesArray as FormArray,\r\n languageCode,\r\n );\r\n if (updatedValues.length) {\r\n updateOperations.push(this.dataService.facet.updateFacetValues(updatedValues));\r\n }\r\n }\r\n\r\n return forkJoin(updateOperations);\r\n }),\r\n switchMap(() => this.dataService.facet.getAllFacets().single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Facet' });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Facet',\r\n });\r\n },\r\n );\r\n }\r\n\r\n deleteFacetValue(facetValueId: string | undefined, index: number) {\r\n if (!facetValueId) {\r\n // deleting a newly-added (not persisted) FacetValue\r\n const valuesFormArray = this.detailForm.get('values') as FormArray | null;\r\n if (valuesFormArray) {\r\n valuesFormArray.removeAt(index);\r\n }\r\n this.values.splice(index, 1);\r\n return;\r\n }\r\n this.showModalAndDelete(facetValueId)\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\r\n map(r => r.result === DeletionResult.DELETED),\r\n );\r\n }\r\n }),\r\n switchMap(deleted => (deleted ? this.dataService.facet.getFacet(this.id).single$ : [])),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(facetValueId: string, message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-facet-value'),\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(result =>\r\n result ? this.dataService.facet.deleteFacetValues([facetValueId], !!message) : EMPTY,\r\n ),\r\n map(result => result.deleteFacetValues[0]),\r\n );\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the facet or current language.\r\n */\r\n protected setFormValues(facet: FacetWithValuesFragment, languageCode: LanguageCode) {\r\n const currentTranslation = findTranslation(facet, languageCode);\r\n\r\n this.detailForm.patchValue({\r\n facet: {\r\n code: facet.code,\r\n visible: !facet.isPrivate,\r\n name: currentTranslation?.name ?? '',\r\n },\r\n });\r\n\r\n if (this.customFields.length) {\r\n const customFieldsGroup = this.detailForm.get(['facet', 'customFields']) as FormGroup;\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['facet', 'customFields']),\r\n facet,\r\n currentTranslation,\r\n );\r\n }\r\n\r\n const currentValuesFormArray = this.detailForm.get('values') as FormArray;\r\n this.values = [...facet.values];\r\n facet.values.forEach((value, i) => {\r\n const valueTranslation = findTranslation(value, languageCode);\r\n const group = {\r\n id: value.id,\r\n code: value.code,\r\n name: valueTranslation ? valueTranslation.name : '',\r\n };\r\n const valueControl = currentValuesFormArray.at(i);\r\n if (valueControl) {\r\n valueControl.get('id')?.setValue(group.id);\r\n valueControl.get('code')?.setValue(group.code);\r\n valueControl.get('name')?.setValue(group.name);\r\n } else {\r\n currentValuesFormArray.insert(i, this.formBuilder.group(group));\r\n }\r\n if (this.customValueFields.length) {\r\n let customValueFieldsGroup = this.detailForm.get(['values', i, 'customFields']) as FormGroup;\r\n if (!customValueFieldsGroup) {\r\n customValueFieldsGroup = new FormGroup({});\r\n (this.detailForm.get(['values', i]) as FormGroup).addControl(\r\n 'customFields',\r\n customValueFieldsGroup,\r\n );\r\n }\r\n\r\n if (customValueFieldsGroup) {\r\n for (const fieldDef of this.customValueFields) {\r\n const key = fieldDef.name;\r\n const fieldValue =\r\n fieldDef.type === 'localeString'\r\n ? (valueTranslation as any | undefined)?.customFields?.[key]\r\n : (value as any).customFields[key];\r\n const control = customValueFieldsGroup.get(key);\r\n if (control) {\r\n control.setValue(fieldValue);\r\n } else {\r\n customValueFieldsGroup.addControl(key, new FormControl(fieldValue));\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Given a facet and the value of the detailForm, this method creates an updated copy of the facet which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedFacet(\r\n facet: FacetWithValuesFragment,\r\n facetFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): CreateFacetInput | UpdateFacetInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: facet,\r\n updatedFields: facetFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: facet.name || '',\r\n },\r\n });\r\n input.isPrivate = !facetFormGroup.value.visible;\r\n return input;\r\n }\r\n\r\n /**\r\n * Given an array of facet values and the values from the detailForm, this method creates a new array\r\n * which can be persisted to the API via a createFacetValues mutation.\r\n */\r\n private getCreatedFacetValues(\r\n facet: FacetWithValuesFragment,\r\n valuesFormArray: FormArray,\r\n languageCode: LanguageCode,\r\n ): CreateFacetValueInput[] {\r\n return valuesFormArray.controls\r\n .filter(c => !c.value.id)\r\n .map(c => c.value)\r\n .map(value =>\r\n createUpdatedTranslatable({\r\n translatable: { ...value, translations: [] as any },\r\n updatedFields: value,\r\n customFieldConfig: this.customValueFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n }),\r\n )\r\n .map(input => ({\r\n facetId: facet.id,\r\n ...input,\r\n }));\r\n }\r\n\r\n /**\r\n * Given an array of facet values and the values from the detailForm, this method creates a new array\r\n * which can be persisted to the API via an updateFacetValues mutation.\r\n */\r\n private getUpdatedFacetValues(\r\n facet: FacetWithValuesFragment,\r\n valuesFormArray: FormArray,\r\n languageCode: LanguageCode,\r\n ): UpdateFacetValueInput[] {\r\n const dirtyValues = facet.values.filter((v, i) => {\r\n const formRow = valuesFormArray.get(i.toString());\r\n return formRow && formRow.dirty && formRow.value.id;\r\n });\r\n const dirtyValueValues = valuesFormArray.controls\r\n .filter(c => c.dirty && c.value.id)\r\n .map(c => c.value);\r\n\r\n if (dirtyValues.length !== dirtyValueValues.length) {\r\n throw new Error(_(`error.facet-value-form-values-do-not-match`));\r\n }\r\n return dirtyValues\r\n .map((value, i) => {\r\n return createUpdatedTranslatable({\r\n translatable: value,\r\n updatedFields: dirtyValueValues[i],\r\n customFieldConfig: this.customValueFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n });\r\n })\r\n .filter(notNullOrUndefined);\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"facet-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as facet\">\r\n <section class=\"form-block\" formGroupName=\"facet\">\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"visible\"\r\n id=\"visibility\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.facet.visible; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateCode(facet.code, $event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n [readOnlyToggle]=\"updatePermission | hasPermission\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Facet\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['facet', 'customFields'])\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"facet-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </section>\r\n\r\n <section class=\"form-block\" *ngIf=\"!(isNew$ | async)\">\r\n <label>{{ 'catalog.facet-values' | translate }}</label>\r\n\r\n <table class=\"facet-values-list table\" formArrayName=\"values\" *ngIf=\"0 < getValuesFormArray().length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'common.code' | translate }}</th>\r\n <ng-container *ngIf=\"customValueFields.length\">\r\n <th>{{ 'common.custom-fields' | translate }}</th>\r\n </ng-container>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr class=\"facet-value\" *ngFor=\"let value of values; let i = index\" [formGroupName]=\"i\">\r\n <td class=\"align-middle\">\r\n <vdr-entity-info [entity]=\"value\"></vdr-entity-info>\r\n </td>\r\n <td class=\"align-middle\">\r\n <input\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateValueCode(facet.values[i]?.code, $event.target.value, i)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\"><input type=\"text\" formControlName=\"code\" readonly /></td>\r\n <td class=\"\" *ngIf=\"customValueFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"FacetValue\"\r\n [customFields]=\"customValueFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"detailForm.get(['values', i, 'customFields'])\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </td>\r\n <td class=\"align-middle\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteFacetValue(facet.values[i]?.id, i)\"\r\n [disabled]=\"!(updatePermission | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-secondary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\r\n (click)=\"addFacetValue()\"\r\n >\r\n <clr-icon shape=\"add\"></clr-icon>\r\n {{ 'catalog.add-facet-value' | translate }}\r\n </button>\r\n </div>\r\n </section>\r\n</form>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n DeletionResult,\r\n GetFacetListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n SelectionManager,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { SortOrder } from '@vendure/common/lib/generated-shop-types';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { debounceTime, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-facet-list',\r\n templateUrl: './facet-list.component.html',\r\n styleUrls: ['./facet-list.component.scss'],\r\n})\r\nexport class FacetListComponent\r\n extends BaseListComponent<GetFacetListQuery, ItemOf<GetFacetListQuery, 'facets'>>\r\n implements OnInit\r\n{\r\n filterTermControl = new FormControl('');\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n readonly initialLimit = 3;\r\n displayLimit: { [id: string]: number } = {};\r\n selectionManager: SelectionManager<ItemOf<GetFacetListQuery, 'facets'>>;\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private serverConfigService: ServerConfigService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.facet.getFacets(...args).refetchOnChannelChange(),\r\n data => data.facets,\r\n (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.filterTermControl.value,\r\n },\r\n },\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n },\r\n }),\r\n );\r\n this.selectionManager = new SelectionManager({\r\n multiSelect: true,\r\n itemsAreEqual: (a, b) => a.id === b.id,\r\n additiveMode: true,\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n this.filterTermControl.valueChanges\r\n .pipe(\r\n filter(value => 2 <= value.length || value.length === 0),\r\n debounceTime(250),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.refresh());\r\n }\r\n\r\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\r\n if (this.displayLimit[facet.id] === facet.values.length) {\r\n this.displayLimit[facet.id] = this.initialLimit;\r\n } else {\r\n this.displayLimit[facet.id] = facet.values.length;\r\n }\r\n }\r\n\r\n deleteFacet(facetValueId: string) {\r\n this.showModalAndDelete(facetValueId)\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\r\n map(r => r.result === DeletionResult.DELETED),\r\n );\r\n }\r\n }),\r\n // Refresh the cached facets to reflect the changes\r\n switchMap(() => this.dataService.facet.getAllFacets().single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'FacetValue',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n );\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n private showModalAndDelete(facetId: string, message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-facet'),\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: message ? _('common.force-delete') : _('common.delete'),\r\n returnValue: true,\r\n },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res => (res ? this.dataService.facet.deleteFacet(facetId, !!message) : EMPTY)),\r\n map(res => res.deleteFacet),\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"\">\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"filterTermControl\"\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n class=\"clr-input search-input\"\r\n />\r\n <div>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </div>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"facet-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\r\n [routerLink]=\"['./create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-facet' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n [selectionManager]=\"selectionManager\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"facet-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'catalog.values' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'catalog.visibility' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-facet=\"item\">\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">{{ facet.code }}</td>\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">{{ facet.name }}</td>\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let value of facet.values | slice: 0:displayLimit[facet.id] || 3\"\r\n [facetValue]=\"value\"\r\n [removable]=\"false\"\r\n [displayFacetName]=\"false\"\r\n ></vdr-facet-value-chip>\r\n <button\r\n class=\"btn btn-sm btn-secondary btn-icon\"\r\n *ngIf=\"facet.values.length > initialLimit\"\r\n (click)=\"toggleDisplayLimit(facet)\"\r\n >\r\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.values.length; else collapse\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ facet.values.length - initialLimit }}\r\n </ng-container>\r\n <ng-template #collapse>\r\n <clr-icon shape=\"minus\"></clr-icon>\r\n </ng-template>\r\n </button>\r\n </td>\r\n <td class=\"left align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-chip>\r\n <ng-container *ngIf=\"!facet.isPrivate; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </vdr-chip>\r\n </td>\r\n <td class=\"right align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', facet.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right align-middle\" [class.private]=\"facet.isPrivate\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteFacet(facet.id)\"\r\n [disabled]=\"!(['DeleteCatalog', 'DeleteFacet'] | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n Dialog,\r\n FacetValue,\r\n FacetValueSelectorComponent,\r\n FacetWithValuesFragment,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-apply-facet-dialog',\r\n templateUrl: './apply-facet-dialog.component.html',\r\n styleUrls: ['./apply-facet-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ApplyFacetDialogComponent implements Dialog<FacetValue[]>, AfterViewInit {\r\n @ViewChild(FacetValueSelectorComponent) private selector: FacetValueSelectorComponent;\r\n resolveWith: (result?: FacetValue[]) => void;\r\n selectedValues: FacetValue[] = [];\r\n // Provided by caller\r\n facets: FacetWithValuesFragment[];\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => this.selector.focus(), 0);\r\n }\r\n\r\n selectValues() {\r\n this.resolveWith(this.selectedValues);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'catalog.add-facets' | translate }}</ng-template>\r\n\r\n<vdr-facet-value-selector\r\n [facets]=\"facets\"\r\n (selectedValuesChange)=\"selectedValues = $event\"\r\n></vdr-facet-value-selector>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"selectValues()\"\r\n [disabled]=\"selectedValues.length === 0\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n Dialog,\r\n GetChannelsQuery,\r\n NotificationService,\r\n ProductVariantFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, from, Observable } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\n\r\ntype Channel = GetChannelsQuery['channels'][number];\r\n\r\n@Component({\r\n selector: 'vdr-assign-products-to-channel-dialog',\r\n templateUrl: './assign-products-to-channel-dialog.component.html',\r\n styleUrls: ['./assign-products-to-channel-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssignProductsToChannelDialogComponent implements OnInit, Dialog<any> {\r\n selectedChannel: Channel | null | undefined;\r\n currentChannel: Channel;\r\n availableChannels: Channel[];\r\n resolveWith: (result?: any) => void;\r\n variantsPreview$: Observable<Array<{ id: string; name: string; price: number; pricePreview: number }>>;\r\n priceFactorControl = new FormControl(1);\r\n selectedChannelIdControl = new FormControl();\r\n\r\n // assigned by ModalService.fromComponent() call\r\n productIds: string[];\r\n productVariantIds: string[] | undefined;\r\n currentChannelIds: string[];\r\n\r\n get isProductVariantMode(): boolean {\r\n return this.productVariantIds != null;\r\n }\r\n\r\n constructor(private dataService: DataService, private notificationService: NotificationService) {}\r\n\r\n ngOnInit() {\r\n const activeChannelId$ = this.dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n const allChannels$ = this.dataService.settings.getChannels().mapSingle(data => data.channels);\r\n\r\n combineLatest(activeChannelId$, allChannels$).subscribe(([activeChannelId, channels]) => {\r\n // tslint:disable-next-line:no-non-null-assertion\r\n this.currentChannel = channels.find(c => c.id === activeChannelId)!;\r\n this.availableChannels = channels;\r\n });\r\n\r\n this.selectedChannelIdControl.valueChanges.subscribe(ids => {\r\n this.selectChannel(ids);\r\n });\r\n\r\n this.variantsPreview$ = combineLatest(\r\n from(this.getTopVariants(10)),\r\n this.priceFactorControl.valueChanges.pipe(startWith(1)),\r\n ).pipe(\r\n map(([variants, factor]) => {\r\n return variants.map(v => ({\r\n id: v.id,\r\n name: v.name,\r\n price: v.price,\r\n pricePreview: v.price * +factor,\r\n }));\r\n }),\r\n );\r\n }\r\n\r\n selectChannel(channelIds: string[]) {\r\n this.selectedChannel = this.availableChannels.find(c => c.id === channelIds[0]);\r\n }\r\n\r\n assign() {\r\n const selectedChannel = this.selectedChannel;\r\n if (selectedChannel) {\r\n if (!this.isProductVariantMode) {\r\n this.dataService.product\r\n .assignProductsToChannel({\r\n channelId: selectedChannel.id,\r\n productIds: this.productIds,\r\n priceFactor: +this.priceFactorControl.value,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('catalog.assign-product-to-channel-success'), {\r\n channel: selectedChannel.code,\r\n count: this.productIds.length,\r\n });\r\n this.resolveWith(true);\r\n });\r\n } else if (this.productVariantIds) {\r\n this.dataService.product\r\n .assignVariantsToChannel({\r\n channelId: selectedChannel.id,\r\n productVariantIds: this.productVariantIds,\r\n priceFactor: +this.priceFactorControl.value,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('catalog.assign-variant-to-channel-success'), {\r\n channel: selectedChannel.code,\r\n // tslint:disable-next-line:no-non-null-assertion\r\n count: this.productVariantIds!.length,\r\n });\r\n this.resolveWith(true);\r\n });\r\n }\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private async getTopVariants(take: number): Promise<ProductVariantFragment[]> {\r\n const variants: ProductVariantFragment[] = [];\r\n\r\n for (let i = 0; i < this.productIds.length && variants.length < take; i++) {\r\n const productVariants = await this.dataService.product\r\n .getProduct(this.productIds[i], { take: this.isProductVariantMode ? undefined : take })\r\n .mapSingle(({ product }) => {\r\n const _variants = product ? product.variantList.items : [];\r\n return _variants.filter(v =>\r\n this.isProductVariantMode ? this.productVariantIds?.includes(v.id) : true,\r\n );\r\n })\r\n .toPromise();\r\n variants.push(...(productVariants || []));\r\n }\r\n return variants.slice(0, take);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <ng-container *ngIf=\"isProductVariantMode; else productModeTitle\">{{\r\n 'catalog.assign-variants-to-channel' | translate\r\n }}</ng-container>\r\n <ng-template #productModeTitle>{{ 'catalog.assign-products-to-channel' | translate }}</ng-template>\r\n</ng-template>\r\n\r\n<div class=\"flex\">\r\n <clr-input-container>\r\n <label>{{ 'common.channel' | translate }}</label>\r\n <vdr-channel-assignment-control\r\n clrInput\r\n [multiple]=\"false\"\r\n [includeDefaultChannel]=\"false\"\r\n [disableChannelIds]=\"currentChannelIds\"\r\n [formControl]=\"selectedChannelIdControl\"\r\n ></vdr-channel-assignment-control>\r\n </clr-input-container>\r\n <div class=\"flex-spacer\"></div>\r\n <clr-input-container>\r\n <label>{{ 'catalog.price-conversion-factor' | translate }}</label>\r\n <input clrInput type=\"number\" min=\"0\" max=\"99999\" [formControl]=\"priceFactorControl\" />\r\n </clr-input-container>\r\n</div>\r\n\r\n<div class=\"channel-price-preview\">\r\n <label class=\"clr-control-label\">{{ 'catalog.channel-price-preview' | translate }}</label>\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>\r\n {{\r\n 'catalog.price-in-channel'\r\n | translate: { channel: currentChannel?.code | channelCodeToLabel | translate }\r\n }}\r\n </th>\r\n <th>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.price-in-channel' | translate: { channel: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of variantsPreview$ | async\">\r\n <td>{{ row.name }}</td>\r\n <td>{{ row.price | localeCurrency: currentChannel?.currencyCode }}</td>\r\n <td>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\r\n {{ row.pricePreview | localeCurrency: selectedChannel?.currencyCode }}\r\n </ng-template>\r\n <ng-template #noChannelSelected> - </ng-template>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"assign()\" [disabled]=\"!selectedChannel\" class=\"btn btn-primary\">\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.assign-to-named-channel' | translate: { channelCode: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </button>\r\n</ng-template>\r\n","/**\r\n * @description\r\n * Like String.prototype.replace(), but replaces the last instance\r\n * rather than the first.\r\n */\r\nexport function replaceLast(target: string | undefined | null, search: string, replace: string): string {\r\n if (!target) {\r\n return '';\r\n }\r\n const lastIndex = target.lastIndexOf(search);\r\n if (lastIndex === -1) {\r\n return target;\r\n }\r\n const head = target.substr(0, lastIndex);\r\n const tail = target.substr(lastIndex).replace(search, replace);\r\n return head + tail;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n CreateProductInput,\r\n CreateProductVariantInput,\r\n DataService,\r\n DeletionResult,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n UpdateProductInput,\r\n UpdateProductMutation,\r\n UpdateProductOptionInput,\r\n UpdateProductVariantInput,\r\n UpdateProductVariantsMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { forkJoin, Observable, of, throwError } from 'rxjs';\r\nimport { map, mergeMap, shareReplay, switchMap } from 'rxjs/operators';\r\n\r\nimport { CreateProductVariantsConfig } from '../../components/generate-product-variants/generate-product-variants.component';\r\n\r\nimport { replaceLast } from './replace-last';\r\n\r\n/**\r\n * Handles the logic for making the API calls to perform CRUD operations on a Product and its related\r\n * entities. This logic was extracted out of the component because it became too large and hard to follow.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductDetailService {\r\n constructor(private dataService: DataService) {}\r\n\r\n getFacets(): Observable<FacetWithValuesFragment[]> {\r\n return this.dataService.facet.getAllFacets().mapSingle(data => data.facets.items);\r\n }\r\n\r\n getTaxCategories() {\r\n return this.dataService.settings\r\n .getTaxCategories()\r\n .mapSingle(data => data.taxCategories)\r\n .pipe(shareReplay(1));\r\n }\r\n\r\n createProductWithVariants(\r\n input: CreateProductInput,\r\n createVariantsConfig: CreateProductVariantsConfig,\r\n languageCode: LanguageCode,\r\n ) {\r\n const createProduct$ = this.dataService.product.createProduct(input);\r\n const nonEmptyOptionGroups = createVariantsConfig.groups.filter(g => 0 < g.values.length);\r\n const createOptionGroups$ = this.createProductOptionGroups(nonEmptyOptionGroups, languageCode);\r\n\r\n return forkJoin(createProduct$, createOptionGroups$).pipe(\r\n mergeMap(([{ createProduct }, optionGroups]) => {\r\n const addOptionsToProduct$ = optionGroups.length\r\n ? forkJoin(\r\n optionGroups.map(optionGroup => {\r\n return this.dataService.product.addOptionGroupToProduct({\r\n productId: createProduct.id,\r\n optionGroupId: optionGroup.id,\r\n });\r\n }),\r\n )\r\n : of([]);\r\n return addOptionsToProduct$.pipe(\r\n map(() => {\r\n return { createProduct, optionGroups };\r\n }),\r\n );\r\n }),\r\n mergeMap(({ createProduct, optionGroups }) => {\r\n const variants = createVariantsConfig.variants.map(v => {\r\n const optionIds = optionGroups.length\r\n ? v.optionValues.map((optionName, index) => {\r\n const option = optionGroups[index].options.find(o => o.name === optionName);\r\n if (!option) {\r\n throw new Error(\r\n `Could not find a matching ProductOption \"${optionName}\" when creating variant`,\r\n );\r\n }\r\n return option.id;\r\n })\r\n : [];\r\n return {\r\n ...v,\r\n optionIds,\r\n };\r\n });\r\n const options = optionGroups.map(og => og.options).reduce((flat, o) => [...flat, ...o], []);\r\n return this.createProductVariants(createProduct, variants, options, languageCode);\r\n }),\r\n );\r\n }\r\n\r\n createProductOptionGroups(groups: Array<{ name: string; values: string[] }>, languageCode: LanguageCode) {\r\n return groups.length\r\n ? forkJoin(\r\n groups.map(c => {\r\n return this.dataService.product\r\n .createProductOptionGroups({\r\n code: normalizeString(c.name, '-'),\r\n translations: [{ languageCode, name: c.name }],\r\n options: c.values.map(v => ({\r\n code: normalizeString(v, '-'),\r\n translations: [{ languageCode, name: v }],\r\n })),\r\n })\r\n .pipe(map(data => data.createProductOptionGroup));\r\n }),\r\n )\r\n : of([]);\r\n }\r\n\r\n createProductVariants(\r\n product: { name: string; id: string },\r\n variantData: Array<{ price: number; sku: string; stock: number; optionIds: string[] }>,\r\n options: Array<{ id: string; name: string }>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants: CreateProductVariantInput[] = variantData.map(v => {\r\n const name = options.length\r\n ? `${product.name} ${v.optionIds\r\n .map(id => options.find(o => o.id === id))\r\n .filter(notNullOrUndefined)\r\n .map(o => o.name)\r\n .join(' ')}`\r\n : product.name;\r\n return {\r\n productId: product.id,\r\n price: v.price,\r\n sku: v.sku,\r\n stockOnHand: v.stock,\r\n translations: [\r\n {\r\n languageCode,\r\n name,\r\n },\r\n ],\r\n optionIds: v.optionIds,\r\n };\r\n });\r\n return this.dataService.product.createProductVariants(variants).pipe(\r\n map(({ createProductVariants }) => ({\r\n createProductVariants,\r\n productId: product.id,\r\n })),\r\n );\r\n }\r\n\r\n updateProduct(updateOptions: {\r\n product: NonNullable<GetProductWithVariantsQuery['product']>;\r\n languageCode: LanguageCode;\r\n autoUpdate: boolean;\r\n productInput?: UpdateProductInput;\r\n variantsInput?: UpdateProductVariantInput[];\r\n }) {\r\n const { product, languageCode, autoUpdate, productInput, variantsInput } = updateOptions;\r\n const updateOperations: Array<Observable<UpdateProductMutation | UpdateProductVariantsMutation>> = [];\r\n const updateVariantsInput = variantsInput || [];\r\n\r\n const variants$ = autoUpdate\r\n ? this.dataService.product\r\n .getProductVariants({}, product.id)\r\n .mapSingle(({ productVariants }) => productVariants.items)\r\n : of([]);\r\n\r\n return variants$.pipe(\r\n mergeMap(variants => {\r\n if (productInput) {\r\n updateOperations.push(this.dataService.product.updateProduct(productInput));\r\n const productOldName = findTranslation(product, languageCode)?.name ?? '';\r\n const productNewName = findTranslation(productInput, languageCode)?.name;\r\n if (productNewName && productOldName !== productNewName && autoUpdate) {\r\n for (const variant of variants) {\r\n const currentVariantName = findTranslation(variant, languageCode)?.name || '';\r\n let variantInput: UpdateProductVariantInput;\r\n const existingVariantInput = updateVariantsInput.find(i => i.id === variant.id);\r\n if (existingVariantInput) {\r\n variantInput = existingVariantInput;\r\n } else {\r\n variantInput = {\r\n id: variant.id,\r\n translations: [{ languageCode, name: currentVariantName }],\r\n };\r\n updateVariantsInput.push(variantInput);\r\n }\r\n const variantTranslation = findTranslation(variantInput, languageCode);\r\n if (variantTranslation) {\r\n if (variantTranslation.name) {\r\n variantTranslation.name = replaceLast(\r\n variantTranslation.name,\r\n productOldName,\r\n productNewName,\r\n );\r\n } else {\r\n // The variant translation was falsy, which occurs\r\n // when defining the product name for a new translation\r\n // language that had not yet been defined.\r\n variantTranslation.name = [\r\n productNewName,\r\n ...variant.options.map(o => o.name),\r\n ].join(' ');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (updateVariantsInput.length) {\r\n updateOperations.push(\r\n this.dataService.product.updateProductVariants(updateVariantsInput),\r\n );\r\n }\r\n return forkJoin(updateOperations);\r\n }),\r\n );\r\n }\r\n\r\n updateProductOption(\r\n input: UpdateProductOptionInput & { autoUpdate: boolean },\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants$ = input.autoUpdate\r\n ? this.dataService.product\r\n .getProductVariants({}, product.id)\r\n .mapSingle(({ productVariants }) => productVariants.items)\r\n : of([]);\r\n\r\n return variants$.pipe(\r\n mergeMap(variants => {\r\n let updateProductVariantNames$: Observable<any> = of([]);\r\n if (input.autoUpdate) {\r\n // Update any ProductVariants' names which include the option name\r\n let oldOptionName: string | undefined;\r\n const newOptionName = findTranslation(input, languageCode)?.name;\r\n if (!newOptionName) {\r\n updateProductVariantNames$ = of([]);\r\n }\r\n const variantsToUpdate: UpdateProductVariantInput[] = [];\r\n for (const variant of variants) {\r\n if (variant.options.map(o => o.id).includes(input.id)) {\r\n if (!oldOptionName) {\r\n oldOptionName = findTranslation(\r\n variant.options.find(o => o.id === input.id),\r\n languageCode,\r\n )?.name;\r\n }\r\n const variantName = findTranslation(variant, languageCode)?.name || '';\r\n if (oldOptionName && newOptionName && variantName.includes(oldOptionName)) {\r\n variantsToUpdate.push({\r\n id: variant.id,\r\n translations: [\r\n {\r\n languageCode,\r\n name: replaceLast(variantName, oldOptionName, newOptionName),\r\n },\r\n ],\r\n });\r\n }\r\n }\r\n }\r\n if (variantsToUpdate.length) {\r\n updateProductVariantNames$ =\r\n this.dataService.product.updateProductVariants(variantsToUpdate);\r\n }\r\n }\r\n return this.dataService.product\r\n .updateProductOption(input)\r\n .pipe(mergeMap(() => updateProductVariantNames$));\r\n }),\r\n );\r\n }\r\n\r\n deleteProductVariant(id: string, productId: string) {\r\n return this.dataService.product.deleteProductVariant(id).pipe(\r\n switchMap(result => {\r\n if (result.deleteProductVariant.result === DeletionResult.DELETED) {\r\n return this.dataService.product.getProduct(productId).single$;\r\n } else {\r\n return throwError(result.deleteProductVariant.message);\r\n }\r\n }),\r\n );\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n Provider,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport const OPTION_VALUE_INPUT_VALUE_ACCESSOR: Provider = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => OptionValueInputComponent),\r\n multi: true,\r\n};\r\n\r\ninterface Option {\r\n id?: string;\r\n name: string;\r\n locked: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-option-value-input',\r\n templateUrl: './option-value-input.component.html',\r\n styleUrls: ['./option-value-input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n providers: [OPTION_VALUE_INPUT_VALUE_ACCESSOR],\r\n})\r\nexport class OptionValueInputComponent implements ControlValueAccessor {\r\n @Input() groupName = '';\r\n @ViewChild('textArea', { static: true }) textArea: ElementRef<HTMLTextAreaElement>;\r\n @ViewChildren('editNameInput', { read: ElementRef }) nameInputs: QueryList<ElementRef>;\r\n @Input() options: Option[];\r\n @Output() add = new EventEmitter<Option>();\r\n @Output() remove = new EventEmitter<Option>();\r\n @Output() edit = new EventEmitter<{ index: number; option: Option }>();\r\n @Input() disabled = false;\r\n input = '';\r\n isFocussed = false;\r\n lastSelected = false;\r\n formValue: Option[];\r\n editingIndex = -1;\r\n onChangeFn: (value: any) => void;\r\n onTouchFn: (value: any) => void;\r\n\r\n get optionValues(): Option[] {\r\n return this.formValue ?? this.options ?? [];\r\n }\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChangeFn = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouchFn = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.formValue = obj || [];\r\n }\r\n\r\n focus() {\r\n this.textArea.nativeElement.focus();\r\n }\r\n\r\n editName(index: number, event: MouseEvent) {\r\n const optionValue = this.optionValues[index];\r\n if (!optionValue.locked && !optionValue.id) {\r\n event.cancelBubble = true;\r\n this.editingIndex = index;\r\n const input = this.nameInputs.get(index)?.nativeElement;\r\n setTimeout(() => input?.focus());\r\n }\r\n }\r\n\r\n updateOption(index: number, event: InputEvent) {\r\n const optionValue = this.optionValues[index];\r\n const newName = (event.target as HTMLInputElement).value;\r\n if (optionValue) {\r\n if (newName) {\r\n optionValue.name = newName;\r\n this.edit.emit({ index, option: optionValue });\r\n }\r\n this.editingIndex = -1;\r\n }\r\n }\r\n\r\n removeOption(option: Option) {\r\n if (!option.locked) {\r\n if (this.formValue) {\r\n this.formValue = this.formValue?.filter(o => o.name !== option.name);\r\n this.onChangeFn(this.formValue);\r\n } else {\r\n this.remove.emit(option);\r\n }\r\n }\r\n }\r\n\r\n handleKey(event: KeyboardEvent) {\r\n switch (event.key) {\r\n case ',':\r\n case 'Enter':\r\n this.addOptionValue();\r\n event.preventDefault();\r\n break;\r\n case 'Backspace':\r\n if (this.lastSelected) {\r\n this.removeLastOption();\r\n this.lastSelected = false;\r\n } else if (this.input === '') {\r\n this.lastSelected = true;\r\n }\r\n break;\r\n default:\r\n this.lastSelected = false;\r\n }\r\n }\r\n\r\n handleBlur() {\r\n this.isFocussed = false;\r\n this.addOptionValue();\r\n }\r\n\r\n private addOptionValue() {\r\n const options = this.parseInputIntoOptions(this.input).filter(option => {\r\n // do not add an option with the same name\r\n // as an existing option\r\n const existing = this.options ?? this.formValue;\r\n return !existing?.find(o => o?.name === option.name);\r\n });\r\n if (!this.formValue && this.options) {\r\n for (const option of options) {\r\n this.add.emit(option);\r\n }\r\n } else {\r\n this.formValue = unique([...this.formValue, ...options]);\r\n this.onChangeFn(this.formValue);\r\n }\r\n this.input = '';\r\n }\r\n\r\n private parseInputIntoOptions(input: string): Option[] {\r\n return input\r\n .split(/[,\\n]/)\r\n .map(s => s.trim())\r\n .filter(s => s !== '')\r\n .map(s => ({ name: s, locked: false }));\r\n }\r\n\r\n private removeLastOption() {\r\n if (this.optionValues.length) {\r\n const option = this.optionValues[this.optionValues.length - 1];\r\n this.removeOption(option);\r\n }\r\n }\r\n}\r\n","<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\r\n <div class=\"chips\" *ngIf=\"0 < optionValues.length\">\r\n <vdr-chip\r\n *ngFor=\"let option of optionValues; last as isLast; index as i\"\r\n [icon]=\"option.locked ? 'lock' : 'times'\"\r\n [class.selected]=\"isLast && lastSelected\"\r\n [class.locked]=\"option.locked\"\r\n [colorFrom]=\"groupName\"\r\n (iconClick)=\"removeOption(option)\"\r\n >\r\n <span [hidden]=\"editingIndex !== i\">\r\n <input\r\n #editNameInput\r\n type=\"text\"\r\n [ngModel]=\"option.name\"\r\n (blur)=\"updateOption(i, $event)\"\r\n (click)=\"$event.cancelBubble = true\"\r\n />\r\n </span>\r\n <span\r\n class=\"option-name\"\r\n [class.editable]=\"!option.locked && !option.id\"\r\n (click)=\"editName(i, $event)\" [hidden]=\"editingIndex === i\">{{ option.name }}</span>\r\n </vdr-chip>\r\n </div>\r\n <textarea\r\n #textArea\r\n (keyup)=\"handleKey($event)\"\r\n (focus)=\"isFocussed = true\"\r\n (blur)=\"handleBlur()\"\r\n [(ngModel)]=\"input\"\r\n [disabled]=\"disabled\"\r\n ></textarea>\r\n</div>\r\n","import { Component, ElementRef, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\r\nimport { CurrencyCode, DataService } from '@vendure/admin-ui/core';\r\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\r\n\r\nimport { OptionValueInputComponent } from '../option-value-input/option-value-input.component';\r\n\r\nconst DEFAULT_VARIANT_CODE = '__DEFAULT_VARIANT__';\r\nexport type CreateVariantValues = {\r\n optionValues: string[];\r\n enabled: boolean;\r\n sku: string;\r\n price: number;\r\n stock: number;\r\n};\r\nexport type CreateProductVariantsConfig = {\r\n groups: Array<{ name: string; values: string[] }>;\r\n variants: CreateVariantValues[];\r\n};\r\n\r\n@Component({\r\n selector: 'vdr-generate-product-variants',\r\n templateUrl: './generate-product-variants.component.html',\r\n styleUrls: ['./generate-product-variants.component.scss'],\r\n})\r\nexport class GenerateProductVariantsComponent implements OnInit {\r\n @Output() variantsChange = new EventEmitter<CreateProductVariantsConfig>();\r\n @ViewChildren('optionGroupName', { read: ElementRef }) groupNameInputs: QueryList<ElementRef>;\r\n optionGroups: Array<{ name: string; values: Array<{ name: string; locked: boolean }> }> = [];\r\n currencyCode: CurrencyCode;\r\n variants: Array<{ id: string; values: string[] }>;\r\n variantFormValues: { [id: string]: CreateVariantValues } = {};\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.currencyCode;\r\n });\r\n\r\n this.generateVariants();\r\n }\r\n\r\n addOption() {\r\n this.optionGroups.push({ name: '', values: [] });\r\n const index = this.optionGroups.length - 1;\r\n setTimeout(() => {\r\n const input = this.groupNameInputs.get(index)?.nativeElement;\r\n input?.focus();\r\n });\r\n }\r\n\r\n removeOption(name: string) {\r\n this.optionGroups = this.optionGroups.filter(g => g.name !== name);\r\n this.generateVariants();\r\n }\r\n\r\n generateVariants() {\r\n const totalValuesCount = this.optionGroups.reduce((sum, group) => sum + group.values.length, 0);\r\n const groups = totalValuesCount\r\n ? this.optionGroups.map(g => g.values.map(v => v.name))\r\n : [[DEFAULT_VARIANT_CODE]];\r\n this.variants = generateAllCombinations(groups).map(values => ({ id: values.join('|'), values }));\r\n\r\n this.variants.forEach(variant => {\r\n if (!this.variantFormValues[variant.id]) {\r\n this.variantFormValues[variant.id] = {\r\n optionValues: variant.values,\r\n enabled: true,\r\n price: this.copyFromDefault(variant.id, 'price', 0),\r\n sku: this.copyFromDefault(variant.id, 'sku', ''),\r\n stock: this.copyFromDefault(variant.id, 'stock', 0),\r\n };\r\n }\r\n });\r\n this.onFormChange();\r\n }\r\n\r\n trackByFn(index: number, variant: { name: string; values: string[] }) {\r\n return variant.values.join('|');\r\n }\r\n\r\n handleEnter(event: KeyboardEvent, optionValueInputComponent: OptionValueInputComponent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n optionValueInputComponent.focus();\r\n }\r\n\r\n onFormChange() {\r\n const variantsToCreate = this.variants.map(v => this.variantFormValues[v.id]).filter(v => v.enabled);\r\n this.variantsChange.emit({\r\n groups: this.optionGroups.map(og => ({ name: og.name, values: og.values.map(v => v.name) })),\r\n variants: variantsToCreate,\r\n });\r\n }\r\n\r\n private copyFromDefault<T extends keyof CreateVariantValues>(\r\n variantId: string,\r\n prop: T,\r\n value: CreateVariantValues[T],\r\n ): CreateVariantValues[T] {\r\n return variantId !== DEFAULT_VARIANT_CODE\r\n ? this.variantFormValues[DEFAULT_VARIANT_CODE][prop]\r\n : value;\r\n }\r\n}\r\n","<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input\r\n #optionGroupName\r\n placeholder=\"e.g. Size\"\r\n clrInput\r\n [(ngModel)]=\"group.name\"\r\n name=\"name\"\r\n required\r\n (keydown.enter)=\"handleEnter($event, optionValueInputComponent)\"\r\n />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n (edit)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div class=\"remove-group\">\r\n <button\r\n class=\"btn btn-icon btn-warning-outline\"\r\n [title]=\"'catalog.remove-option' | translate\"\r\n (click)=\"removeOption(group.name)\"\r\n >\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOption()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"1 < variants.length\">{{ 'common.create' | translate }}</th>\r\n <th *ngIf=\"1 < variants.length\">{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let variant of variants; trackBy: trackByFn\"\r\n [class.disabled]=\"!variantFormValues[variant.id].enabled\"\r\n >\r\n <td *ngIf=\"1 < variants.length\">\r\n <input\r\n type=\"checkbox\"\r\n (change)=\"onFormChange()\"\r\n [(ngModel)]=\"variantFormValues[variant.id].enabled\"\r\n clrCheckbox\r\n />\r\n </td>\r\n <td *ngIf=\"1 < variants.length\">\r\n {{ variant.values.join(' ') }}\r\n </td>\r\n <td>\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n (change)=\"onFormChange()\"\r\n [(ngModel)]=\"variantFormValues[variant.id].sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td>\r\n <clr-input-container>\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variantFormValues[variant.id].price\"\r\n (ngModelChange)=\"onFormChange()\"\r\n [currencyCode]=\"currencyCode\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </td>\r\n <td>\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variantFormValues[variant.id].stock\"\r\n (change)=\"onFormChange()\"\r\n min=\"0\"\r\n step=\"1\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { FormArray, FormGroup } from '@angular/forms';\r\nimport { Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\nimport { PaginationConfig, SelectedAssets } from '../product-detail/product-detail.types';\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-table',\r\n templateUrl: './product-variants-table.component.html',\r\n styleUrls: ['./product-variants-table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantsTableComponent implements OnInit, OnDestroy {\r\n @Input('productVariantsFormArray') formArray: FormArray;\r\n @Input() variants: ProductVariantFragment[];\r\n @Input() paginationConfig: PaginationConfig;\r\n @Input() channelPriceIncludesTax: boolean;\r\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\r\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\r\n formGroupMap = new Map<string, FormGroup>();\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n private subscription: Subscription;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.subscription = this.formArray.valueChanges\r\n .pipe(\r\n map(value => value.length),\r\n debounceTime(1),\r\n distinctUntilChanged(),\r\n )\r\n .subscribe(() => {\r\n this.buildFormGroupMap();\r\n });\r\n\r\n this.buildFormGroupMap();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n trackByFn(index: number, item: any) {\r\n if ((item as any).id != null) {\r\n return (item as any).id;\r\n } else {\r\n return index;\r\n }\r\n }\r\n\r\n getFeaturedAsset(variant: ProductVariantFragment) {\r\n return this.pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset;\r\n }\r\n\r\n optionGroupName(optionGroupId: string): string | undefined {\r\n const group = this.optionGroups.find(g => g.id === optionGroupId);\r\n return group && group.name;\r\n }\r\n\r\n private buildFormGroupMap() {\r\n this.formGroupMap.clear();\r\n for (const controlGroup of this.formArray.controls) {\r\n this.formGroupMap.set(controlGroup.value.id, controlGroup as FormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <ng-container *ngFor=\"let optionGroup of optionGroups | sort: 'id'\">\r\n <th>{{ optionGroup.name }}</th>\r\n </ng-container>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th>{{ 'common.enabled' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let variant of variants | paginate: paginationConfig; index as i; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <div class=\"card-img\">\r\n <div class=\"featured-asset\">\r\n <img\r\n *ngIf=\"getFeaturedAsset(variant) as featuredAsset; else placeholder\"\r\n [src]=\"featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n <ng-template #placeholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'common.name' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <ng-container *ngFor=\"let option of variant.options | sort: 'groupId'\">\r\n <td\r\n class=\"left align-middle\"\r\n [class.disabled]=\"!formGroup.get('enabled')!.value\"\r\n [style.color]=\"optionGroupName(option.groupId) | stringToColor\"\r\n >\r\n {{ option.name }}\r\n </td>\r\n </ng-container>\r\n <td class=\"left align-middle price\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <vdr-currency-input\r\n *ngIf=\"!channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input>\r\n <vdr-currency-input\r\n *ngIf=\"channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"priceWithTax\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n min=\"0\"\r\n step=\"1\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n formControlName=\"enabled\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n</table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n LanguageCode,\r\n ProductVariantFragment,\r\n UpdateProductOptionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { createUpdatedTranslatable } from '@vendure/admin-ui/core';\r\nimport { Dialog } from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\n\r\n@Component({\r\n selector: 'vdr-update-product-option-dialog',\r\n templateUrl: './update-product-option-dialog.component.html',\r\n styleUrls: ['./update-product-option-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UpdateProductOptionDialogComponent\r\n implements Dialog<UpdateProductOptionInput & { autoUpdate: boolean }>, OnInit\r\n{\r\n resolveWith: (result?: UpdateProductOptionInput & { autoUpdate: boolean }) => void;\r\n updateVariantName = true;\r\n // Provided by caller\r\n productOption: ProductVariantFragment['options'][number];\r\n activeLanguage: LanguageCode;\r\n name: string;\r\n code: string;\r\n customFields: CustomFieldConfig[];\r\n codeInputTouched = false;\r\n customFieldsForm: FormGroup;\r\n\r\n ngOnInit(): void {\r\n const currentTranslation = this.productOption.translations.find(\r\n t => t.languageCode === this.activeLanguage,\r\n );\r\n this.name = currentTranslation?.name ?? '';\r\n this.code = this.productOption.code;\r\n this.customFieldsForm = new FormGroup({});\r\n if (this.customFields) {\r\n const cfCurrentTranslation =\r\n (currentTranslation && (currentTranslation as any).customFields) || {};\r\n\r\n for (const fieldDef of this.customFields) {\r\n const key = fieldDef.name;\r\n const value =\r\n fieldDef.type === 'localeString'\r\n ? cfCurrentTranslation[key]\r\n : (this.productOption as any).customFields[key];\r\n this.customFieldsForm.addControl(fieldDef.name, new FormControl(value));\r\n }\r\n }\r\n }\r\n\r\n update() {\r\n const result = createUpdatedTranslatable({\r\n translatable: this.productOption,\r\n languageCode: this.activeLanguage,\r\n updatedFields: {\r\n code: this.code,\r\n name: this.name,\r\n customFields: this.customFieldsForm.value,\r\n },\r\n customFieldConfig: this.customFields,\r\n defaultTranslation: {\r\n languageCode: this.activeLanguage,\r\n name: '',\r\n },\r\n });\r\n this.resolveWith({ ...result, autoUpdate: this.updateVariantName });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n updateCode(nameValue: string) {\r\n if (!this.codeInputTouched && !this.productOption.code) {\r\n this.code = normalizeString(nameValue, '-');\r\n }\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'catalog.update-product-option' | translate }}</ng-template>\r\n<vdr-form-field [label]=\"'catalog.option-name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n #nameInput=\"ngModel\"\r\n [(ngModel)]=\"name\"\r\n required\r\n (input)=\"updateCode($event.target.value)\"\r\n />\r\n</vdr-form-field>\r\n<vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input id=\"code\" type=\"text\" #codeInput=\"ngModel\" required [(ngModel)]=\"code\" pattern=\"[a-z0-9_-]+\" />\r\n</vdr-form-field>\r\n<clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"updateVariantName\" />\r\n <label>{{ 'catalog.auto-update-option-variant-name' | translate }}</label>\r\n</clr-checkbox-wrapper>\r\n<section *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOption\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"customFieldsForm\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n</section>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"update()\"\r\n [disabled]=\"\r\n nameInput.invalid ||\r\n codeInput.invalid ||\r\n (nameInput.pristine && codeInput.pristine && customFieldsForm.pristine)\r\n \"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'catalog.update-product-option' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-variant-price-detail',\r\n templateUrl: './variant-price-detail.component.html',\r\n styleUrls: ['./variant-price-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class VariantPriceDetailComponent implements OnInit, OnChanges {\r\n @Input() priceIncludesTax: boolean;\r\n @Input() price: number;\r\n @Input() currencyCode: string;\r\n @Input() taxCategoryId: string;\r\n\r\n grossPrice$: Observable<number>;\r\n taxRate$: Observable<number>;\r\n\r\n private priceChange$ = new BehaviorSubject<number>(0);\r\n private taxCategoryIdChange$ = new BehaviorSubject<string>('');\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n const taxRates$ = this.dataService.settings\r\n .getTaxRatesSimple(999, 0, 'cache-first')\r\n .mapStream(data => data.taxRates.items);\r\n const activeChannel$ = this.dataService.settings\r\n .getActiveChannel('cache-first')\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel);\r\n\r\n this.taxRate$ = combineLatest(activeChannel$, taxRates$, this.taxCategoryIdChange$).pipe(\r\n map(([channel, taxRates, taxCategoryId]) => {\r\n const defaultTaxZone = channel.defaultTaxZone;\r\n if (!defaultTaxZone) {\r\n return 0;\r\n }\r\n const applicableRate = taxRates.find(\r\n taxRate => taxRate.zone.id === defaultTaxZone.id && taxRate.category.id === taxCategoryId,\r\n );\r\n\r\n if (!applicableRate) {\r\n return 0;\r\n }\r\n return applicableRate.value;\r\n }),\r\n );\r\n\r\n this.grossPrice$ = combineLatest(this.taxRate$, this.priceChange$).pipe(\r\n map(([taxRate, price]) => {\r\n return Math.round(price * ((100 + taxRate) / 100));\r\n }),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('price' in changes) {\r\n this.priceChange$.next(changes.price.currentValue);\r\n }\r\n if ('taxCategoryId' in changes) {\r\n this.taxCategoryIdChange$.next(changes.taxCategoryId.currentValue);\r\n }\r\n }\r\n}\r\n","<label class=\"clr-control-label\">{{ 'catalog.taxes' | translate }}</label>\r\n<div *ngIf=\"priceIncludesTax\" class=\"value\">\r\n {{ 'catalog.price-includes-tax-at' | translate: { rate: taxRate$ | async } }}\r\n</div>\r\n<div *ngIf=\"!priceIncludesTax\" class=\"value\">\r\n {{\r\n 'catalog.price-with-tax-in-default-zone'\r\n | translate: { price: grossPrice$ | async | localeCurrency: currencyCode, rate: taxRate$ | async }\r\n }}\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { FormArray, FormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n DataService,\r\n FacetValueFragment,\r\n FacetWithValuesFragment,\r\n flattenFacetValues,\r\n GlobalFlag,\r\n LanguageCode,\r\n ModalService,\r\n Permission,\r\n ProductDetailFragment,\r\n ProductOptionFragment,\r\n ProductVariantFragment,\r\n TaxCategory,\r\n UpdateProductOptionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\nimport { AssetChange } from '../assets/assets.component';\r\nimport { PaginationConfig, SelectedAssets, VariantFormValue } from '../product-detail/product-detail.types';\r\nimport { UpdateProductOptionDialogComponent } from '../update-product-option-dialog/update-product-option-dialog.component';\r\n\r\nexport interface VariantAssetChange extends AssetChange {\r\n variantId: string;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-list',\r\n templateUrl: './product-variants-list.component.html',\r\n styleUrls: ['./product-variants-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantsListComponent implements OnChanges, OnInit, OnDestroy {\r\n @Input('productVariantsFormArray') formArray: FormArray;\r\n @Input() variants: ProductVariantFragment[];\r\n @Input() paginationConfig: PaginationConfig;\r\n @Input() channelPriceIncludesTax: boolean;\r\n @Input() taxCategories: TaxCategory[];\r\n @Input() facets: FacetWithValuesFragment[];\r\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\r\n @Input() customFields: CustomFieldConfig[];\r\n @Input() customOptionFields: CustomFieldConfig[];\r\n @Input() activeLanguage: LanguageCode;\r\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\r\n @Output() assignToChannel = new EventEmitter<ProductVariantFragment>();\r\n @Output() removeFromChannel = new EventEmitter<{\r\n channelId: string;\r\n variant: ProductVariantFragment;\r\n }>();\r\n @Output() assetChange = new EventEmitter<VariantAssetChange>();\r\n @Output() selectionChange = new EventEmitter<string[]>();\r\n @Output() selectFacetValueClick = new EventEmitter<string[]>();\r\n @Output() updateProductOption = new EventEmitter<UpdateProductOptionInput & { autoUpdate: boolean }>();\r\n selectedVariantIds: string[] = [];\r\n formGroupMap = new Map<string, FormGroup>();\r\n GlobalFlag = GlobalFlag;\r\n globalTrackInventory: boolean;\r\n globalOutOfStockThreshold: number;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n private facetValues: FacetValueFragment[];\r\n private subscription: Subscription;\r\n\r\n constructor(\r\n private changeDetector: ChangeDetectorRef,\r\n private modalService: ModalService,\r\n private dataService: DataService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getGlobalSettings('cache-first').single$.subscribe(({ globalSettings }) => {\r\n this.globalTrackInventory = globalSettings.trackInventory;\r\n this.globalOutOfStockThreshold = globalSettings.outOfStockThreshold;\r\n this.changeDetector.markForCheck();\r\n });\r\n this.subscription = this.formArray.valueChanges.subscribe(() => this.changeDetector.markForCheck());\r\n\r\n this.subscription.add(\r\n this.formArray.valueChanges\r\n .pipe(\r\n map(value => value.length),\r\n debounceTime(1),\r\n distinctUntilChanged(),\r\n )\r\n .subscribe(() => {\r\n this.buildFormGroupMap();\r\n }),\r\n );\r\n\r\n this.buildFormGroupMap();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if ('facets' in changes && !!changes['facets'].currentValue) {\r\n this.facetValues = flattenFacetValues(this.facets);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n trackById(index: number, item: ProductVariantFragment) {\r\n return item.id;\r\n }\r\n\r\n inventoryIsNotTracked(formGroup: FormGroup): boolean {\r\n const trackInventory = formGroup.get('trackInventory')?.value;\r\n return (\r\n trackInventory === GlobalFlag.FALSE ||\r\n (trackInventory === GlobalFlag.INHERIT && this.globalTrackInventory === false)\r\n );\r\n }\r\n\r\n getTaxCategoryName(group: FormGroup): string {\r\n const control = group.get(['taxCategoryId']);\r\n if (control && this.taxCategories) {\r\n const match = this.taxCategories.find(t => t.id === control.value);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }\r\n\r\n getStockOnHandMinValue(variant: FormGroup) {\r\n const effectiveOutOfStockThreshold = variant.get('useGlobalOutOfStockThreshold')?.value\r\n ? this.globalOutOfStockThreshold\r\n : variant.get('outOfStockThreshold')?.value;\r\n return effectiveOutOfStockThreshold;\r\n }\r\n\r\n getSaleableStockLevel(variant: ProductVariantFragment) {\r\n const effectiveOutOfStockThreshold = variant.useGlobalOutOfStockThreshold\r\n ? this.globalOutOfStockThreshold\r\n : variant.outOfStockThreshold;\r\n return variant.stockOnHand - variant.stockAllocated - effectiveOutOfStockThreshold;\r\n }\r\n\r\n areAllSelected(): boolean {\r\n return !!this.variants && this.selectedVariantIds.length === this.variants.length;\r\n }\r\n\r\n onAssetChange(variantId: string, event: AssetChange) {\r\n this.assetChange.emit({\r\n variantId,\r\n ...event,\r\n });\r\n const index = this.variants.findIndex(v => v.id === variantId);\r\n this.formArray.at(index).markAsDirty();\r\n }\r\n\r\n toggleSelectAll() {\r\n if (this.areAllSelected()) {\r\n this.selectedVariantIds = [];\r\n } else {\r\n this.selectedVariantIds = this.variants.map(v => v.id);\r\n }\r\n this.selectionChange.emit(this.selectedVariantIds);\r\n }\r\n\r\n toggleSelectVariant(variantId: string) {\r\n const index = this.selectedVariantIds.indexOf(variantId);\r\n if (-1 < index) {\r\n this.selectedVariantIds.splice(index, 1);\r\n } else {\r\n this.selectedVariantIds.push(variantId);\r\n }\r\n this.selectionChange.emit(this.selectedVariantIds);\r\n }\r\n\r\n optionGroupName(optionGroupId: string): string | undefined {\r\n const group = this.optionGroups.find(g => g.id === optionGroupId);\r\n if (group) {\r\n const translation =\r\n group?.translations.find(t => t.languageCode === this.activeLanguage) ??\r\n group.translations[0];\r\n return translation.name;\r\n }\r\n }\r\n\r\n optionName(option: ProductOptionFragment) {\r\n const translation =\r\n option.translations.find(t => t.languageCode === this.activeLanguage) ?? option.translations[0];\r\n return translation.name;\r\n }\r\n\r\n pendingFacetValues(variant: ProductVariantFragment) {\r\n if (this.facets) {\r\n const formFacetValueIds = this.getFacetValueIds(variant.id);\r\n const variantFacetValueIds = variant.facetValues.map(fv => fv.id);\r\n return formFacetValueIds\r\n .filter(x => !variantFacetValueIds.includes(x))\r\n .map(id => this.facetValues.find(fv => fv.id === id))\r\n .filter(notNullOrUndefined);\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n existingFacetValues(variant: ProductVariantFragment) {\r\n const formFacetValueIds = this.getFacetValueIds(variant.id);\r\n const intersection = [...formFacetValueIds].filter(x =>\r\n variant.facetValues.map(fv => fv.id).includes(x),\r\n );\r\n return intersection\r\n .map(id => variant.facetValues.find(fv => fv.id === id))\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n removeFacetValue(variant: ProductVariantFragment, facetValueId: string) {\r\n const formGroup = this.formGroupMap.get(variant.id);\r\n if (formGroup) {\r\n const newValue = (formGroup.value as VariantFormValue).facetValueIds.filter(\r\n id => id !== facetValueId,\r\n );\r\n formGroup.patchValue({\r\n facetValueIds: newValue,\r\n });\r\n formGroup.markAsDirty();\r\n }\r\n }\r\n\r\n isVariantSelected(variantId: string): boolean {\r\n return -1 < this.selectedVariantIds.indexOf(variantId);\r\n }\r\n\r\n editOption(option: ProductVariantFragment['options'][number]) {\r\n this.modalService\r\n .fromComponent(UpdateProductOptionDialogComponent, {\r\n size: 'md',\r\n locals: {\r\n productOption: option,\r\n activeLanguage: this.activeLanguage,\r\n customFields: this.customOptionFields,\r\n },\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n this.updateProductOption.emit(result);\r\n }\r\n });\r\n }\r\n\r\n private buildFormGroupMap() {\r\n this.formGroupMap.clear();\r\n for (const controlGroup of this.formArray.controls) {\r\n this.formGroupMap.set(controlGroup.value.id, controlGroup as FormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n private getFacetValueIds(id: string): string[] {\r\n const formValue: VariantFormValue = this.formGroupMap.get(id)?.value;\r\n return formValue.facetValueIds;\r\n }\r\n}\r\n","<div class=\"variants-list\">\r\n <div\r\n class=\"variant-container card\"\r\n *ngFor=\"\r\n let variant of variants | paginate: paginationConfig || { itemsPerPage: 10, currentPage: 1 };\r\n trackBy: trackById;\r\n let i = index\r\n \"\r\n [class.disabled]=\"!formGroupMap.get(variant.id)?.get('enabled')?.value\"\r\n >\r\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\r\n <div class=\"card-block header-row\">\r\n <div class=\"details\">\r\n <vdr-title-input class=\"sku\" [readonly]=\"!(updatePermission | hasPermission)\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </vdr-title-input>\r\n <vdr-title-input class=\"name\" [readonly]=\"!(updatePermission | hasPermission)\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'common.name' | translate\"\r\n />\r\n </clr-input-container>\r\n </vdr-title-input>\r\n </div>\r\n <div class=\"right-controls\">\r\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermission\">\r\n <input type=\"checkbox\" clrToggle name=\"enabled\" formControlName=\"enabled\" />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"variant-body\">\r\n <div class=\"assets\">\r\n <vdr-assets\r\n [compact]=\"true\"\r\n [assets]=\"pendingAssetChanges[variant.id]?.assets || variant.assets\"\r\n [featuredAsset]=\"\r\n pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset\r\n \"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"onAssetChange(variant.id, $event)\"\r\n ></vdr-assets>\r\n </div>\r\n <div class=\"variant-form-inputs\">\r\n <div class=\"standard-fields\">\r\n <div class=\"variant-form-input-row\">\r\n <div class=\"tax-category\">\r\n <clr-select-container\r\n *vdrIfPermissions=\"updatePermission; else taxCategoryLabel\"\r\n >\r\n <label>{{ 'catalog.tax-category' | translate }}</label>\r\n <select clrSelect name=\"options\" formControlName=\"taxCategoryId\">\r\n <option\r\n *ngFor=\"let taxCategory of taxCategories\"\r\n [value]=\"taxCategory.id\"\r\n >\r\n {{ taxCategory.name }}\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n <ng-template #taxCategoryLabel>\r\n <label class=\"clr-control-label\">{{\r\n 'catalog.tax-category' | translate\r\n }}</label>\r\n <div class=\"tax-category-label\">\r\n {{ getTaxCategoryName(formGroup) }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"price\">\r\n <clr-input-container>\r\n <label>{{ 'catalog.price' | translate }}</label>\r\n <vdr-currency-input\r\n *ngIf=\"!channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input>\r\n <vdr-currency-input\r\n *ngIf=\"channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"priceWithTax\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </div>\r\n <vdr-variant-price-detail\r\n [price]=\"formGroup.get('price')!.value\"\r\n [currencyCode]=\"variant.currencyCode\"\r\n [priceIncludesTax]=\"channelPriceIncludesTax\"\r\n [taxCategoryId]=\"formGroup.get('taxCategoryId')!.value\"\r\n ></vdr-variant-price-detail>\r\n </div>\r\n <div class=\"variant-form-input-row\">\r\n <clr-select-container *vdrIfPermissions=\"updatePermission\">\r\n <label\r\n >{{ 'catalog.track-inventory' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.track-inventory-tooltip' | translate\"\r\n ></vdr-help-tooltip>\r\n </label>\r\n <select clrSelect name=\"options\" formControlName=\"trackInventory\">\r\n <option [value]=\"GlobalFlag.TRUE\">\r\n {{ 'catalog.track-inventory-true' | translate }}\r\n </option>\r\n <option [value]=\"GlobalFlag.FALSE\">\r\n {{ 'catalog.track-inventory-false' | translate }}\r\n </option>\r\n <option [value]=\"GlobalFlag.INHERIT\">\r\n {{ 'catalog.track-inventory-inherit' | translate }}\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n <clr-input-container>\r\n <label\r\n >{{ 'catalog.stock-on-hand' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.stock-on-hand-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <input\r\n [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\"\r\n clrInput\r\n type=\"number\"\r\n [min]=\"getStockOnHandMinValue(formGroup)\"\r\n step=\"1\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [vdrDisabled]=\"inventoryIsNotTracked(formGroup)\"\r\n />\r\n </clr-input-container>\r\n <div [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\">\r\n <label class=\"clr-control-label\"\r\n >{{ 'catalog.stock-allocated' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.stock-allocated-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <div class=\"value\">\r\n {{ variant.stockAllocated }}\r\n </div>\r\n </div>\r\n <div [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\">\r\n <label class=\"clr-control-label\"\r\n >{{ 'catalog.stock-saleable' | translate }}\r\n <vdr-help-tooltip\r\n [content]=\"'catalog.stock-saleable-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <div class=\"value\">\r\n {{ getSaleableStockLevel(variant) }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"variant-form-input-row\">\r\n <div\r\n class=\"out-of-stock-threshold-wrapper\"\r\n [class.inventory-untracked]=\"inventoryIsNotTracked(formGroup)\"\r\n >\r\n <label class=\"clr-control-label\"\r\n >{{ 'catalog.out-of-stock-threshold' | translate\r\n }}<vdr-help-tooltip\r\n [content]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\r\n ></vdr-help-tooltip\r\n ></label>\r\n <div class=\"flex\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [formControl]=\"formGroup.get('outOfStockThreshold')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [vdrDisabled]=\"\r\n formGroup.get('useGlobalOutOfStockThreshold')?.value !==\r\n false || inventoryIsNotTracked(formGroup)\r\n \"\r\n />\r\n </clr-input-container>\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"useGlobalOutOfStockThreshold\"\r\n formControlName=\"useGlobalOutOfStockThreshold\"\r\n [vdrDisabled]=\"\r\n !(updatePermission | hasPermission) ||\r\n inventoryIsNotTracked(formGroup)\r\n \"\r\n />\r\n <label\r\n >{{ 'catalog.use-global-value' | translate }} ({{\r\n globalOutOfStockThreshold\r\n }})</label\r\n >\r\n </clr-toggle-wrapper>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"custom-fields\">\r\n <div class=\"variant-form-input-row\">\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductVariant\"\r\n [customFields]=\"customFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"formGroup.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"options-facets\">\r\n <vdr-entity-info [entity]=\"variant\"></vdr-entity-info>\r\n <div *ngIf=\"variant.options.length\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let option of variant.options | sort: 'groupId'\"\r\n [colorFrom]=\"optionGroupName(option.groupId)\"\r\n [invert]=\"true\"\r\n (iconClick)=\"editOption(option)\"\r\n [icon]=\"(updatePermission | hasPermission) && 'pencil'\"\r\n >\r\n <span class=\"option-group-name\">{{ optionGroupName(option.groupId) }}</span>\r\n {{ optionName(option) }}\r\n </vdr-chip>\r\n <a [routerLink]=\"['./', 'options']\" class=\"btn btn-link btn-sm\"\r\n >{{ 'catalog.edit-options' | translate }}...</a\r\n >\r\n </div>\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <div class=\"facets\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of existingFacetValues(variant)\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"updatePermission | hasPermission\"\r\n (remove)=\"removeFacetValue(variant, facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of pendingFacetValues(variant)\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"updatePermission | hasPermission\"\r\n (remove)=\"removeFacetValue(variant, facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"selectFacetValueClick.emit([variant.id])\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *vdrIfMultichannel>\r\n <div class=\"card-block\" *vdrIfDefaultChannelActive>\r\n <div class=\"flex channel-assignment\">\r\n <ng-container *ngFor=\"let channel of variant.channels\">\r\n <vdr-chip\r\n *ngIf=\"!isDefaultChannel(channel.code)\"\r\n icon=\"times-circle\"\r\n [title]=\"'catalog.remove-from-channel' | translate: { channelCode: channel.code }\"\r\n (iconClick)=\"\r\n removeFromChannel.emit({ channelId: channel.id, variant: variant })\r\n \"\r\n >\r\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n <button class=\"btn btn-sm\" (click)=\"assignToChannel.emit(variant)\">\r\n <clr-icon shape=\"layers\"></clr-icon>\r\n {{ 'catalog.assign-to-channel' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n","import { Location } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n CreateProductInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n flattenFacetValues,\r\n getChannelCodeFromUserStatus,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ProductDetailFragment,\r\n ProductVariantFragment,\r\n ServerConfigService,\r\n TaxCategoryFragment,\r\n unicodePatternValidator,\r\n UpdateProductInput,\r\n UpdateProductMutation,\r\n UpdateProductOptionInput,\r\n UpdateProductVariantInput,\r\n UpdateProductVariantsMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { BehaviorSubject, combineLatest, EMPTY, from, merge, Observable } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n skipUntil,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n tap,\r\n withLatestFrom,\r\n} from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { CreateProductVariantsConfig } from '../generate-product-variants/generate-product-variants.component';\r\nimport { VariantAssetChange } from '../product-variants-list/product-variants-list.component';\r\n\r\nimport { PaginationConfig, SelectedAssets, TabName, VariantFormValue } from './product-detail.types';\r\n\r\n@Component({\r\n selector: 'vdr-product-detail',\r\n templateUrl: './product-detail.component.html',\r\n styleUrls: ['./product-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductDetailComponent\r\n extends BaseDetailComponent<NonNullable<GetProductWithVariantsQuery['product']>>\r\n implements OnInit, OnDestroy\r\n{\r\n activeTab$: Observable<TabName>;\r\n product$: Observable<NonNullable<GetProductWithVariantsQuery['product']>>;\r\n variants$: Observable<ProductVariantFragment[]>;\r\n taxCategories$: Observable<TaxCategoryFragment[]>;\r\n customFields: CustomFieldConfig[];\r\n customVariantFields: CustomFieldConfig[];\r\n customOptionGroupFields: CustomFieldConfig[];\r\n customOptionFields: CustomFieldConfig[];\r\n detailForm: FormGroup;\r\n filterInput = new FormControl('');\r\n assetChanges: SelectedAssets = {};\r\n variantAssetChanges: { [variantId: string]: SelectedAssets } = {};\r\n variantFacetValueChanges: { [variantId: string]: string[] } = {};\r\n productChannels$: Observable<ProductDetailFragment['channels']>;\r\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\r\n facets$: Observable<FacetWithValuesFragment[]>;\r\n totalItems$: Observable<number>;\r\n currentPage$ = new BehaviorSubject(1);\r\n itemsPerPage$ = new BehaviorSubject(10);\r\n paginationConfig$: Observable<PaginationConfig>;\r\n selectedVariantIds: string[] = [];\r\n variantDisplayMode: 'card' | 'table' = 'card';\r\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [] };\r\n channelPriceIncludesTax$: Observable<boolean>;\r\n // Used to store all ProductVariants which have been loaded.\r\n // It is needed when saving changes to variants.\r\n private productVariantMap = new Map<string, ProductVariantFragment>();\r\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n\r\n constructor(\r\n route: ActivatedRoute,\r\n router: Router,\r\n serverConfigService: ServerConfigService,\r\n private productDetailService: ProductDetailService,\r\n private formBuilder: FormBuilder,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private location: Location,\r\n private changeDetector: ChangeDetectorRef,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Product');\r\n this.customVariantFields = this.getCustomFieldConfig('ProductVariant');\r\n this.customOptionGroupFields = this.getCustomFieldConfig('ProductOptionGroup');\r\n this.customOptionFields = this.getCustomFieldConfig('ProductOption');\r\n this.detailForm = this.formBuilder.group({\r\n product: this.formBuilder.group({\r\n enabled: true,\r\n name: ['', Validators.required],\r\n autoUpdateVariantNames: true,\r\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9_-]+$/)],\r\n description: '',\r\n facetValueIds: [[]],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n }),\r\n variants: this.formBuilder.array([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.product$ = this.entity$;\r\n this.totalItems$ = this.product$.pipe(map(product => product.variantList.totalItems));\r\n this.paginationConfig$ = combineLatest(this.totalItems$, this.itemsPerPage$, this.currentPage$).pipe(\r\n map(([totalItems, itemsPerPage, currentPage]) => ({\r\n totalItems,\r\n itemsPerPage,\r\n currentPage,\r\n })),\r\n );\r\n const variants$ = this.product$.pipe(map(product => product.variantList.items));\r\n const filterTerm$ = this.filterInput.valueChanges.pipe(\r\n startWith(''),\r\n debounceTime(200),\r\n shareReplay(),\r\n );\r\n const initialVariants$ = this.product$.pipe(map(p => p.variantList.items));\r\n const updatedVariants$ = combineLatest(filterTerm$, this.currentPage$, this.itemsPerPage$).pipe(\r\n skipUntil(initialVariants$),\r\n skip(1),\r\n switchMap(([term, currentPage, itemsPerPage]) => {\r\n return this.dataService.product\r\n .getProductVariants(\r\n {\r\n skip: (currentPage - 1) * itemsPerPage,\r\n take: itemsPerPage,\r\n ...(term\r\n ? { filter: { name: { contains: term }, sku: { contains: term } } }\r\n : {}),\r\n filterOperator: LogicalOperator.OR,\r\n },\r\n this.id,\r\n )\r\n .mapStream(({ productVariants }) => productVariants.items);\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }),\r\n );\r\n this.variants$ = merge(initialVariants$, updatedVariants$).pipe(\r\n tap(variants => {\r\n for (const variant of variants) {\r\n this.productVariantMap.set(variant.id, variant);\r\n }\r\n }),\r\n );\r\n this.taxCategories$ = this.productDetailService.getTaxCategories().pipe(takeUntil(this.destroy$));\r\n this.activeTab$ = this.route.paramMap.pipe(map(qpm => qpm.get('tab') as any));\r\n\r\n combineLatest(updatedVariants$, this.languageCode$)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(([variants, languageCode]) => {\r\n this.buildVariantFormArray(variants, languageCode);\r\n });\r\n\r\n // FacetValues are provided initially by the nested array of the\r\n // Product entity, but once a fetch to get all Facets is made (as when\r\n // opening the FacetValue selector modal), then these additional values\r\n // are concatenated onto the initial array.\r\n this.facets$ = this.productDetailService.getFacets();\r\n const productFacetValues$ = this.product$.pipe(map(product => product.facetValues));\r\n const allFacetValues$ = this.facets$.pipe(map(flattenFacetValues));\r\n const productGroup = this.getProductFormGroup();\r\n\r\n const formFacetValueIdChanges$ = productGroup.valueChanges.pipe(\r\n map(val => val.facetValueIds as string[]),\r\n distinctUntilChanged(),\r\n );\r\n const formChangeFacetValues$ = combineLatest(\r\n formFacetValueIdChanges$,\r\n productFacetValues$,\r\n allFacetValues$,\r\n ).pipe(\r\n map(([ids, productFacetValues, allFacetValues]) => {\r\n const combined = [...productFacetValues, ...allFacetValues];\r\n return ids.map(id => combined.find(fv => fv.id === id)).filter(notNullOrUndefined);\r\n }),\r\n );\r\n\r\n this.facetValues$ = merge(productFacetValues$, formChangeFacetValues$);\r\n this.productChannels$ = this.product$.pipe(map(p => p.channels));\r\n this.channelPriceIncludesTax$ = this.dataService.settings\r\n .getActiveChannel('cache-first')\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel.pricesIncludeTax)\r\n .pipe(shareReplay(1));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n navigateToTab(tabName: TabName) {\r\n this.location.replaceState(\r\n this.router\r\n .createUrlTree(['./', { ...this.route.snapshot.params, tab: tabName }], {\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n })\r\n .toString(),\r\n );\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n setPage(page: number) {\r\n this.currentPage$.next(page);\r\n }\r\n\r\n setItemsPerPage(value: string) {\r\n this.itemsPerPage$.next(+value);\r\n this.currentPage$.next(1);\r\n }\r\n\r\n assignToChannel() {\r\n this.productChannels$\r\n .pipe(\r\n take(1),\r\n switchMap(channels => {\r\n return this.modalService.fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: [this.id],\r\n currentChannelIds: channels.map(c => c.id),\r\n },\r\n });\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n removeFromChannel(channelId: string) {\r\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\r\n .pipe(\r\n switchMap(({ channelCode }) => {\r\n return this.modalService.dialog({\r\n title: _('catalog.remove-product-from-channel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: _('catalog.remove-from-channel'),\r\n translationVars: { channelCode },\r\n returnValue: true,\r\n },\r\n ],\r\n });\r\n }),\r\n switchMap(response =>\r\n response\r\n ? this.dataService.product.removeProductsFromChannel({\r\n channelId,\r\n productIds: [this.id],\r\n })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('catalog.notify-remove-product-from-channel-success'));\r\n },\r\n err => {\r\n this.notificationService.error(_('catalog.notify-remove-product-from-channel-error'));\r\n },\r\n );\r\n }\r\n\r\n assignVariantToChannel(variant: ProductVariantFragment) {\r\n return this.modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: [this.id],\r\n productVariantIds: [variant.id],\r\n currentChannelIds: variant.channels.map(c => c.id),\r\n },\r\n })\r\n .subscribe();\r\n }\r\n\r\n removeVariantFromChannel({\r\n channelId,\r\n variant,\r\n }: {\r\n channelId: string;\r\n variant: ProductVariantFragment;\r\n }) {\r\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\r\n .pipe(\r\n switchMap(({ channelCode }) => {\r\n return this.modalService.dialog({\r\n title: _('catalog.remove-product-variant-from-channel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: _('catalog.remove-from-channel'),\r\n translationVars: { channelCode },\r\n returnValue: true,\r\n },\r\n ],\r\n });\r\n }),\r\n switchMap(response =>\r\n response\r\n ? this.dataService.product.removeVariantsFromChannel({\r\n channelId,\r\n productVariantIds: [variant.id],\r\n })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('catalog.notify-remove-variant-from-channel-success'));\r\n },\r\n err => {\r\n this.notificationService.error(_('catalog.notify-remove-variant-from-channel-error'));\r\n },\r\n );\r\n }\r\n\r\n assetsChanged(): boolean {\r\n return !!Object.values(this.assetChanges).length;\r\n }\r\n\r\n variantAssetsChanged(): boolean {\r\n return !!Object.keys(this.variantAssetChanges).length;\r\n }\r\n\r\n variantAssetChange(event: VariantAssetChange) {\r\n this.variantAssetChanges[event.variantId] = event;\r\n }\r\n\r\n /**\r\n * If creating a new product, automatically generate the slug based on the product name.\r\n */\r\n updateSlug(nameValue: string) {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(take(1))\r\n .subscribe(([entity, languageCode]) => {\r\n const slugControl = this.detailForm.get(['product', 'slug']);\r\n const currentTranslation = findTranslation(entity, languageCode);\r\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\r\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\r\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\r\n }\r\n });\r\n }\r\n\r\n selectProductFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const productGroup = this.getProductFormGroup();\r\n const currentFacetValueIds = productGroup.value.facetValueIds;\r\n productGroup.patchValue({\r\n facetValueIds: unique([...currentFacetValueIds, ...facetValueIds]),\r\n });\r\n productGroup.markAsDirty();\r\n }\r\n });\r\n }\r\n\r\n updateProductOption(input: UpdateProductOptionInput & { autoUpdate: boolean }) {\r\n combineLatest(this.product$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) =>\r\n this.productDetailService.updateProductOption(input, product, languageCode),\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductOption',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductOption',\r\n });\r\n },\r\n );\r\n }\r\n\r\n removeProductFacetValue(facetValueId: string) {\r\n const productGroup = this.getProductFormGroup();\r\n const currentFacetValueIds = productGroup.value.facetValueIds;\r\n productGroup.patchValue({\r\n facetValueIds: currentFacetValueIds.filter(id => id !== facetValueId),\r\n });\r\n productGroup.markAsDirty();\r\n }\r\n\r\n /**\r\n * Opens a dialog to select FacetValues to apply to the select ProductVariants.\r\n */\r\n selectVariantFacetValue(selectedVariantIds: string[]) {\r\n this.displayFacetValueModal()\r\n .pipe(withLatestFrom(this.variants$))\r\n .subscribe(([facetValueIds, variants]) => {\r\n if (facetValueIds) {\r\n for (const variantId of selectedVariantIds) {\r\n const index = variants.findIndex(v => v.id === variantId);\r\n const variant = variants[index];\r\n const existingFacetValueIds = variant ? variant.facetValues.map(fv => fv.id) : [];\r\n const variantFormGroup = (this.detailForm.get('variants') as FormArray).controls.find(\r\n c => c.value.id === variantId,\r\n );\r\n if (variantFormGroup) {\r\n const uniqueFacetValueIds = unique([...existingFacetValueIds, ...facetValueIds]);\r\n variantFormGroup.patchValue({\r\n facetValueIds: uniqueFacetValueIds,\r\n });\r\n variantFormGroup.markAsDirty();\r\n this.variantFacetValueChanges[variantId] = uniqueFacetValueIds;\r\n }\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n variantsToCreateAreValid(): boolean {\r\n return (\r\n 0 < this.createVariantsConfig.variants.length &&\r\n this.createVariantsConfig.variants.every(v => {\r\n return v.sku !== '';\r\n })\r\n );\r\n }\r\n\r\n private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.productDetailService.getFacets().pipe(\r\n mergeMap(facets =>\r\n this.modalService.fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n locals: { facets },\r\n }),\r\n ),\r\n map(facetValues => facetValues && facetValues.map(v => v.id)),\r\n );\r\n }\r\n\r\n create() {\r\n const productGroup = this.getProductFormGroup();\r\n if (!productGroup.dirty) {\r\n return;\r\n }\r\n combineLatest(this.product$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) => {\r\n const newProduct = this.getUpdatedProduct(\r\n product,\r\n productGroup as FormGroup,\r\n languageCode,\r\n ) as CreateProductInput;\r\n return this.productDetailService.createProductWithVariants(\r\n newProduct,\r\n this.createVariantsConfig,\r\n languageCode,\r\n );\r\n }),\r\n )\r\n .subscribe(\r\n ({ createProductVariants, productId }) => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Product',\r\n });\r\n this.assetChanges = {};\r\n this.variantAssetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.router.navigate(['../', productId], { relativeTo: this.route });\r\n },\r\n err => {\r\n // tslint:disable-next-line:no-console\r\n console.error(err);\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.product$, this.languageCode$, this.channelPriceIncludesTax$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode, priceIncludesTax]) => {\r\n const productGroup = this.getProductFormGroup();\r\n let productInput: UpdateProductInput | undefined;\r\n let variantsInput: UpdateProductVariantInput[] | undefined;\r\n\r\n if (productGroup.dirty || this.assetsChanged()) {\r\n productInput = this.getUpdatedProduct(\r\n product,\r\n productGroup as FormGroup,\r\n languageCode,\r\n ) as UpdateProductInput;\r\n }\r\n const variantsArray = this.detailForm.get('variants');\r\n if ((variantsArray && variantsArray.dirty) || this.variantAssetsChanged()) {\r\n variantsInput = this.getUpdatedProductVariants(\r\n product,\r\n variantsArray as FormArray,\r\n languageCode,\r\n priceIncludesTax,\r\n );\r\n }\r\n\r\n return this.productDetailService.updateProduct({\r\n product,\r\n languageCode,\r\n autoUpdate:\r\n this.detailForm.get(['product', 'autoUpdateVariantNames'])?.value ?? false,\r\n productInput,\r\n variantsInput,\r\n });\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n this.updateSlugAfterSave(result);\r\n this.detailForm.markAsPristine();\r\n this.assetChanges = {};\r\n this.variantAssetChanges = {};\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Product',\r\n });\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the product or current language.\r\n */\r\n protected setFormValues(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const currentTranslation = findTranslation(product, languageCode);\r\n this.detailForm.patchValue({\r\n product: {\r\n enabled: product.enabled,\r\n name: currentTranslation ? currentTranslation.name : '',\r\n slug: currentTranslation ? currentTranslation.slug : '',\r\n description: currentTranslation ? currentTranslation.description : '',\r\n facetValueIds: product.facetValues.map(fv => fv.id),\r\n },\r\n });\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['product', 'customFields']),\r\n product,\r\n currentTranslation,\r\n );\r\n }\r\n this.buildVariantFormArray(product.variantList.items, languageCode);\r\n }\r\n\r\n private buildVariantFormArray(variants: ProductVariantFragment[], languageCode: LanguageCode) {\r\n const variantsFormArray = this.detailForm.get('variants') as FormArray;\r\n variants.forEach((variant, i) => {\r\n const variantTranslation = findTranslation(variant, languageCode);\r\n const pendingFacetValueChanges = this.variantFacetValueChanges[variant.id];\r\n const facetValueIds = pendingFacetValueChanges\r\n ? pendingFacetValueChanges\r\n : variant.facetValues.map(fv => fv.id);\r\n const group: VariantFormValue = {\r\n id: variant.id,\r\n enabled: variant.enabled,\r\n sku: variant.sku,\r\n name: variantTranslation ? variantTranslation.name : '',\r\n price: variant.price,\r\n priceWithTax: variant.priceWithTax,\r\n taxCategoryId: variant.taxCategory.id,\r\n stockOnHand: variant.stockOnHand,\r\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\r\n outOfStockThreshold: variant.outOfStockThreshold,\r\n trackInventory: variant.trackInventory,\r\n facetValueIds,\r\n };\r\n\r\n let variantFormGroup = variantsFormArray.controls.find(c => c.value.id === variant.id) as\r\n | FormGroup\r\n | undefined;\r\n if (variantFormGroup) {\r\n if (variantFormGroup.pristine) {\r\n variantFormGroup.patchValue(group);\r\n }\r\n } else {\r\n variantFormGroup = this.formBuilder.group({\r\n ...group,\r\n facetValueIds: this.formBuilder.control(facetValueIds),\r\n });\r\n variantsFormArray.insert(i, variantFormGroup);\r\n }\r\n if (this.customVariantFields.length) {\r\n let customFieldsGroup = variantFormGroup.get(['customFields']) as FormGroup | undefined;\r\n\r\n if (!customFieldsGroup) {\r\n customFieldsGroup = this.formBuilder.group(\r\n this.customVariantFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n );\r\n variantFormGroup.addControl('customFields', customFieldsGroup);\r\n }\r\n this.setCustomFieldFormValues(\r\n this.customVariantFields,\r\n customFieldsGroup,\r\n variant,\r\n variantTranslation,\r\n );\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedProduct(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n productFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductInput | CreateProductInput {\r\n const updatedProduct = createUpdatedTranslatable({\r\n translatable: product,\r\n updatedFields: productFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: product.name || '',\r\n slug: product.slug || '',\r\n description: product.description || '',\r\n },\r\n });\r\n return {\r\n ...updatedProduct,\r\n assetIds: this.assetChanges.assets?.map(a => a.id),\r\n featuredAssetId: this.assetChanges.featuredAsset?.id,\r\n facetValueIds: productFormGroup.value.facetValueIds,\r\n } as UpdateProductInput | CreateProductInput;\r\n }\r\n\r\n /**\r\n * Given an array of product variants and the values from the detailForm, this method creates an new array\r\n * which can be persisted to the API.\r\n */\r\n private getUpdatedProductVariants(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n variantsFormArray: FormArray,\r\n languageCode: LanguageCode,\r\n priceIncludesTax: boolean,\r\n ): UpdateProductVariantInput[] {\r\n const dirtyFormControls = variantsFormArray.controls.filter(c => c.dirty);\r\n const dirtyVariants = dirtyFormControls\r\n .map(c => this.productVariantMap.get(c.value.id))\r\n .filter(notNullOrUndefined);\r\n const dirtyVariantValues = dirtyFormControls.map(c => c.value);\r\n\r\n if (dirtyVariants.length !== dirtyVariantValues.length) {\r\n throw new Error(_(`error.product-variant-form-values-do-not-match`));\r\n }\r\n return dirtyVariants\r\n .map((variant, i) => {\r\n const formValue: VariantFormValue = dirtyVariantValues.find(value => value.id === variant.id);\r\n const result: UpdateProductVariantInput = createUpdatedTranslatable({\r\n translatable: variant,\r\n updatedFields: formValue,\r\n customFieldConfig: this.customVariantFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n });\r\n result.taxCategoryId = formValue.taxCategoryId;\r\n result.facetValueIds = formValue.facetValueIds;\r\n result.price = priceIncludesTax ? formValue.priceWithTax : formValue.price;\r\n const assetChanges = this.variantAssetChanges[variant.id];\r\n if (assetChanges) {\r\n result.featuredAssetId = assetChanges.featuredAsset?.id;\r\n result.assetIds = assetChanges.assets?.map(a => a.id);\r\n }\r\n return result;\r\n })\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n private getProductFormGroup(): FormGroup {\r\n return this.detailForm.get('product') as FormGroup;\r\n }\r\n\r\n /**\r\n * The server may alter the slug value in order to normalize and ensure uniqueness upon saving.\r\n */\r\n private updateSlugAfterSave(results: Array<UpdateProductMutation | UpdateProductVariantsMutation>) {\r\n const firstResult = results[0];\r\n const slugControl = this.detailForm.get(['product', 'slug']);\r\n\r\n function isUpdateMutation(input: any): input is UpdateProductMutation {\r\n return input.hasOwnProperty('updateProduct');\r\n }\r\n\r\n if (slugControl && isUpdateMutation(firstResult)) {\r\n slugControl.setValue(firstResult.updateProduct.slug, { emitEvent: false });\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-flex-row\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <clr-toggle-wrapper *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\">\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n [formControl]=\"detailForm.get(['product', 'enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </div>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine || !variantsToCreateAreValid()\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"\r\n (detailForm.invalid || detailForm.pristine) && !assetsChanged() && !variantAssetsChanged()\r\n \"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"product$ | async as product\">\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <clr-tabs>\r\n <clr-tab>\r\n <button clrTabLink (click)=\"navigateToTab('details')\">\r\n {{ 'catalog.product-details' | translate }}\r\n </button>\r\n <clr-tab-content *clrIfActive=\"(activeTab$ | async) === 'details'\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <section class=\"form-block\" formGroupName=\"product\">\r\n <ng-container *ngIf=\"!(isNew$ | async)\">\r\n <ng-container *vdrIfMultichannel>\r\n <vdr-form-item\r\n [label]=\"'common.channels' | translate\"\r\n *vdrIfDefaultChannelActive\r\n >\r\n <div class=\"flex channel-assignment\">\r\n <ng-container *ngFor=\"let channel of productChannels$ | async\">\r\n <vdr-chip\r\n *ngIf=\"!isDefaultChannel(channel.code)\"\r\n icon=\"times-circle\"\r\n (iconClick)=\"removeFromChannel(channel.id)\"\r\n >\r\n <vdr-channel-badge\r\n [channelCode]=\"channel.code\"\r\n ></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n <button class=\"btn btn-sm\" (click)=\"assignToChannel()\">\r\n <clr-icon shape=\"layers\"></clr-icon>\r\n {{ 'catalog.assign-to-channel' | translate }}\r\n </button>\r\n </div>\r\n </vdr-form-item>\r\n </ng-container>\r\n </ng-container>\r\n <vdr-form-field [label]=\"'catalog.product-name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <div\r\n class=\"auto-rename-wrapper\"\r\n [class.visible]=\"\r\n (isNew$ | async) === false && detailForm.get(['product', 'name'])?.dirty\r\n \"\r\n >\r\n <clr-checkbox-wrapper>\r\n <input\r\n clrCheckbox\r\n type=\"checkbox\"\r\n id=\"auto-update\"\r\n formControlName=\"autoUpdateVariantNames\"\r\n />\r\n <label>{{\r\n 'catalog.auto-update-product-variant-name' | translate\r\n }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <vdr-form-field\r\n [label]=\"'catalog.slug' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <input\r\n id=\"slug\"\r\n type=\"text\"\r\n formControlName=\"slug\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n [label]=\"'common.description' | translate\"\r\n ></vdr-rich-text-editor>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Product\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['product', 'customFields'])\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"product-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </section>\r\n </div>\r\n <div class=\"clr-col-md-auto\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || product.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || product.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n <div class=\"facets\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of facetValues$ | async\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"['UpdateCatalog', 'UpdateProduct'] | hasPermission\"\r\n (remove)=\"removeProductFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n (click)=\"selectProductFacetValue()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isNew$ | async\">\r\n <h4>{{ 'catalog.product-variants' | translate }}</h4>\r\n <vdr-generate-product-variants\r\n (variantsChange)=\"createVariantsConfig = $event\"\r\n ></vdr-generate-product-variants>\r\n </div>\r\n </clr-tab-content>\r\n </clr-tab>\r\n <clr-tab *ngIf=\"!(isNew$ | async)\">\r\n <button clrTabLink (click)=\"navigateToTab('variants')\">\r\n {{ 'catalog.product-variants' | translate }}\r\n </button>\r\n <clr-tab-content *clrIfActive=\"(activeTab$ | async) === 'variants'\">\r\n <section class=\"form-block\">\r\n <div class=\"view-mode\">\r\n <div class=\"btn-group\">\r\n <button\r\n class=\"btn btn-secondary-outline\"\r\n (click)=\"variantDisplayMode = 'card'\"\r\n [class.btn-primary]=\"variantDisplayMode === 'card'\"\r\n >\r\n <clr-icon shape=\"list\"></clr-icon>\r\n <span class=\"full-label\">{{ 'catalog.display-variant-cards' | translate }}</span>\r\n </button>\r\n <button\r\n class=\"btn\"\r\n (click)=\"variantDisplayMode = 'table'\"\r\n [class.btn-primary]=\"variantDisplayMode === 'table'\"\r\n >\r\n <clr-icon shape=\"table\"></clr-icon>\r\n <span class=\"full-label\">{{ 'catalog.display-variant-table' | translate }}</span>\r\n </button>\r\n </div>\r\n <div class=\"variant-filter\">\r\n <input\r\n [formControl]=\"filterInput\"\r\n [placeholder]=\"'catalog.filter-by-name-or-sku' | translate\"\r\n />\r\n <button class=\"icon-button\" (click)=\"filterInput.setValue('')\">\r\n <clr-icon shape=\"times\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <a\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n [routerLink]=\"['./', 'manage-variants']\"\r\n class=\"btn btn-secondary edit-variants-btn mb0 mr0\"\r\n >\r\n <clr-icon shape=\"add-text\"></clr-icon>\r\n {{ 'catalog.manage-variants' | translate }}\r\n </a>\r\n </div>\r\n\r\n <div class=\"pagination-row mt4\" *ngIf=\"10 < (paginationConfig$ | async)?.totalItems\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [id]=\"(paginationConfig$ | async)?.id\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (pageChange)=\"setPage($event)\"\r\n ></vdr-pagination-controls>\r\n </div>\r\n\r\n <vdr-product-variants-table\r\n *ngIf=\"variantDisplayMode === 'table'\"\r\n [variants]=\"variants$ | async\"\r\n [paginationConfig]=\"paginationConfig$ | async\"\r\n [optionGroups]=\"product.optionGroups\"\r\n [channelPriceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [productVariantsFormArray]=\"detailForm.get('variants')\"\r\n [pendingAssetChanges]=\"variantAssetChanges\"\r\n ></vdr-product-variants-table>\r\n <vdr-product-variants-list\r\n *ngIf=\"variantDisplayMode === 'card'\"\r\n [variants]=\"variants$ | async\"\r\n [paginationConfig]=\"paginationConfig$ | async\"\r\n [channelPriceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [facets]=\"facets$ | async\"\r\n [optionGroups]=\"product.optionGroups\"\r\n [productVariantsFormArray]=\"detailForm.get('variants')\"\r\n [taxCategories]=\"taxCategories$ | async\"\r\n [customFields]=\"customVariantFields\"\r\n [customOptionFields]=\"customOptionFields\"\r\n [activeLanguage]=\"languageCode$ | async\"\r\n [pendingAssetChanges]=\"variantAssetChanges\"\r\n (assignToChannel)=\"assignVariantToChannel($event)\"\r\n (removeFromChannel)=\"removeVariantFromChannel($event)\"\r\n (assetChange)=\"variantAssetChange($event)\"\r\n (updateProductOption)=\"updateProductOption($event)\"\r\n (selectionChange)=\"selectedVariantIds = $event\"\r\n (selectFacetValueClick)=\"selectVariantFacetValue($event)\"\r\n ></vdr-product-variants-list>\r\n </section>\r\n <div class=\"pagination-row mt4\" *ngIf=\"10 < (paginationConfig$ | async)?.totalItems\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [id]=\"(paginationConfig$ | async)?.id\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (pageChange)=\"setPage($event)\"\r\n ></vdr-pagination-controls>\r\n </div>\r\n </clr-tab-content>\r\n </clr-tab>\r\n </clr-tabs>\r\n</form>\r\n","import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n ItemOf,\r\n JobQueueService,\r\n JobState,\r\n LanguageCode,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n ProductSearchInputComponent,\r\n SearchInput,\r\n SearchProductsQuery,\r\n SearchProductsQueryVariables,\r\n SelectionManager,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { delay, map, switchMap, take, takeUntil, tap, withLatestFrom } from 'rxjs/operators';\r\n\r\nexport type SearchItem = ItemOf<SearchProductsQuery, 'search'>;\r\n\r\n@Component({\r\n selector: 'vdr-products-list',\r\n templateUrl: './product-list.component.html',\r\n styleUrls: ['./product-list.component.scss'],\r\n})\r\nexport class ProductListComponent\r\n extends BaseListComponent<\r\n SearchProductsQuery,\r\n SearchItem,\r\n SearchProductsQueryVariables\r\n >\r\n implements OnInit, AfterViewInit\r\n{\r\n searchTerm = '';\r\n facetValueIds: string[] = [];\r\n groupByProduct = true;\r\n selectedFacetValueIds$: Observable<string[]>;\r\n facetValues$: Observable<SearchProductsQuery['search']['facetValues']>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n pendingSearchIndexUpdates = 0;\r\n selectionManager: SelectionManager<SearchItem>;\r\n\r\n @ViewChild('productSearchInputComponent', { static: true })\r\n private productSearchInput: ProductSearchInputComponent;\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private jobQueueService: JobQueueService,\r\n private serverConfigService: ServerConfigService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n this.route.queryParamMap\r\n .pipe(\r\n map(qpm => qpm.get('q')),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(term => {\r\n this.searchTerm = term || '';\r\n if (this.productSearchInput) {\r\n this.productSearchInput.setSearchTerm(term);\r\n }\r\n });\r\n this.selectedFacetValueIds$ = this.route.queryParamMap.pipe(map(qpm => qpm.getAll('fvids')));\r\n\r\n this.selectedFacetValueIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\r\n this.facetValueIds = ids;\r\n if (this.productSearchInput) {\r\n this.productSearchInput.setFacetValues(ids);\r\n }\r\n });\r\n super.setQueryFn(\r\n (...args: any[]) =>\r\n this.dataService.product.searchProducts(this.searchTerm, ...args).refetchOnChannelChange(),\r\n data => data.search,\r\n // tslint:disable-next-line:no-shadowed-variable\r\n (skip, take) => ({\r\n input: {\r\n skip,\r\n take,\r\n term: this.searchTerm,\r\n facetValueIds: this.facetValueIds,\r\n facetValueOperator: LogicalOperator.AND,\r\n groupByProduct: this.groupByProduct,\r\n } as SearchInput,\r\n }),\r\n );\r\n this.selectionManager = new SelectionManager({\r\n multiSelect: true,\r\n itemsAreEqual: (a, b) =>\r\n this.groupByProduct ? a.productId === b.productId : a.productVariantId === b.productVariantId,\r\n additiveMode: true,\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n\r\n this.facetValues$ = this.result$.pipe(map(data => data.search.facetValues));\r\n\r\n this.facetValues$\r\n .pipe(take(1), delay(100), withLatestFrom(this.selectedFacetValueIds$))\r\n .subscribe(([__, ids]) => {\r\n this.productSearchInput.setFacetValues(ids);\r\n });\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n\r\n this.dataService.product\r\n .getPendingSearchIndexUpdates()\r\n .mapSingle(({ pendingSearchIndexUpdates }) => pendingSearchIndexUpdates)\r\n .subscribe(value => (this.pendingSearchIndexUpdates = value));\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.productSearchInput && this.searchTerm) {\r\n setTimeout(() => this.productSearchInput.setSearchTerm(this.searchTerm));\r\n }\r\n }\r\n\r\n setSearchTerm(term: string) {\r\n this.searchTerm = term;\r\n this.setQueryParam({ q: term || null, page: 1 });\r\n this.refresh();\r\n }\r\n\r\n setFacetValueIds(ids: string[]) {\r\n this.facetValueIds = ids;\r\n this.setQueryParam({ fvids: ids, page: 1 });\r\n this.refresh();\r\n }\r\n\r\n rebuildSearchIndex() {\r\n this.dataService.product.reindex().subscribe(({ reindex }) => {\r\n this.notificationService.info(_('catalog.reindexing'));\r\n this.jobQueueService.addJob(reindex.id, job => {\r\n if (job.state === JobState.COMPLETED) {\r\n const time = new Intl.NumberFormat().format(job.duration || 0);\r\n this.notificationService.success(_('catalog.reindex-successful'), {\r\n count: job.result.indexedItemCount,\r\n time,\r\n });\r\n this.refresh();\r\n } else {\r\n this.notificationService.error(_('catalog.reindex-error'));\r\n }\r\n });\r\n });\r\n }\r\n\r\n runPendingSearchIndexUpdates() {\r\n this.dataService.product.runPendingSearchIndexUpdates().subscribe(value => {\r\n this.notificationService.info(_('catalog.running-search-index-updates'), {\r\n count: this.pendingSearchIndexUpdates,\r\n });\r\n this.pendingSearchIndexUpdates = 0;\r\n });\r\n }\r\n\r\n deleteProduct(productId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response => (response ? this.dataService.product.deleteProduct(productId) : EMPTY)),\r\n // Short delay to allow the product to be removed from the search index before\r\n // refreshing.\r\n delay(500),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Product',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <div class=\"search-form\">\r\n <vdr-product-search-input\r\n #productSearchInputComponent\r\n [facetValueResults]=\"facetValues$ | async\"\r\n (searchTermChange)=\"setSearchTerm($event)\"\r\n (facetValueChange)=\"setFacetValueIds($event)\"\r\n ></vdr-product-search-input>\r\n <vdr-dropdown class=\"search-settings-menu mr3\">\r\n <button\r\n type=\"button\"\r\n class=\"icon-button search-index-button\"\r\n [title]=\"\r\n (pendingSearchIndexUpdates\r\n ? 'catalog.pending-search-index-updates'\r\n : 'catalog.search-index-controls'\r\n ) | translate\r\n \"\r\n vdrDropdownTrigger\r\n >\r\n <clr-icon shape=\"cog\"></clr-icon>\r\n <vdr-status-badge *ngIf=\"pendingSearchIndexUpdates\" type=\"warning\"></vdr-status-badge>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <h4 class=\"dropdown-header\">{{ 'catalog.search-index-controls' | translate }}</h4>\r\n <ng-container *ngIf=\"pendingSearchIndexUpdates\">\r\n <button\r\n type=\"button\"\r\n class=\"run-updates-button\"\r\n vdrDropdownItem\r\n (click)=\"runPendingSearchIndexUpdates()\"\r\n [disabled]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n >\r\n <vdr-status-badge type=\"warning\"></vdr-status-badge>\r\n {{\r\n 'catalog.run-pending-search-index-updates'\r\n | translate: { count: pendingSearchIndexUpdates }\r\n }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n </ng-container>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"rebuildSearchIndex()\"\r\n [disabled]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n >\r\n {{ 'catalog.rebuild-search-index' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n <div class=\"flex wrap\">\r\n <clr-toggle-wrapper class=\"mt2\">\r\n <input type=\"checkbox\" clrToggle [(ngModel)]=\"groupByProduct\" (ngModelChange)=\"refresh()\" />\r\n <label>\r\n {{ 'catalog.group-by-product' | translate }}\r\n </label>\r\n </clr-toggle-wrapper>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateProduct']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-product' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n [selectionManager]=\"selectionManager\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"product-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt-column> </vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-result=\"item\">\r\n <td class=\"left align-middle image-col\" [class.disabled]=\"!result.enabled\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"\r\n groupByProduct\r\n ? result.productAsset\r\n : result.productVariantAsset || result.productAsset as asset;\r\n else imagePlaceholder\r\n \"\r\n [src]=\"asset | assetPreview: 'tiny'\"\r\n />\r\n <ng-template #imagePlaceholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!result.enabled\">\r\n <div>{{ groupByProduct ? result.productName : result.productVariantName }}</div>\r\n <div *ngIf=\"!groupByProduct\" class=\"sku\">{{ result.sku }}</div>\r\n </td>\r\n <td class=\"align-middle\" [class.disabled]=\"!result.enabled\">\r\n <vdr-chip *ngIf=\"!result.enabled\">{{ 'common.disabled' | translate }}</vdr-chip>\r\n </td>\r\n <td class=\"right align-middle\" [class.disabled]=\"!result.enabled\">\r\n <vdr-table-row-action\r\n class=\"edit-button\"\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', result.productId]\"\r\n ></vdr-table-row-action>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteProduct(result.productId)\"\r\n [disabled]=\"!(['DeleteCatalog', 'DeleteProduct'] | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n findTranslation,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ProductOptionFragment,\r\n ProductOptionGroup,\r\n ProductOptionGroupFragment,\r\n ServerConfigService,\r\n UpdateProductOptionGroupInput,\r\n UpdateProductOptionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, take } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\n\r\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\r\n\r\n@Component({\r\n selector: 'vdr-product-options-editor',\r\n templateUrl: './product-options-editor.component.html',\r\n styleUrls: ['./product-options-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\r\n detailForm: FormGroup;\r\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\r\n languageCode$: Observable<LanguageCode>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n optionGroupCustomFields: CustomFieldConfig[];\r\n optionCustomFields: CustomFieldConfig[];\r\n autoUpdateVariantNames = true;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n\r\n constructor(\r\n protected route: ActivatedRoute,\r\n protected router: Router,\r\n protected serverConfigService: ServerConfigService,\r\n protected dataService: DataService,\r\n private productDetailService: ProductDetailService,\r\n private formBuilder: FormBuilder,\r\n private changeDetector: ChangeDetectorRef,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\r\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\r\n }\r\n\r\n ngOnInit(): void {\r\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\r\n map((product: ProductWithOptions) => product.optionGroups),\r\n );\r\n this.detailForm = new FormGroup({\r\n optionGroups: new FormArray([]),\r\n });\r\n super.init();\r\n }\r\n\r\n getOptionGroups(): FormGroup[] {\r\n const optionGroups = this.detailForm.get('optionGroups');\r\n return (optionGroups as FormArray).controls as FormGroup[];\r\n }\r\n\r\n getOptions(optionGroup: FormGroup): FormGroup[] {\r\n const options = optionGroup.get('options');\r\n return (options as FormArray).controls as FormGroup[];\r\n }\r\n\r\n save() {\r\n if (this.detailForm.invalid || this.detailForm.pristine) {\r\n return;\r\n }\r\n // tslint:disable-next-line:no-non-null-assertion\r\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\r\n combineLatest(this.entity$, this.languageCode$, $product)\r\n .pipe(\r\n take(1),\r\n mergeMap(([{ optionGroups }, languageCode, product]) => {\r\n const updateOperations: Array<Observable<any>> = [];\r\n for (const optionGroupForm of this.getOptionGroups()) {\r\n if (optionGroupForm.get('name')?.dirty || optionGroupForm.get('code')?.dirty) {\r\n const optionGroupEntity = optionGroups.find(\r\n og => og.id === optionGroupForm.value.id,\r\n );\r\n if (optionGroupEntity) {\r\n const input = this.getUpdatedOptionGroup(\r\n optionGroupEntity,\r\n optionGroupForm,\r\n languageCode,\r\n );\r\n updateOperations.push(\r\n this.dataService.product.updateProductOptionGroup(input),\r\n );\r\n }\r\n }\r\n\r\n for (const optionForm of this.getOptions(optionGroupForm)) {\r\n if (optionForm.get('name')?.dirty || optionForm.get('code')?.dirty) {\r\n const optionGroup = optionGroups\r\n .find(og => og.id === optionGroupForm.value.id)\r\n ?.options.find(o => o.id === optionForm.value.id);\r\n if (optionGroup) {\r\n const input = this.getUpdatedOption(\r\n optionGroup,\r\n optionForm,\r\n languageCode,\r\n );\r\n updateOperations.push(\r\n this.productDetailService.updateProductOption(\r\n { ...input, autoUpdate: this.autoUpdateVariantNames },\r\n product,\r\n languageCode,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return forkJoin(updateOperations);\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private getUpdatedOptionGroup(\r\n optionGroup: ProductOptionGroupFragment,\r\n optionGroupFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductOptionGroupInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: optionGroup,\r\n updatedFields: optionGroupFormGroup.value,\r\n customFieldConfig: this.optionGroupCustomFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: optionGroup.name || '',\r\n },\r\n });\r\n return input;\r\n }\r\n\r\n private getUpdatedOption(\r\n option: ProductOptionFragment,\r\n optionFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductOptionInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: option,\r\n updatedFields: optionFormGroup.value,\r\n customFieldConfig: this.optionGroupCustomFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: option.name || '',\r\n },\r\n });\r\n return input;\r\n }\r\n\r\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\r\n const groupsFormArray = new FormArray([]);\r\n for (const optionGroup of entity.optionGroups) {\r\n const groupTranslation = findTranslation(optionGroup, languageCode);\r\n const group = {\r\n id: optionGroup.id,\r\n createdAt: optionGroup.createdAt,\r\n updatedAt: optionGroup.updatedAt,\r\n code: optionGroup.code,\r\n name: groupTranslation ? groupTranslation.name : '',\r\n };\r\n const optionsFormArray = new FormArray([]);\r\n\r\n for (const option of optionGroup.options) {\r\n const optionTranslation = findTranslation(option, languageCode);\r\n const optionControl = this.formBuilder.group({\r\n id: option.id,\r\n createdAt: option.createdAt,\r\n updatedAt: option.updatedAt,\r\n code: option.code,\r\n name: optionTranslation ? optionTranslation.name : '',\r\n });\r\n optionsFormArray.push(optionControl);\r\n }\r\n\r\n const groupControl = this.formBuilder.group(group);\r\n groupControl.addControl('options', optionsFormArray);\r\n groupsFormArray.push(groupControl);\r\n }\r\n this.detailForm.setControl('optionGroups', groupsFormArray);\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <div class=\"flex center\">\r\n <div class=\"mr2\">\r\n <clr-checkbox-wrapper>\r\n <input\r\n clrCheckbox\r\n type=\"checkbox\"\r\n id=\"auto-update\"\r\n [(ngModel)]=\"autoUpdateVariantNames\"\r\n />\r\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.pristine || detailForm.invalid\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </div>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\r\n <div formGroupName=\"optionGroups\" class=\"clr-row\">\r\n <div class=\"clr-col-12 clr-col-xl-6\" *ngFor=\"let optionGroup of getOptionGroups(); index as i\">\r\n <section class=\"card\" [formArrayName]=\"i\">\r\n <div class=\"card-header option-group-header\">\r\n <vdr-entity-info [entity]=\"optionGroup.value\"></vdr-entity-info>\r\n <div class=\"ml2\">{{ optionGroup.value.code }}</div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n [id]=\"'name-' + i\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input\r\n [id]=\"'code-' + i\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n <section class=\"card-block\">\r\n <table class=\"facet-values-list table mt2 mb4\" formGroupName=\"options\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'common.code' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n class=\"facet-value\"\r\n *ngFor=\"let option of getOptions(optionGroup); let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <td class=\"align-middle\">\r\n <vdr-entity-info [entity]=\"option.value\"></vdr-entity-info>\r\n </td>\r\n <td class=\"align-middle\">\r\n <input\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\"><input type=\"text\" formControlName=\"code\" /></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </section>\r\n </section>\r\n </div>\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Dialog, GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-confirm-variant-deletion-dialog',\r\n templateUrl: './confirm-variant-deletion-dialog.component.html',\r\n styleUrls: ['./confirm-variant-deletion-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfirmVariantDeletionDialogComponent implements Dialog<boolean> {\r\n resolveWith: (result?: boolean) => void;\r\n variants: NonNullable<GetProductVariantOptionsQuery['product']>['variants'] = [];\r\n\r\n confirm() {\r\n this.resolveWith(true);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.confirm-deletion-of-unused-variants-title' | translate }}\r\n</ng-template>\r\n{{ 'catalog.confirm-deletion-of-unused-variants-body' | translate }}\r\n<ul>\r\n <li *ngFor=\"let variant of variants\">{{ variant.name }} ({{ variant.sku }})</li>\r\n</ul>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateProductOptionGroupMutation,\r\n CreateProductOptionInput,\r\n CurrencyCode,\r\n DataService,\r\n DeactivateAware,\r\n DeletionResult,\r\n getDefaultUiLanguage,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n ProductOptionGroupWithOptionsFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { generateAllCombinations, notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, forkJoin, Observable, of } from 'rxjs';\r\nimport { defaultIfEmpty, filter, map, mergeMap, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ConfirmVariantDeletionDialogComponent } from '../confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\r\n\r\nexport class GeneratedVariant {\r\n isDefault: boolean;\r\n options: Array<{ name: string; id?: string }>;\r\n productVariantId?: string;\r\n enabled: boolean;\r\n existing: boolean;\r\n sku: string;\r\n price: number;\r\n stock: number;\r\n\r\n constructor(config: Partial<GeneratedVariant>) {\r\n for (const key of Object.keys(config)) {\r\n this[key] = config[key];\r\n }\r\n }\r\n}\r\n\r\ninterface OptionGroupUiModel {\r\n id?: string;\r\n isNew: boolean;\r\n name: string;\r\n locked: boolean;\r\n values: Array<{\r\n id?: string;\r\n name: string;\r\n locked: boolean;\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-editor',\r\n templateUrl: './product-variants-editor.component.html',\r\n styleUrls: ['./product-variants-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class ProductVariantsEditorComponent implements OnInit, DeactivateAware {\r\n formValueChanged = false;\r\n optionsChanged = false;\r\n generatedVariants: GeneratedVariant[] = [];\r\n optionGroups: OptionGroupUiModel[];\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n currencyCode: CurrencyCode;\r\n private languageCode: LanguageCode;\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private dataService: DataService,\r\n private productDetailService: ProductDetailService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.initOptionsAndVariants();\r\n this.languageCode =\r\n (this.route.snapshot.paramMap.get('lang') as LanguageCode) || getDefaultUiLanguage();\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.currencyCode;\r\n });\r\n }\r\n\r\n onFormChanged(variantInfo: GeneratedVariant) {\r\n this.formValueChanged = true;\r\n variantInfo.enabled = true;\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return !this.formValueChanged;\r\n }\r\n\r\n getVariantsToAdd() {\r\n return this.generatedVariants.filter(v => !v.existing && v.enabled);\r\n }\r\n\r\n getVariantName(variant: GeneratedVariant) {\r\n return variant.options.length === 0\r\n ? _('catalog.default-variant')\r\n : variant.options.map(o => o.name).join(' ');\r\n }\r\n\r\n addOptionGroup() {\r\n this.optionGroups.push({\r\n isNew: true,\r\n locked: false,\r\n name: '',\r\n values: [],\r\n });\r\n this.optionsChanged = true;\r\n }\r\n\r\n removeOptionGroup(optionGroup: OptionGroupUiModel) {\r\n const id = optionGroup.id;\r\n if (optionGroup.isNew) {\r\n this.optionGroups = this.optionGroups.filter(og => og !== optionGroup);\r\n this.generateVariants();\r\n this.optionsChanged = true;\r\n } else if (id) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-option-group'),\r\n translationVars: { name: optionGroup.name },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(val => {\r\n if (val) {\r\n return this.dataService.product.removeOptionGroupFromProduct({\r\n optionGroupId: id,\r\n productId: this.product.id,\r\n });\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(({ removeOptionGroupFromProduct }) => {\r\n if (removeOptionGroupFromProduct.__typename === 'Product') {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n this.initOptionsAndVariants();\r\n this.optionsChanged = true;\r\n } else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {\r\n this.notificationService.error(removeOptionGroupFromProduct.message ?? '');\r\n }\r\n });\r\n }\r\n }\r\n\r\n addOption(index: number, optionName: string) {\r\n const group = this.optionGroups[index];\r\n if (group) {\r\n group.values.push({ name: optionName, locked: false });\r\n this.generateVariants();\r\n this.optionsChanged = true;\r\n }\r\n }\r\n\r\n removeOption(index: number, { id, name }: { id?: string; name: string }) {\r\n const optionGroup = this.optionGroups[index];\r\n if (optionGroup) {\r\n if (!id) {\r\n optionGroup.values = optionGroup.values.filter(v => v.name !== name);\r\n this.generateVariants();\r\n } else {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-option'),\r\n translationVars: { name },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(val => {\r\n if (val) {\r\n return this.dataService.product.deleteProductOption(id);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(({ deleteProductOption }) => {\r\n if (deleteProductOption.result === DeletionResult.DELETED) {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductOption',\r\n });\r\n optionGroup.values = optionGroup.values.filter(v => v.id !== id);\r\n this.generateVariants();\r\n this.optionsChanged = true;\r\n } else {\r\n this.notificationService.error(deleteProductOption.message ?? '');\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n generateVariants() {\r\n const groups = this.optionGroups.map(g => g.values);\r\n const previousVariants = this.generatedVariants;\r\n const generatedVariantFactory = (\r\n isDefault: boolean,\r\n options: GeneratedVariant['options'],\r\n existingVariant?: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n prototypeVariant?: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n ): GeneratedVariant => {\r\n const prototype = this.getVariantPrototype(options, previousVariants);\r\n return new GeneratedVariant({\r\n enabled: true,\r\n existing: !!existingVariant,\r\n productVariantId: existingVariant?.id,\r\n isDefault,\r\n options,\r\n price: existingVariant?.price ?? prototypeVariant?.price ?? prototype.price,\r\n sku: existingVariant?.sku ?? prototypeVariant?.sku ?? prototype.sku,\r\n stock: existingVariant?.stockOnHand ?? prototypeVariant?.stockOnHand ?? prototype.stock,\r\n });\r\n };\r\n this.generatedVariants = groups.length\r\n ? generateAllCombinations(groups).map(options => {\r\n const existingVariant = this.product.variants.find(v =>\r\n this.optionsAreEqual(v.options, options),\r\n );\r\n const prototypeVariant = this.product.variants.find(v =>\r\n this.optionsAreSubset(v.options, options),\r\n );\r\n return generatedVariantFactory(false, options, existingVariant, prototypeVariant);\r\n })\r\n : [generatedVariantFactory(true, [], this.product.variants[0])];\r\n }\r\n\r\n /**\r\n * Returns one of the existing variants to base the newly-generated variant's\r\n * details off.\r\n */\r\n private getVariantPrototype(\r\n options: GeneratedVariant['options'],\r\n previousVariants: GeneratedVariant[],\r\n ): Pick<GeneratedVariant, 'sku' | 'price' | 'stock'> {\r\n const variantsWithSimilarOptions = previousVariants.filter(v =>\r\n options.map(o => o.name).filter(name => v.options.map(o => o.name).includes(name)),\r\n );\r\n if (variantsWithSimilarOptions.length) {\r\n return pick(previousVariants[0], ['sku', 'price', 'stock']);\r\n }\r\n return {\r\n sku: '',\r\n price: 0,\r\n stock: 0,\r\n };\r\n }\r\n\r\n deleteVariant(id: string, options: GeneratedVariant['options']) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-variant'),\r\n translationVars: { name: options.map(o => o.name).join(' ') },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response ? this.productDetailService.deleteProductVariant(id, this.product.id) : EMPTY,\r\n ),\r\n switchMap(() => this.reFetchProduct(null)),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.initOptionsAndVariants();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'ProductVariant',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n this.optionGroups = this.optionGroups.filter(g => g.values.length);\r\n const newOptionGroups = this.optionGroups\r\n .filter(og => og.isNew)\r\n .map(og => ({\r\n name: og.name,\r\n values: [],\r\n }));\r\n\r\n this.checkUniqueSkus()\r\n .pipe(\r\n mergeMap(() => this.confirmDeletionOfObsoleteVariants()),\r\n mergeMap(() =>\r\n this.productDetailService.createProductOptionGroups(newOptionGroups, this.languageCode),\r\n ),\r\n mergeMap(createdOptionGroups => this.addOptionGroupsToProduct(createdOptionGroups)),\r\n mergeMap(createdOptionGroups => this.addNewOptionsToGroups(createdOptionGroups)),\r\n mergeMap(groupsIds => this.fetchOptionGroups(groupsIds)),\r\n mergeMap(groups => this.createNewProductVariants(groups)),\r\n mergeMap(res => this.deleteObsoleteVariants(res.createProductVariants)),\r\n mergeMap(variants => this.reFetchProduct(variants)),\r\n )\r\n .subscribe({\r\n next: variants => {\r\n this.formValueChanged = false;\r\n this.notificationService.success(_('catalog.created-new-variants-success'), {\r\n count: variants.length,\r\n });\r\n this.initOptionsAndVariants();\r\n this.optionsChanged = false;\r\n },\r\n });\r\n }\r\n\r\n private checkUniqueSkus() {\r\n const withDuplicateSkus = this.generatedVariants.filter((variant, index) => {\r\n return (\r\n variant.enabled &&\r\n this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant)\r\n );\r\n });\r\n if (withDuplicateSkus.length) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.duplicate-sku-warning'),\r\n body: unique(withDuplicateSkus.map(v => `${v.sku}`)).join(', '),\r\n buttons: [{ label: _('common.close'), returnValue: false, type: 'primary' }],\r\n })\r\n .pipe(mergeMap(res => EMPTY));\r\n } else {\r\n return of(true);\r\n }\r\n }\r\n\r\n private confirmDeletionOfObsoleteVariants(): Observable<boolean> {\r\n const obsoleteVariants = this.getObsoleteVariants();\r\n if (obsoleteVariants.length) {\r\n return this.modalService\r\n .fromComponent(ConfirmVariantDeletionDialogComponent, {\r\n locals: {\r\n variants: obsoleteVariants,\r\n },\r\n })\r\n .pipe(\r\n mergeMap(res => {\r\n return res === true ? of(true) : EMPTY;\r\n }),\r\n );\r\n } else {\r\n return of(true);\r\n }\r\n }\r\n\r\n private getObsoleteVariants() {\r\n return this.product.variants.filter(\r\n variant => !this.generatedVariants.find(gv => gv.productVariantId === variant.id),\r\n );\r\n }\r\n\r\n private hasOnlyDefaultVariant(product: NonNullable<GetProductVariantOptionsQuery['product']>): boolean {\r\n return product.variants.length === 1 && product.optionGroups.length === 0;\r\n }\r\n\r\n private addOptionGroupsToProduct(\r\n createdOptionGroups: Array<CreateProductOptionGroupMutation['createProductOptionGroup']>,\r\n ): Observable<Array<CreateProductOptionGroupMutation['createProductOptionGroup']>> {\r\n if (createdOptionGroups.length) {\r\n return forkJoin(\r\n createdOptionGroups.map(optionGroup => {\r\n return this.dataService.product.addOptionGroupToProduct({\r\n productId: this.product.id,\r\n optionGroupId: optionGroup.id,\r\n });\r\n }),\r\n ).pipe(map(() => createdOptionGroups));\r\n } else {\r\n return of([]);\r\n }\r\n }\r\n\r\n private addNewOptionsToGroups(\r\n createdOptionGroups: Array<CreateProductOptionGroupMutation['createProductOptionGroup']>,\r\n ): Observable<string[]> {\r\n const newOptions: CreateProductOptionInput[] = this.optionGroups\r\n .map(og => {\r\n const createdGroup = createdOptionGroups.find(cog => cog.name === og.name);\r\n const productOptionGroupId = createdGroup ? createdGroup.id : og.id;\r\n if (!productOptionGroupId) {\r\n throw new Error('Could not get a productOptionGroupId');\r\n }\r\n return og.values\r\n .filter(v => !v.locked)\r\n .map(v => ({\r\n productOptionGroupId,\r\n code: normalizeString(v.name, '-'),\r\n translations: [{ name: v.name, languageCode: this.languageCode }],\r\n }));\r\n })\r\n .reduce((flat, options) => [...flat, ...options], []);\r\n\r\n const allGroupIds = [\r\n ...createdOptionGroups.map(g => g.id),\r\n ...this.optionGroups.map(g => g.id).filter(notNullOrUndefined),\r\n ];\r\n\r\n if (newOptions.length) {\r\n return forkJoin(newOptions.map(input => this.dataService.product.addOptionToGroup(input))).pipe(\r\n map(() => allGroupIds),\r\n );\r\n } else {\r\n return of(allGroupIds);\r\n }\r\n }\r\n\r\n private fetchOptionGroups(groupsIds: string[]): Observable<ProductOptionGroupWithOptionsFragment[]> {\r\n return forkJoin(\r\n groupsIds.map(id =>\r\n this.dataService.product\r\n .getProductOptionGroup(id)\r\n .mapSingle(data => data.productOptionGroup)\r\n .pipe(filter(notNullOrUndefined)),\r\n ),\r\n ).pipe(defaultIfEmpty([] as ProductOptionGroupWithOptionsFragment[]));\r\n }\r\n\r\n private createNewProductVariants(groups: ProductOptionGroupWithOptionsFragment[]) {\r\n const options = groups\r\n .filter(notNullOrUndefined)\r\n .map(og => og.options)\r\n .reduce((flat, o) => [...flat, ...o], []);\r\n const variants = this.generatedVariants\r\n .filter(v => v.enabled && !v.existing)\r\n .map(v => {\r\n const optionIds = groups.map((group, index) => {\r\n const option = group.options.find(o => o.name === v.options[index].name);\r\n if (option) {\r\n return option.id;\r\n } else {\r\n throw new Error(`Could not find a matching option for group ${group.name}`);\r\n }\r\n });\r\n return {\r\n price: v.price,\r\n sku: v.sku,\r\n stock: v.stock,\r\n optionIds,\r\n };\r\n });\r\n return this.productDetailService.createProductVariants(\r\n this.product,\r\n variants,\r\n options,\r\n this.languageCode,\r\n );\r\n }\r\n\r\n private deleteObsoleteVariants<T>(input: T): Observable<T | T[]> {\r\n const obsoleteVariants = this.getObsoleteVariants();\r\n if (obsoleteVariants.length) {\r\n const deleteOperations = obsoleteVariants.map(v =>\r\n this.dataService.product.deleteProductVariant(v.id).pipe(map(() => input)),\r\n );\r\n return forkJoin(...deleteOperations);\r\n } else {\r\n return of(input);\r\n }\r\n }\r\n\r\n private reFetchProduct<T>(input: T): Observable<T> {\r\n // Re-fetch the Product to force an update to the view.\r\n const id = this.route.snapshot.paramMap.get('id');\r\n if (id) {\r\n return this.dataService.product.getProduct(id).single$.pipe(map(() => input));\r\n } else {\r\n return of(input);\r\n }\r\n }\r\n\r\n initOptionsAndVariants() {\r\n this.dataService.product\r\n // tslint:disable-next-line:no-non-null-assertion\r\n .getProductVariantsOptions(this.route.snapshot.paramMap.get('id')!)\r\n // tslint:disable-next-line:no-non-null-assertion\r\n .mapSingle(({ product }) => product!)\r\n .subscribe(p => {\r\n this.product = p;\r\n const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();\r\n const allUsedOptionGroupIds = p.variants\r\n .map(v => v.options.map(option => option.groupId))\r\n .flat();\r\n this.optionGroups = p.optionGroups.map(og => {\r\n return {\r\n id: og.id,\r\n isNew: false,\r\n name: og.name,\r\n locked: allUsedOptionGroupIds.includes(og.id),\r\n values: og.options.map(o => ({\r\n id: o.id,\r\n name: o.name,\r\n locked: allUsedOptionIds.includes(o.id),\r\n })),\r\n };\r\n });\r\n this.generateVariants();\r\n });\r\n }\r\n\r\n private optionsAreEqual(a: Array<{ name: string }>, b: Array<{ name: string }>): boolean {\r\n return this.toOptionString(a) === this.toOptionString(b);\r\n }\r\n\r\n private optionsAreSubset(a: Array<{ name: string }>, b: Array<{ name: string }>): boolean {\r\n return this.toOptionString(b).includes(this.toOptionString(a));\r\n }\r\n\r\n private toOptionString(o: Array<{ name: string }>): string {\r\n return o\r\n .map(x => x.name)\r\n .sort()\r\n .join('|');\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(!formValueChanged && !optionsChanged) || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(i, $event.name)\"\r\n (remove)=\"removeOption(i, $event)\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button\r\n [disabled]=\"group.locked\"\r\n class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td class=\"left\">\r\n <clr-checkbox-wrapper *ngIf=\"!variant.existing\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n <label>{{ 'common.create' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId, variant.options)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AssetFragment, AssetType, BaseEntityResolver, DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AssetResolver extends BaseEntityResolver<AssetFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Asset' as const,\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n type: AssetType.IMAGE,\r\n fileSize: 0,\r\n mimeType: '',\r\n width: 0,\r\n height: 0,\r\n source: '',\r\n preview: '',\r\n focalPoint: null,\r\n },\r\n id => dataService.product.getAsset(id).mapStream(data => data.asset),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n BaseEntityResolver,\r\n CollectionFragment,\r\n DataService,\r\n getDefaultUiLanguage,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CollectionResolver extends BaseEntityResolver<CollectionFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Collection' as 'Collection',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n languageCode: getDefaultUiLanguage(),\r\n name: '',\r\n slug: '',\r\n isPrivate: false,\r\n breadcrumbs: [],\r\n description: '',\r\n featuredAsset: null,\r\n assets: [],\r\n translations: [],\r\n inheritFilters: true,\r\n filters: [],\r\n parent: {} as any,\r\n children: null,\r\n },\r\n id => dataService.collection.getCollection(id).mapStream(data => data.collection),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n BaseEntityResolver,\r\n DataService,\r\n FacetWithValuesFragment,\r\n getDefaultUiLanguage,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FacetResolver extends BaseEntityResolver<FacetWithValuesFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Facet' as 'Facet',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n isPrivate: false,\r\n languageCode: getDefaultUiLanguage(),\r\n name: '',\r\n code: '',\r\n translations: [],\r\n values: [],\r\n },\r\n id => dataService.facet.getFacet(id).mapStream(data => data.facet),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n BaseEntityResolver,\r\n DataService,\r\n getDefaultUiLanguage,\r\n GetProductWithVariantsQuery,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductResolver extends BaseEntityResolver<GetProductWithVariantsQuery['product']> {\r\n constructor(dataService: DataService, router: Router) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Product' as 'Product',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n enabled: true,\r\n languageCode: getDefaultUiLanguage(),\r\n name: '',\r\n slug: '',\r\n featuredAsset: null,\r\n assets: [],\r\n description: '',\r\n translations: [],\r\n optionGroups: [],\r\n facetValues: [],\r\n variantList: { items: [], totalItems: 0 },\r\n channels: [],\r\n },\r\n id =>\r\n dataService.product\r\n .getProduct(id, { take: 10 })\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.product),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver } from '@vendure/admin-ui/core';\r\nimport { GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductVariantsResolver extends BaseEntityResolver<GetProductVariantOptionsQuery['product']> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Product' as 'Product',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n optionGroups: [],\r\n variants: [],\r\n },\r\n id => dataService.product.getProductVariantsOptions(id).mapStream(data => data.product),\r\n );\r\n }\r\n}\r\n","import { Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n AssetFragment,\r\n CanDeactivateDetailGuard,\r\n CollectionFragment,\r\n createResolveData,\r\n detailBreadcrumb,\r\n FacetWithValuesFragment,\r\n GetProductWithVariantsQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\r\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\r\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\r\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\r\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\r\nimport { ProductListComponent } from './components/product-list/product-list.component';\r\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { AssetResolver } from './providers/routing/asset-resolver';\r\nimport { CollectionResolver } from './providers/routing/collection-resolver';\r\nimport { FacetResolver } from './providers/routing/facet-resolver';\r\nimport { ProductResolver } from './providers/routing/product-resolver';\r\nimport { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\r\n\r\nexport const catalogRoutes: Route[] = [\r\n {\r\n path: 'products',\r\n component: ProductListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.products'),\r\n },\r\n },\r\n {\r\n path: 'products/:id',\r\n component: ProductDetailComponent,\r\n resolve: createResolveData(ProductResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'products/:id/manage-variants',\r\n component: ProductVariantsEditorComponent,\r\n resolve: createResolveData(ProductVariantsResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productVariantEditorBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'products/:id/options',\r\n component: ProductOptionsEditorComponent,\r\n resolve: createResolveData(ProductVariantsResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productOptionsEditorBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'facets',\r\n component: FacetListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.facets'),\r\n },\r\n },\r\n {\r\n path: 'facets/:id',\r\n component: FacetDetailComponent,\r\n resolve: createResolveData(FacetResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: facetBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'collections',\r\n component: CollectionListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.collections'),\r\n },\r\n },\r\n {\r\n path: 'collections/:id',\r\n component: CollectionDetailComponent,\r\n resolve: createResolveData(CollectionResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: collectionBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'assets',\r\n component: AssetListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.assets'),\r\n },\r\n },\r\n {\r\n path: 'assets/:id',\r\n component: AssetDetailComponent,\r\n resolve: createResolveData(AssetResolver),\r\n data: {\r\n breadcrumb: assetBreadcrumb,\r\n },\r\n },\r\n];\r\n\r\nexport function productBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<NonNullable<GetProductWithVariantsQuery['product']>>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.products',\r\n getName: product => product.name,\r\n route: 'products',\r\n });\r\n}\r\n\r\nexport function productVariantEditorBreadcrumb(data: any, params: any) {\r\n return data.entity.pipe(\r\n map((entity: any) => {\r\n return [\r\n {\r\n label: _('breadcrumb.products'),\r\n link: ['../', 'products'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'products', params.id, { tab: 'variants' }],\r\n },\r\n {\r\n label: _('breadcrumb.manage-variants'),\r\n link: ['manage-variants'],\r\n },\r\n ];\r\n }),\r\n );\r\n}\r\n\r\nexport function productOptionsEditorBreadcrumb(data: any, params: any) {\r\n return data.entity.pipe(\r\n map((entity: any) => {\r\n return [\r\n {\r\n label: _('breadcrumb.products'),\r\n link: ['../', 'products'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'products', params.id, { tab: 'variants' }],\r\n },\r\n {\r\n label: _('breadcrumb.product-options'),\r\n link: ['options'],\r\n },\r\n ];\r\n }),\r\n );\r\n}\r\n\r\nexport function facetBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<FacetWithValuesFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.facets',\r\n getName: facet => facet.name,\r\n route: 'facets',\r\n });\r\n}\r\n\r\nexport function collectionBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<CollectionFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.collections',\r\n getName: collection => collection.name,\r\n route: 'collections',\r\n });\r\n}\r\n\r\nexport function assetBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<AssetFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.assets',\r\n getName: asset => asset.name,\r\n route: 'assets',\r\n });\r\n}\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { DataService, Dialog, GetChannelsQuery, ItemOf, NotificationService } from '@vendure/admin-ui/core';\r\nimport { combineLatest } from 'rxjs';\r\n\r\ntype Channel = GetChannelsQuery['channels'][number];\r\n\r\n@Component({\r\n selector: 'vdr-assign-to-channel-dialog',\r\n templateUrl: './assign-to-channel-dialog.component.html',\r\n styleUrls: ['./assign-to-channel-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssignToChannelDialogComponent implements OnInit, Dialog<Channel> {\r\n selectedChannel: Channel | null | undefined;\r\n currentChannel: Channel;\r\n availableChannels: Channel[];\r\n resolveWith: (result?: Channel) => void;\r\n selectedChannelIdControl = new FormControl();\r\n\r\n // assigned by ModalService.fromComponent() call\r\n\r\n constructor(private dataService: DataService, private notificationService: NotificationService) {}\r\n\r\n ngOnInit() {\r\n const activeChannelId$ = this.dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n const allChannels$ = this.dataService.settings.getChannels().mapSingle(data => data.channels);\r\n\r\n combineLatest(activeChannelId$, allChannels$).subscribe(([activeChannelId, channels]) => {\r\n // tslint:disable-next-line:no-non-null-assertion\r\n this.currentChannel = channels.find(c => c.id === activeChannelId)!;\r\n this.availableChannels = channels;\r\n });\r\n\r\n this.selectedChannelIdControl.valueChanges.subscribe(ids => {\r\n this.selectChannel(ids);\r\n });\r\n }\r\n\r\n selectChannel(channelIds: string[]) {\r\n this.selectedChannel = this.availableChannels.find(c => c.id === channelIds[0]);\r\n }\r\n\r\n assign() {\r\n const selectedChannel = this.selectedChannel;\r\n if (selectedChannel) {\r\n this.resolveWith(selectedChannel);\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.assign-to-channel' | translate }}\r\n</ng-template>\r\n<clr-input-container class=\"mb4\">\r\n <label>{{ 'common.channel' | translate }}</label>\r\n <vdr-channel-assignment-control\r\n clrInput\r\n [multiple]=\"false\"\r\n [includeDefaultChannel]=\"false\"\r\n [formControl]=\"selectedChannelIdControl\"\r\n ></vdr-channel-assignment-control>\r\n</clr-input-container>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"assign()\" [disabled]=\"!selectedChannel\" class=\"btn btn-primary\">\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.assign-to-named-channel' | translate: { channelCode: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </button>\r\n</ng-template>\r\n","import { gql } from 'apollo-angular';\r\n\r\nexport const GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS = gql`\r\n query GetProductsWithFacetValuesByIds($ids: [String!]!) {\r\n products(options: { filter: { id: { in: $ids } } }) {\r\n items {\r\n id\r\n name\r\n facetValues {\r\n id\r\n name\r\n code\r\n facet {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_VARIANTS_WITH_FACET_VALUES_BY_IDS = gql`\r\n query GetVariantsWithFacetValuesByIds($ids: [String!]!) {\r\n productVariants(options: { filter: { id: { in: $ids } } }) {\r\n items {\r\n id\r\n name\r\n sku\r\n facetValues {\r\n id\r\n name\r\n code\r\n facet {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const UPDATE_PRODUCTS_BULK = gql`\r\n mutation UpdateProductsBulk($input: [UpdateProductInput!]!) {\r\n updateProducts(input: $input) {\r\n id\r\n name\r\n facetValues {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const UPDATE_VARIANTS_BULK = gql`\r\n mutation UpdateVariantsBulk($input: [UpdateProductVariantInput!]!) {\r\n updateProductVariants(input: $input) {\r\n id\r\n name\r\n facetValues {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n`;\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n DataService,\r\n Dialog,\r\n FacetWithValuesFragment,\r\n GetProductsWithFacetValuesByIdsQuery,\r\n GetProductsWithFacetValuesByIdsQueryVariables,\r\n GetVariantsWithFacetValuesByIdsQuery,\r\n UpdateProductsBulkMutation,\r\n UpdateProductsBulkMutationVariables,\r\n UpdateVariantsBulkMutation,\r\n UpdateVariantsBulkMutationVariables,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { shareReplay, switchMap } from 'rxjs/operators';\r\n\r\nimport {\r\n GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS,\r\n GET_VARIANTS_WITH_FACET_VALUES_BY_IDS,\r\n UPDATE_PRODUCTS_BULK,\r\n UPDATE_VARIANTS_BULK,\r\n} from './bulk-add-facet-values-dialog.graphql';\r\n\r\ninterface ProductOrVariant {\r\n id: string;\r\n name: string;\r\n sku?: string;\r\n facetValues: Array<{\r\n id: string;\r\n name: string;\r\n code: string;\r\n facet: Array<{\r\n id: string;\r\n name: string;\r\n code: string;\r\n }>;\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-bulk-add-facet-values-dialog',\r\n templateUrl: './bulk-add-facet-values-dialog.component.html',\r\n styleUrls: ['./bulk-add-facet-values-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BulkAddFacetValuesDialogComponent\r\n implements OnInit, OnDestroy, Dialog<FacetWithValuesFragment[]>\r\n{\r\n resolveWith: (result?: FacetWithValuesFragment[]) => void;\r\n /* provided by call to ModalService */\r\n mode: 'product' | 'variant' = 'product';\r\n ids?: string[];\r\n facets: FacetWithValuesFragment[] = [];\r\n state: 'loading' | 'ready' | 'saving' = 'loading';\r\n\r\n selectedValues: FacetWithValuesFragment[] = [];\r\n items: ProductOrVariant[] = [];\r\n facetValuesRemoved = false;\r\n private subscription: Subscription;\r\n constructor(private dataService: DataService, private changeDetectorRef: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n const fetchData$: Observable<any> =\r\n this.mode === 'product'\r\n ? this.dataService\r\n .query<\r\n GetProductsWithFacetValuesByIdsQuery,\r\n GetProductsWithFacetValuesByIdsQueryVariables\r\n >(GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS, {\r\n ids: this.ids ?? [],\r\n })\r\n .mapSingle(({ products }) =>\r\n products.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\r\n )\r\n : this.dataService\r\n .query<\r\n GetVariantsWithFacetValuesByIdsQuery,\r\n GetProductsWithFacetValuesByIdsQueryVariables\r\n >(GET_VARIANTS_WITH_FACET_VALUES_BY_IDS, {\r\n ids: this.ids ?? [],\r\n })\r\n .mapSingle(({ productVariants }) =>\r\n productVariants.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\r\n );\r\n this.subscription = fetchData$.subscribe({\r\n next: items => {\r\n this.items = items;\r\n this.state = 'ready';\r\n this.changeDetectorRef.markForCheck();\r\n },\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription?.unsubscribe();\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n removeFacetValue(item: ProductOrVariant, facetValueId: string) {\r\n item.facetValues = item.facetValues.filter(fv => fv.id !== facetValueId);\r\n this.facetValuesRemoved = true;\r\n }\r\n\r\n addFacetValues() {\r\n const selectedFacetValueIds = this.selectedValues.map(sv => sv.id);\r\n this.state = 'saving';\r\n const save$: Observable<any> =\r\n this.mode === 'product'\r\n ? this.dataService.mutate<UpdateProductsBulkMutation, UpdateProductsBulkMutationVariables>(\r\n UPDATE_PRODUCTS_BULK,\r\n {\r\n input: this.items?.map(product => ({\r\n id: product.id,\r\n facetValueIds: unique([\r\n ...product.facetValues.map(fv => fv.id),\r\n ...selectedFacetValueIds,\r\n ]),\r\n })),\r\n },\r\n )\r\n : this.dataService.mutate<UpdateVariantsBulkMutation, UpdateVariantsBulkMutationVariables>(\r\n UPDATE_VARIANTS_BULK,\r\n {\r\n input: this.items?.map(product => ({\r\n id: product.id,\r\n facetValueIds: unique([\r\n ...product.facetValues.map(fv => fv.id),\r\n ...selectedFacetValueIds,\r\n ]),\r\n })),\r\n },\r\n );\r\n return save$.subscribe(result => {\r\n this.resolveWith(this.selectedValues);\r\n });\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.edit-facet-values' | translate }}\r\n</ng-template>\r\n\r\n<div class=\"flex\">\r\n <div class=\"flex center\">\r\n <div class=\"mr2\">\r\n {{ 'catalog.add-facet-value' | translate }}\r\n </div>\r\n <vdr-facet-value-selector\r\n [facets]=\"facets\"\r\n (selectedValuesChange)=\"selectedValues = $event\"\r\n ></vdr-facet-value-selector>\r\n </div>\r\n</div>\r\n\r\n<table class=\"table\" *ngIf=\"state !== 'loading'; else placeholder\">\r\n <tbody>\r\n <tr *ngFor=\"let item of items\">\r\n <td class=\"left align-middle\">\r\n <div>{{ item.name }}</div>\r\n <div *ngIf=\"item.sku\" class=\"sku\">{{ item.sku }}</div>\r\n </td>\r\n <td class=\"left\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of item.facetValues\"\r\n [facetValue]=\"facetValue\"\r\n (remove)=\"removeFacetValue(item, facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n\r\n<ng-template #placeholder>\r\n <div class=\"loading\">\r\n <clr-spinner></clr-spinner>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"addFacetValues()\"\r\n [disabled]=\"selectedValues.length === 0 && facetValuesRemoved === false\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n currentChannelIsNotDefault,\r\n DataService,\r\n DeletionResult,\r\n getChannelCodeFromUserStatus,\r\n isMultiChannel,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, from, of } from 'rxjs';\r\nimport { mapTo, switchMap } from 'rxjs/operators';\r\n\r\nimport { AssignToChannelDialogComponent } from '../assign-to-channel-dialog/assign-to-channel-dialog.component';\r\nimport { CollectionPartial } from '../collection-tree/collection-tree.types';\r\n\r\nimport { CollectionListComponent } from './collection-list.component';\r\n\r\nexport const deleteCollectionsBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\r\n location: 'collection-list',\r\n label: _('common.delete'),\r\n icon: 'trash',\r\n iconClass: 'is-danger',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCollection) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n\r\n modalService\r\n .dialog({\r\n title: _('catalog.confirm-bulk-delete-collections'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? dataService.collection.deleteCollections(unique(selection.map(c => c.id)))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(result => {\r\n let deleted = 0;\r\n const errors: string[] = [];\r\n for (const item of result.deleteCollections) {\r\n if (item.result === DeletionResult.DELETED) {\r\n deleted++;\r\n } else if (item.message) {\r\n errors.push(item.message);\r\n }\r\n }\r\n if (0 < deleted) {\r\n notificationService.success(_('catalog.notify-bulk-delete-collections-success'), {\r\n count: deleted,\r\n });\r\n }\r\n if (0 < errors.length) {\r\n notificationService.error(errors.join('\\n'));\r\n }\r\n hostComponent.refresh();\r\n clearSelection();\r\n });\r\n },\r\n};\r\n\r\nexport const assignCollectionsToChannelBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\r\n location: 'collection-list',\r\n label: _('catalog.assign-to-channel'),\r\n icon: 'layers',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .fromComponent(AssignToChannelDialogComponent, {\r\n size: 'md',\r\n locals: {},\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return dataService.collection\r\n .assignCollectionsToChannel({\r\n collectionIds: selection.map(c => c.id),\r\n channelId: result.id,\r\n })\r\n .pipe(mapTo(result));\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n notificationService.success(_('catalog.assign-collections-to-channel-success'), {\r\n count: selection.length,\r\n channelCode: result.code,\r\n });\r\n clearSelection();\r\n });\r\n },\r\n};\r\n\r\nexport const removeCollectionsFromChannelBulkAction: BulkAction<CollectionPartial, CollectionListComponent> =\r\n {\r\n location: 'collection-list',\r\n label: _('catalog.remove-from-channel'),\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateChannel) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getTranslationVars: ({ injector }) => getChannelCodeFromUserStatus(injector.get(DataService)),\r\n icon: 'layers',\r\n iconClass: 'is-warning',\r\n isVisible: ({ injector }) => currentChannelIsNotDefault(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n const activeChannelId$ = dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n\r\n from(getChannelCodeFromUserStatus(injector.get(DataService)))\r\n .pipe(\r\n switchMap(({ channelCode }) =>\r\n modalService.dialog({\r\n title: _('catalog.remove-from-channel'),\r\n translationVars: {\r\n channelCode,\r\n },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: _('common.remove'),\r\n returnValue: true,\r\n },\r\n ],\r\n }),\r\n ),\r\n switchMap(res =>\r\n res\r\n ? activeChannelId$.pipe(\r\n switchMap(activeChannelId =>\r\n activeChannelId\r\n ? dataService.collection.removeCollectionsFromChannel({\r\n channelId: activeChannelId,\r\n collectionIds: selection.map(c => c.id),\r\n })\r\n : EMPTY,\r\n ),\r\n mapTo(true),\r\n )\r\n : of(false),\r\n ),\r\n )\r\n .subscribe(removed => {\r\n if (removed) {\r\n clearSelection();\r\n notificationService.success(\r\n _('catalog.notify-remove-collections-from-channel-success'),\r\n {\r\n count: selection.length,\r\n },\r\n );\r\n hostComponent.refresh();\r\n }\r\n });\r\n },\r\n };\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n currentChannelIsNotDefault,\r\n DataService,\r\n DeletionResult,\r\n getChannelCodeFromUserStatus,\r\n GetFacetListQuery,\r\n isMultiChannel,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, of } from 'rxjs';\r\nimport { map, mapTo, switchMap } from 'rxjs/operators';\r\n\r\nimport { AssignToChannelDialogComponent } from '../assign-to-channel-dialog/assign-to-channel-dialog.component';\r\n\r\nimport { FacetListComponent } from './facet-list.component';\r\n\r\nexport const deleteFacetsBulkAction: BulkAction<ItemOf<GetFacetListQuery, 'facets'>, FacetListComponent> = {\r\n location: 'facet-list',\r\n label: _('common.delete'),\r\n icon: 'trash',\r\n iconClass: 'is-danger',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteFacet) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n\r\n function showModalAndDelete(facetIds: string[], message?: string) {\r\n return modalService\r\n .dialog({\r\n title: _('catalog.confirm-bulk-delete-facets'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n size: message ? 'lg' : 'md',\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: message ? _('common.force-delete') : _('common.delete'),\r\n returnValue: true,\r\n },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res =>\r\n res\r\n ? dataService.facet\r\n .deleteFacets(facetIds, !!message)\r\n .pipe(map(res2 => res2.deleteFacets))\r\n : of([]),\r\n ),\r\n );\r\n }\r\n\r\n showModalAndDelete(unique(selection.map(f => f.id)))\r\n .pipe(\r\n switchMap(result => {\r\n let deletedCount = 0;\r\n const errors: string[] = [];\r\n const errorIds: string[] = [];\r\n let i = 0;\r\n for (const item of result) {\r\n if (item.result === DeletionResult.DELETED) {\r\n deletedCount++;\r\n } else if (item.message) {\r\n errors.push(item.message);\r\n errorIds.push(selection[i]?.id);\r\n }\r\n i++;\r\n }\r\n if (0 < errorIds.length) {\r\n return showModalAndDelete(errorIds, errors.join('\\n')).pipe(\r\n map(result2 => {\r\n const deletedCount2 = result2.filter(\r\n r => r.result === DeletionResult.DELETED,\r\n ).length;\r\n return deletedCount + deletedCount2;\r\n }),\r\n );\r\n } else {\r\n return of(deletedCount);\r\n }\r\n }),\r\n )\r\n .subscribe(deletedCount => {\r\n if (deletedCount) {\r\n hostComponent.refresh();\r\n clearSelection();\r\n notificationService.success(_('catalog.notify-bulk-delete-facets-success'), {\r\n count: deletedCount,\r\n });\r\n }\r\n });\r\n },\r\n};\r\n\r\nexport const assignFacetsToChannelBulkAction: BulkAction<\r\n ItemOf<GetFacetListQuery, 'facets'>,\r\n FacetListComponent\r\n> = {\r\n location: 'facet-list',\r\n label: _('catalog.assign-to-channel'),\r\n icon: 'layers',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateFacet) ||\r\n userPermissions.includes(Permission.UpdateCatalog),\r\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .fromComponent(AssignToChannelDialogComponent, {\r\n size: 'md',\r\n locals: {},\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return dataService.facet\r\n .assignFacetsToChannel({\r\n facetIds: selection.map(f => f.id),\r\n channelId: result.id,\r\n })\r\n .pipe(mapTo(result));\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n notificationService.success(_('catalog.assign-facets-to-channel-success'), {\r\n count: selection.length,\r\n channelCode: result.code,\r\n });\r\n clearSelection();\r\n });\r\n },\r\n};\r\n\r\nexport const removeFacetsFromChannelBulkAction: BulkAction<\r\n ItemOf<GetFacetListQuery, 'facets'>,\r\n FacetListComponent\r\n> = {\r\n location: 'facet-list',\r\n label: _('catalog.remove-from-channel'),\r\n getTranslationVars: ({ injector }) => getChannelCodeFromUserStatus(injector.get(DataService)),\r\n icon: 'layers',\r\n iconClass: 'is-warning',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateFacet) ||\r\n userPermissions.includes(Permission.UpdateCatalog),\r\n isVisible: ({ injector }) => currentChannelIsNotDefault(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n\r\n const activeChannelId$ = dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n\r\n function showModalAndDelete(facetIds: string[], message?: string) {\r\n return modalService\r\n .dialog({\r\n title: _('catalog.remove-from-channel'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n size: message ? 'lg' : 'md',\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: message ? _('common.force-remove') : _('common.remove'),\r\n returnValue: true,\r\n },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res =>\r\n res\r\n ? activeChannelId$.pipe(\r\n switchMap(activeChannelId =>\r\n activeChannelId\r\n ? dataService.facet.removeFacetsFromChannel({\r\n channelId: activeChannelId,\r\n facetIds,\r\n force: !!message,\r\n })\r\n : EMPTY,\r\n ),\r\n map(res2 => res2.removeFacetsFromChannel),\r\n )\r\n : EMPTY,\r\n ),\r\n );\r\n }\r\n\r\n showModalAndDelete(unique(selection.map(f => f.id)))\r\n .pipe(\r\n switchMap(result => {\r\n let removedCount = selection.length;\r\n const errors: string[] = [];\r\n const errorIds: string[] = [];\r\n let i = 0;\r\n for (const item of result) {\r\n if (item.__typename === 'FacetInUseError') {\r\n errors.push(item.message);\r\n errorIds.push(selection[i]?.id);\r\n removedCount--;\r\n }\r\n i++;\r\n }\r\n if (0 < errorIds.length) {\r\n return showModalAndDelete(errorIds, errors.join('\\n')).pipe(\r\n map(result2 => {\r\n const notRemovedCount = result2.filter(\r\n r => r.__typename === 'FacetInUseError',\r\n ).length;\r\n return selection.length - notRemovedCount;\r\n }),\r\n );\r\n } else {\r\n return of(removedCount);\r\n }\r\n }),\r\n switchMap(removedCount =>\r\n removedCount\r\n ? getChannelCodeFromUserStatus(dataService).then(({ channelCode }) => ({\r\n channelCode,\r\n removedCount,\r\n }))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(({ removedCount, channelCode }) => {\r\n if (removedCount) {\r\n hostComponent.refresh();\r\n clearSelection();\r\n notificationService.success(_('catalog.notify-remove-facets-from-channel-success'), {\r\n count: removedCount,\r\n channelCode,\r\n });\r\n }\r\n });\r\n },\r\n};\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n currentChannelIsNotDefault,\r\n DataService,\r\n DeletionResult,\r\n getChannelCodeFromUserStatus,\r\n isMultiChannel,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, from, of } from 'rxjs';\r\nimport { mapTo, switchMap } from 'rxjs/operators';\r\n\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { BulkAddFacetValuesDialogComponent } from '../bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\r\n\r\nimport { ProductListComponent, SearchItem } from './product-list.component';\r\n\r\nexport const deleteProductsBulkAction: BulkAction<SearchItem, ProductListComponent> = {\r\n location: 'product-list',\r\n label: _('common.delete'),\r\n icon: 'trash',\r\n iconClass: 'is-danger',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteProduct) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .dialog({\r\n title: _('catalog.confirm-bulk-delete-products'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? dataService.product.deleteProducts(unique(selection.map(p => p.productId)))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(result => {\r\n let deleted = 0;\r\n const errors: string[] = [];\r\n for (const item of result.deleteProducts) {\r\n if (item.result === DeletionResult.DELETED) {\r\n deleted++;\r\n } else if (item.message) {\r\n errors.push(item.message);\r\n }\r\n }\r\n if (0 < deleted) {\r\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\r\n count: deleted,\r\n });\r\n }\r\n if (0 < errors.length) {\r\n notificationService.error(errors.join('\\n'));\r\n }\r\n hostComponent.refresh();\r\n clearSelection();\r\n });\r\n },\r\n};\r\n\r\nexport const assignProductsToChannelBulkAction: BulkAction<SearchItem, ProductListComponent> = {\r\n location: 'product-list',\r\n label: _('catalog.assign-to-channel'),\r\n icon: 'layers',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: unique(selection.map(p => p.productId)),\r\n currentChannelIds: [],\r\n },\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n clearSelection();\r\n }\r\n });\r\n },\r\n};\r\n\r\nexport const removeProductsFromChannelBulkAction: BulkAction<SearchItem, ProductListComponent> = {\r\n location: 'product-list',\r\n label: _('catalog.remove-from-channel'),\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateChannel) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getTranslationVars: ({ injector }) => getChannelCodeFromUserStatus(injector.get(DataService)),\r\n icon: 'layers',\r\n iconClass: 'is-warning',\r\n isVisible: ({ injector }) => currentChannelIsNotDefault(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n const activeChannelId$ = dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n\r\n from(getChannelCodeFromUserStatus(injector.get(DataService)))\r\n .pipe(\r\n switchMap(({ channelCode }) =>\r\n modalService.dialog({\r\n title: _('catalog.remove-from-channel'),\r\n translationVars: {\r\n channelCode,\r\n },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: _('common.remove'),\r\n returnValue: true,\r\n },\r\n ],\r\n }),\r\n ),\r\n switchMap(res =>\r\n res\r\n ? activeChannelId$.pipe(\r\n switchMap(activeChannelId =>\r\n activeChannelId\r\n ? dataService.product.removeProductsFromChannel({\r\n channelId: activeChannelId,\r\n productIds: selection.map(p => p.productId),\r\n })\r\n : EMPTY,\r\n ),\r\n mapTo(true),\r\n )\r\n : of(false),\r\n ),\r\n )\r\n .subscribe(removed => {\r\n if (removed) {\r\n clearSelection();\r\n notificationService.success(_('common.notify-remove-products-from-channel-success'), {\r\n count: selection.length,\r\n });\r\n setTimeout(() => hostComponent.refresh(), 1000);\r\n }\r\n });\r\n },\r\n};\r\n\r\nexport const assignFacetValuesToProductsBulkAction: BulkAction<SearchItem, ProductListComponent> = {\r\n location: 'product-list',\r\n label: _('catalog.edit-facet-values'),\r\n icon: 'tag',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n const mode: 'product' | 'variant' = hostComponent.groupByProduct ? 'product' : 'variant';\r\n const ids =\r\n mode === 'product'\r\n ? unique(selection.map(p => p.productId))\r\n : unique(selection.map(p => p.productVariantId));\r\n return dataService.facet\r\n .getAllFacets()\r\n .mapSingle(data => data.facets.items)\r\n .pipe(\r\n switchMap(facets =>\r\n modalService.fromComponent(BulkAddFacetValuesDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n facets,\r\n mode,\r\n ids,\r\n },\r\n }),\r\n ),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n notificationService.success(_('common.notify-bulk-update-success'), {\r\n count: selection.length,\r\n entity: mode === 'product' ? 'Products' : 'ProductVariants',\r\n });\r\n clearSelection();\r\n }\r\n });\r\n },\r\n};\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { BulkActionRegistryService, SharedModule } from '@vendure/admin-ui/core';\r\n\r\nimport { catalogRoutes } from './catalog.routes';\r\nimport { ApplyFacetDialogComponent } from './components/apply-facet-dialog/apply-facet-dialog.component';\r\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\r\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\r\nimport { AssetsComponent } from './components/assets/assets.component';\r\nimport { AssignProductsToChannelDialogComponent } from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { AssignToChannelDialogComponent } from './components/assign-to-channel-dialog/assign-to-channel-dialog.component';\r\nimport { BulkAddFacetValuesDialogComponent } from './components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\r\nimport { CollectionContentsComponent } from './components/collection-contents/collection-contents.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport {\r\n assignCollectionsToChannelBulkAction,\r\n deleteCollectionsBulkAction,\r\n removeCollectionsFromChannelBulkAction,\r\n} from './components/collection-list/collection-list-bulk-actions';\r\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\r\nimport { CollectionTreeNodeComponent } from './components/collection-tree/collection-tree-node.component';\r\nimport { CollectionTreeComponent } from './components/collection-tree/collection-tree.component';\r\nimport { ConfirmVariantDeletionDialogComponent } from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\r\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\r\nimport {\r\n assignFacetsToChannelBulkAction,\r\n deleteFacetsBulkAction,\r\n removeFacetsFromChannelBulkAction,\r\n} from './components/facet-list/facet-list-bulk-actions';\r\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\r\nimport { GenerateProductVariantsComponent } from './components/generate-product-variants/generate-product-variants.component';\r\nimport { OptionValueInputComponent } from './components/option-value-input/option-value-input.component';\r\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\r\nimport {\r\n assignFacetValuesToProductsBulkAction,\r\n assignProductsToChannelBulkAction,\r\n deleteProductsBulkAction,\r\n removeProductsFromChannelBulkAction,\r\n} from './components/product-list/product-list-bulk-actions';\r\nimport { ProductListComponent } from './components/product-list/product-list.component';\r\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { ProductVariantsListComponent } from './components/product-variants-list/product-variants-list.component';\r\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\r\nimport { UpdateProductOptionDialogComponent } from './components/update-product-option-dialog/update-product-option-dialog.component';\r\nimport { VariantPriceDetailComponent } from './components/variant-price-detail/variant-price-detail.component';\r\n\r\nconst CATALOG_COMPONENTS = [\r\n ProductListComponent,\r\n ProductDetailComponent,\r\n FacetListComponent,\r\n FacetDetailComponent,\r\n GenerateProductVariantsComponent,\r\n ProductVariantsListComponent,\r\n ApplyFacetDialogComponent,\r\n AssetListComponent,\r\n AssetsComponent,\r\n VariantPriceDetailComponent,\r\n CollectionListComponent,\r\n CollectionDetailComponent,\r\n CollectionTreeComponent,\r\n CollectionTreeNodeComponent,\r\n CollectionContentsComponent,\r\n ProductVariantsTableComponent,\r\n OptionValueInputComponent,\r\n UpdateProductOptionDialogComponent,\r\n ProductVariantsEditorComponent,\r\n AssignProductsToChannelDialogComponent,\r\n AssetDetailComponent,\r\n ConfirmVariantDeletionDialogComponent,\r\n ProductOptionsEditorComponent,\r\n BulkAddFacetValuesDialogComponent,\r\n AssignToChannelDialogComponent,\r\n];\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild(catalogRoutes)],\r\n exports: [...CATALOG_COMPONENTS],\r\n declarations: [...CATALOG_COMPONENTS],\r\n})\r\nexport class CatalogModule {\r\n constructor(private bulkActionRegistryService: BulkActionRegistryService) {\r\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignFacetsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeFacetsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteFacetsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignCollectionsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeCollectionsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteCollectionsBulkAction);\r\n }\r\n}\r\n","// This file was generated by the build-public-api.ts script\nexport * from './catalog.module';\nexport * from './catalog.routes';\nexport * from './components/apply-facet-dialog/apply-facet-dialog.component';\nexport * from './components/asset-detail/asset-detail.component';\nexport * from './components/asset-list/asset-list.component';\nexport * from './components/assets/assets.component';\nexport * from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\nexport * from './components/assign-to-channel-dialog/assign-to-channel-dialog.component';\nexport * from './components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\nexport * from './components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql';\nexport * from './components/collection-contents/collection-contents.component';\nexport * from './components/collection-detail/collection-detail.component';\nexport * from './components/collection-list/collection-list-bulk-actions';\nexport * from './components/collection-list/collection-list.component';\nexport * from './components/collection-tree/array-to-tree';\nexport * from './components/collection-tree/collection-tree-node.component';\nexport * from './components/collection-tree/collection-tree.component';\nexport * from './components/collection-tree/collection-tree.service';\nexport * from './components/collection-tree/collection-tree.types';\nexport * from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\nexport * from './components/facet-detail/facet-detail.component';\nexport * from './components/facet-list/facet-list-bulk-actions';\nexport * from './components/facet-list/facet-list.component';\nexport * from './components/generate-product-variants/generate-product-variants.component';\nexport * from './components/option-value-input/option-value-input.component';\nexport * from './components/product-detail/product-detail.component';\nexport * from './components/product-detail/product-detail.types';\nexport * from './components/product-list/product-list-bulk-actions';\nexport * from './components/product-list/product-list.component';\nexport * from './components/product-options-editor/product-options-editor.component';\nexport * from './components/product-variants-editor/product-variants-editor.component';\nexport * from './components/product-variants-list/product-variants-list.component';\nexport * from './components/product-variants-table/product-variants-table.component';\nexport * from './components/update-product-option-dialog/update-product-option-dialog.component';\nexport * from './components/variant-price-detail/variant-price-detail.component';\nexport * from './providers/product-detail/product-detail.service';\nexport * from './providers/product-detail/replace-last';\nexport * from './providers/routing/asset-resolver';\nexport * from './providers/routing/collection-resolver';\nexport * from './providers/routing/facet-resolver';\nexport * from './providers/routing/product-resolver';\nexport * from './providers/routing/product-variants-resolver';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["_","SortOrder"],"mappings":"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"}
|